<![CDATA[Latest posts for the topic "[Thảo luận] Lỗi ở đâu và đây là lỗi gì !?"]]> /hvaonline/posts/list/12.html JForum - http://www.jforum.net [Thảo luận] Lỗi ở đâu và đây là lỗi gì !? (1). Cách đây vài ngày, có dịp ngó sơ qua nó lần nữa thì thấy nó lại có bug. Bug lần này nằm tại file sendpm.php (có thể các file khác vẫn có bug, nhưng QVT ko có thời gian để mò tiếp). Đây là source code của nó: Code:
<?php
/***************************************************************************
 *                            sendpm.php  - PBLang
 *                            -------------------
 *
 *                  see docs/copyright.txt for more details
 *
 *			Last modified 1 March 2005
 ***************************************************************************/

require('header.php');
include($dbpath."/settings/styles/styles.php");
include_once("functions.php");

$liusername=$_COOKIE[$cookieid];
$permit=CheckLoginStatus($liusername,"1","0");
if ($permit=="1") {
	$language=SetLanguage($liusername);
	include($temppath."/pb/language/lang_".$language.".php");
	$reg=$_GET['id'];
	writeheader($newestm,0,0,0,$liusername,"1",$SendPM);
	if ($reg!="2") {
		if (isset($_GET['num']) && strlen($_GET['num'])< 8){
			$num=$_GET['num'];
		}else{
			$num='';
		}
		if (isset($_GET['to']) && strlen($_GET['to'])< 26){
			$to=$_GET['to'];
		}else{
			$to='';
		}
		$subj=strip_tags(stripslashes($_GET['subj']));
		$msg=strip_tags(stripslashes($_GET['msg']));
		$orgp=strip_tags(stripslashes($_GET['orig']));
		$orgp=str_replace('/','',$orgp);		//make sure no other URL is being used
		$orgp=str_replace(chr(92),'',$orgp);		//make sure no other URL is being used
		$pmstat="3";
		$fp = fopen($dbpath."/pm/".$liusername."_".$num."_pmstat", "w");
		fputs($fp, $pmstat);
		fclose($fp);
//          sendpm($to,$subj,$msg,$orgp,$liusername);
		if (trim($orgp)!=''){
			$filename=$dbpath.'/pm/'.$orgp;
			if (file_exists($filename)){
				$fd=@fopen($filename,"r");
				$rmsg=@fread($fd,filesize($filename));
				@fclose($fd);
			}else{
				$rmsg='';
			}
		}else{
			$rmsg='';
		}
		$form_tag="\n";
		$form_tag.='<form action="sendpm.php?id=2" method="POST" target="'.$frameset.'">'."\n";
		WriteTableTop($form_tag);
		echo "<tr><td bgcolor=\"$headercolor\" height=\"15\" background=\"$headergif\" colspan=\"2\">";
		echo "<a href=\"index.php\">$sitetitle</a> :: <a href=\"sendpm.php\">$PrivateMessaging</a> :: $VSendMessage</td></tr>";
		echo "<tr><td class=\"subheader\" colspan=\"2\"><a href=\"pm.php\">$VInbox</a>";
		echo " :: <a href=\"sendpm.php\">$VSendPM</a></td></tr>";
		if ($rmsg){
			echo "<tr><td bgcolor=\"$fmenucolor\" height=\"15\" colspan=\"2\">";
			echo "$VOriginalPM $VFrom <b>$to</b>:<br><br>$rmsg<br></td></tr>";
			echo "<tr>";
		}
		echo "<td height=\"5\" align=\"right\" bgcolor=\"$fmenucolor\" width=\"18%\"><p>$VTo:</p></td>";
		echo "<td height=\"5\" bgcolor=\"$menucolor\" width=\"82%\"><input type=\"text\" name=\"to\" value=\"$to\"></td></tr>";
		echo "<tr bgcolor=\"$subheadercolor\" valign=\"top\"><td height=\"5\" align=\"right\" bgcolor=\"$fmenucolor\" width=\"18%\"><p>$VSubject:</p></td>";
		echo "<td height=\"5\" bgcolor=\"$menucolor\" width=\"82%\"><input type=\"text\" name=\"subj\" value=\"$subj\"></td></tr>";
		echo "<tr bgcolor=\"$subheadercolor\" valign=\"top\"><td height=\"15\" align=\"right\" bgcolor=\"$fmenucolor\" width=\"18%\">$VMessage:</td>";
		echo "<td height=\"15\" bgcolor=\"$menucolor\" width=\"82%\"><textarea name=\"msg\" cols=\"60\" rows=\"10\">$msg</textarea></td></tr>";
		echo "<tr bgcolor=\"$subheadercolor\" valign=\"top\"><td height=\"15\" align=\"right\" bgcolor=\"$fmenucolor\" width=\"18%\"> </td>";
		echo "<td height=\"15\" bgcolor=\"$menucolor\" width=\"82%\"><input type=\"submit\" name=\"Submit\" value=\"$VSubmit\">";
		sbot(1);
	} else {
		$to=strip_tags($_POST['to']);
		$msg=strip_tags(stripslashes($_POST['msg']));
		$subj=strip_tags(stripslashes($_POST['subj']));
		$pmstat="1";
		if (trim($to)=="") {
			ErrorMessage($AuthorRequired,$liusername);
		} else {
			$filet=$dbpath."/pm/".$to;
			if (file_exists($filet)) {
				$filename = "$dbpath/pm/$to"."_tot";
				if (!file_exists($filename))
						{$filename=str_replace("_"," ",$filename);}
				$fd = fopen ($filename, "r");
				$num = fread ($fd, filesize ($filename));
				fclose ($fd);
				$num++;
				$fp = fopen("$dbpath/pm/$to"."_tot", "w");
				fputs($fp, $num);
				fclose($fp);
				$filename = "$dbpath/pm/$to";
				$fd = fopen ($filename, "r");
				$num = fread ($fd, filesize ($filename));
				fclose ($fd);
				$num++;
				$fp = fopen("$dbpath/pm/$to", "w");
				fputs($fp, $num);
				fclose($fp);

				setlocale(LC_TIME,$LangLocale);
				$date = time()+($timezone*3600);
				$fp = fopen("$dbpath/pm/$to"."_$num"."_a", "w");
				fputs($fp, $liusername);
				fclose($fp);
				$fp = fopen("$dbpath/pm/$to"."_$num"."_d", "w");
				fputs($fp, $date);
				fclose($fp);
				$fp = fopen("$dbpath/pm/$to"."_$num"."_c", "w");
				if ($msg==''){
					$msg='-- '.$VEmpty.' --';
				}
				fputs($fp, $msg);
				fclose($fp);
				$fp = fopen("$dbpath/pm/$to"."_$num"."_s", "w");
				fputs($fp, $subj);
				fclose($fp);
				$fp = fopen("$dbpath/pm/$to"."_$num"."_pmstat", "w");
				fputs($fp, $pmstat);
				fclose($fp);
				msg($VSent,"$MessageSent!");
//				echo "<meta http-equiv=\"Refresh\" content=\"0; URL=pm.php\">";
			} else {
					ErrorMessage($InvalidUsername,$liusername);
			}
		}
	}
	writefooter($newestm);
}else{
     include("login.php");
}
ob_end_flush();
?>
Xin mời mọi người cùng thảo luận xem: Lỗi ở đâu và đây là lỗi gì. Cuối cùng là nguyên nhân chính phát sinh ra lỗi cùng với cách khắc phục nó. (1): PBLang Forum là 1 sản phẩm của Dr. Martinus (Download tại: http://sourceforge.net/projects/pblang/). Đây là 1 source code diễn đàn khá tiện dụng vì không cần đến DB mà chỉ sử dụng file để lưu giữ thông tin. Các hoạt động của PBLang đều dựa trên việc thao tác với file, chính vì điều này đã làm cho nó trở nên dễ phát sinh lỗi.]]>
/hvaonline/posts/list/16555.html#99244 /hvaonline/posts/list/16555.html#99244 GMT
Re: [Thảo luận] Lỗi ở đâu và đây là lỗi gì !? Mới soi thêm cái này biến này nữa $dbpath $to=strip_tags($_POST['to']);   Nhìn qua nhìn lại chỉ thấy các chỗ đó có vấn đề. Và mấu chốt quanh đi quẩn lại cái biến đó. Vì chưa dùng qua forum PBLang này nên chưa thử với nó. Vả lại thẻ code hơi khó đọc . Mong diễn đàn sớm đưa cái google-syntax-highlighter vào hy vọng code sẽ rõ ràng hơn. ]]> /hvaonline/posts/list/16555.html#99248 /hvaonline/posts/list/16555.html#99248 GMT Re: [Thảo luận] Lỗi ở đâu và đây là lỗi gì !? /hvaonline/posts/list/16555.html#99270 /hvaonline/posts/list/16555.html#99270 GMT Re: [Thảo luận] Lỗi ở đâu và đây là lỗi gì !? $subj=strip_tags(stripslashes($_GET['subj'])); $msg=strip_tags(stripslashes($_GET['msg'])); $orgp=strip_tags(stripslashes($_GET['orig'])); $orgp=str_replace('/','',$orgp); //make sure no other URL is being used $orgp=str_replace(chr(92),'',$orgp); //make sure no other URL is being used $pmstat="3"; $fp = fopen($dbpath."/pm/".$liusername."_".$num."_pmstat", "w"); fputs($fp, $pmstat); fclose($fp)  xem đoạn code trên, mặc dù biến $orgp đã được "làm sạch" các ký tự meta bằng các hàm stripslashes, $orgp=str_replace('/','',$orgp); để tránh bị XSSDirectory transversal nhưng vẫn có thể bị lợi dụng .. Lợi dụng như thế nào ?? PBLang save các tin nhắn của member trong thư mục /db/pm với format $member_$i_$x trong đó $i là số thứ tự tên tin nhắn của $member đó, $x=c (c= content) để lưu nội dung tin nhắn, hoặc $x=s (s=subject) ..Vì thế mặc dù ko tấn công kiểu Directory transversal được qua biến $_GET['orig'] được, nhưng dùng biến này có thể đọc lén được những tin nhắn của người khác
if (trim($orgp)!=''){ $filename=$dbpath.'/pm/'.$orgp; if (file_exists($filename)){ $fd=@fopen($filename,"r"); $rmsg=@fread($fd,filesize($filename)); @fclose($fd); } 
ex:
http://localhost/PBlang/sendpm.php?to=admin&subj=aaa&num=1&orig=admin_1_c 
--> đọc nội dung tin nhắn thứ 1 của account admin (còn tiếp ) :) ]]>
/hvaonline/posts/list/16555.html#99384 /hvaonline/posts/list/16555.html#99384 GMT
Re: [Thảo luận] Lỗi ở đâu và đây là lỗi gì !? /hvaonline/posts/list/16555.html#99393 /hvaonline/posts/list/16555.html#99393 GMT Re: [Thảo luận] Lỗi ở đâu và đây là lỗi gì !? $filename = "$dbpath/pm/$to"; $fd = fopen ($filename, "r"); $num = fread ($fd, filesize ($filename)); fclose ($fd); $num++; $fp = fopen("$dbpath/pm/$to", "w"); fputs($fp, $num); fclose($fp);   Hehe ... Dạo này đang tập tành code với PHP nên không dám lạm bàn nữa .. vả lại cái PBLang chưa có dịp ngâm qua nên chưa hiểu rõ nó hehe ...xin rút lui .. Quan Van Trường chỉ điểm vậy :D :D]]> /hvaonline/posts/list/16555.html#99404 /hvaonline/posts/list/16555.html#99404 GMT Re: [Thảo luận] Lỗi ở đâu và đây là lỗi gì !? viết trực tiếp vào filesystem luôn luôn có những hiểm họa bảo mật. Đặc biệt quy trình input validation thiếu chặt chẽ thì không ít thì nhiều sẽ bị lỗi bảo mật. Cách khắc phục an toàn nhất có lẽ là thiết kế lại ứng dụng và dùng một DB hoàn chỉnh thay vì dùng file trên filesystem.]]> /hvaonline/posts/list/16555.html#99524 /hvaonline/posts/list/16555.html#99524 GMT Re: [Thảo luận] Lỗi ở đâu và đây là lỗi gì !? /hvaonline/posts/list/16555.html#99662 /hvaonline/posts/list/16555.html#99662 GMT Re: [Thảo luận] Lỗi ở đâu và đây là lỗi gì !? /hvaonline/posts/list/16555.html#99668 /hvaonline/posts/list/16555.html#99668 GMT Re: [Thảo luận] Lỗi ở đâu và đây là lỗi gì !? /hvaonline/posts/list/16555.html#100432 /hvaonline/posts/list/16555.html#100432 GMT Re: [Thảo luận] Lỗi ở đâu và đây là lỗi gì !? /hvaonline/posts/list/16555.html#100512 /hvaonline/posts/list/16555.html#100512 GMT Re: [Thảo luận] Lỗi ở đâu và đây là lỗi gì !?

Quan Vân Trường wrote:
Thêm gợi ý để "cứu ế" chủ đề: code phát sinh lỗi nằm từ dòng 83 trở đi. Xin mới tiếp tục thảo luận.. Thân. 
Đoạn này theo nhận định của LKL thì chỉ toàn là cách thức đặt tên file, và ghi giữ liệu vào file của người nhận messenger. Vậy có phải ý QVT muốn nói ở đây là dựa vào nguyên tắc đó, hoàn toàn chúng ta có thể dịch ra được đường dẫn và tên file kia rồi down về và đọc đựoc PM đó? Ko biết đó có phải là ý mà QVT muốn nhắc đến!?! Thân LKL!!!]]>
/hvaonline/posts/list/16555.html#100516 /hvaonline/posts/list/16555.html#100516 GMT
Re: [Thảo luận] Lỗi ở đâu và đây là lỗi gì !?

lion_king_lovely_1985 wrote:

Quan Vân Trường wrote:
Thêm gợi ý để "cứu ế" chủ đề: code phát sinh lỗi nằm từ dòng 83 trở đi. Xin mới tiếp tục thảo luận.. Thân. 
Đoạn này theo nhận định của LKL thì chỉ toàn là cách thức đặt tên file, và ghi giữ liệu vào file của người nhận messenger. Vậy có phải ý QVT muốn nói ở đây là dựa vào nguyên tắc đó, hoàn toàn chúng ta có thể dịch ra được đường dẫn và tên file kia rồi down về và đọc đựoc PM đó? Ko biết đó có phải là ý mà QVT muốn nhắc đến!?! Thân LKL!!! 
Gần gần đúng rồi đây. Nhưng cái chúng ta cần không chỉ là các PM đó thôi đâu, còn nhiều thứ khác nữa mà ;). Thân. ]]>
/hvaonline/posts/list/16555.html#100519 /hvaonline/posts/list/16555.html#100519 GMT
Re: [Thảo luận] Lỗi ở đâu và đây là lỗi gì !? /hvaonline/posts/list/16555.html#102242 /hvaonline/posts/list/16555.html#102242 GMT Re: [Thảo luận] Lỗi ở đâu và đây là lỗi gì !? /hvaonline/posts/list/16555.html#102415 /hvaonline/posts/list/16555.html#102415 GMT Re: [Thảo luận] Lỗi ở đâu và đây là lỗi gì !?

Luke wrote:
Lập trình kiểu này đọc đau cả mắt T_T QVT định hại anh em hả, cả lũ cận lòi rồi. Anh bó tay ^:)^ 
Thế kiểu nào mới ko đau mắt vậy? Ko phải của mình viết ra thì tất nhiên là đau mắt rồi, nếu chưa đọc nó bao giờ thì càng nhức hơn. Với lại QVT cho biết thêm là để exploit được thì có cần phải đọc toàn bộ code của PBLang(để xem có nên tiếp tục ko) ko vậy, chứ chỉ riêng file này thôi thì nó chỉ có mục đích là tạo 1 số file, có thể dùng path traversal(thấy mọi người toàn dùng transversal) để tạo file ở các thư mục khác, nên cũng chưa thấy lỗi lãi gì lắm. Còn cái hint Debug error, thì quả thật mình chịu thua.]]>
/hvaonline/posts/list/16555.html#102422 /hvaonline/posts/list/16555.html#102422 GMT
Re: [Thảo luận] Lỗi ở đâu và đây là lỗi gì !? /hvaonline/posts/list/16555.html#102430 /hvaonline/posts/list/16555.html#102430 GMT Re: [Thảo luận] Lỗi ở đâu và đây là lỗi gì !?

Quan Vân Trường wrote:
Gợi ý tiếp theo: lợi dụng Debug Error.. 
Hmm, nếu display_errors=Off (by default) thì làm sao lợi dụng được hả bro.]]>
/hvaonline/posts/list/16555.html#102450 /hvaonline/posts/list/16555.html#102450 GMT
Re: [Thảo luận] Lỗi ở đâu và đây là lỗi gì !? /hvaonline/posts/list/16555.html#102456 /hvaonline/posts/list/16555.html#102456 GMT Re: [Thảo luận] Lỗi ở đâu và đây là lỗi gì !?

Quan Vân Trường wrote:
Thì ko lợi dụng được ạh :D.. Mời thảo luận tiếp :)..  
hì hì, nếu vậy thì chỉ cần gửi pm to: ../members/admin thì lập tức mọi thông tin về user admin (quan trọng nhất là pass md5) sẽ được display dưới dạng error của fopen. Thường thì display_errors chỉ nên để On trong giai đoạn developing thôi, nếu ko thì risk vô cùng. Thực ra mình nghĩ là người phát triển PBLang cũng giả định như thế, vì trước kia sendpm.php cũng bị lỗi directory traversal, nên chắc chắn sau đó phải được kiểm tra lại rất cẩn thận.]]>
/hvaonline/posts/list/16555.html#102460 /hvaonline/posts/list/16555.html#102460 GMT
Re: [Thảo luận] Lỗi ở đâu và đây là lỗi gì !? /hvaonline/posts/list/16555.html#102462 /hvaonline/posts/list/16555.html#102462 GMT Re: [Thảo luận] Lỗi ở đâu và đây là lỗi gì !?

Quan Vân Trường wrote:
@StarGhost: Đáp án chính xác :D.. Phiền bạn chỉ ra đoạn code đó cho mọi người cùng thấy ;).. Cám ơn bạn đã tham gia vào chủ đề. Thân.  
giả sử đường dẫn đến thư mục PBLang là /html/PBLang. Đầu tiên, user type vào mục to ở trang sendpm.php với nội dung: ../members/admin Như vậy ở dòng 77, biến $to sẽ được gán với giá trị "../members/admin" Sau đó ở dòng 96, biến $filename sẽ được gán với giá trị: "/html/PBLang/db/pm/../members/admin", thực chất sẽ là "html/PBLang/db/members/admin", tức là file chứa toàn bộ thông tin về admin. Ở dòng 98, toàn bộ thông tin trong file ở trên sẽ được đọc ra biến $num, mà sau đó ở các dòng 107, 110, 113, 119, 122 biến này sẽ được dùng làm tên file. Và hiển nhiên fopen sẽ báo lỗi, như vậy tên file sẽ được hiển thị, tức là toàn bộ giá trị của $num hay là toàn bộ thông tin về admin sẽ được hiển thị lên màn hình. Lỗi này thực ra khá đơn giản (đến 1 noob PHP như mình còn phát hiện được), tuy nhiên, sở dĩ ko ai trả lời chắc là vì ai cũng đinh ninh rằng error debugging đã bị tắt rồi. Có lẽ lần sau QVT nên chú thích rõ hơn.]]>
/hvaonline/posts/list/16555.html#102465 /hvaonline/posts/list/16555.html#102465 GMT
Re: [Thảo luận] Lỗi ở đâu và đây là lỗi gì !? /hvaonline/posts/list/16555.html#114036 /hvaonline/posts/list/16555.html#114036 GMT Re: [Thảo luận] Lỗi ở đâu và đây là lỗi gì !? $to Code:
$to=strip_tags($_POST['to']);
$msg=strip_tags(stripslashes($_POST['msg']));
$subj=strip_tags(stripslashes($_POST['subj']));
Ngôn ngữ có auto type casting mềm dẻo quá thường dễ mắc lỗi hơn, nếu ngôn ngữ khác thì $num theo mong muốn sẽ không thể chứa chuỗi, $num++ sẽ bung lỗi.]]>
/hvaonline/posts/list/16555.html#114107 /hvaonline/posts/list/16555.html#114107 GMT