首页 | 业界新闻 | 黑客教程 | 安全漏洞 | 安全文章 | 破解技术 | 技术文摘 | 黑客文化 | 本站原创 | 安全贴吧 | 在线留言 | IP查询 | 软件下载 | 繁体中文 |
您现在的位置: 黑色反击 >> 技术资讯 >> 黑客教程 >> 黑客教学 >> 正文
PHP漏洞代码点滴
时间:2006-3-10 16:01:43 出处:网络 作者:未知 编辑:mervin 点击数:
这些代码都是真实存在的漏洞代码,我想把他们收集起来,漏洞代码看多了势必提高自己的漏洞识别能力.至少当拿到一个待分析的程序时知道那些地方会出问题,从而有目的性的读. 

1鸡肋的注入 
现在PHP程序能直接注入的情况已经很少了,即使你按默认安装PHP,MAGIC就是打开的,这样提交的单引 

号就会被转义成\’,这样就无法闭合单引号,也就不存在后面的查询,现在有好多程序都存在这种情况 

,举个例子: 
if($_GET[’x’] == "") { 
if($_GET[’showimage’] == "") { 
$row = sql_array("select * from ".$pixelpost_db_prefix."pixelpost where  

datetime<=’$cdate’ order by datetime DESC limit 0,1"); 
} else { 
$row = sql_array("select * from ".$pixelpost_db_prefix."pixelpost where  

(id=’".$_GET[’showimage’]."’)"); 

这样写程序的现在很多见的,说他是个漏洞,可利用价值很低;说他不是漏洞,可理论上确实存在注入 

,很有点鸡肋的感觉,其实只需这样写就天下太平了: 
$row = sql_array("select * from ".$pixelpost_db_prefix."pixelpost where (intval 

(id=’".$_GET[’showimage’]."’))"); 

2跨站的问题 
出现跨站漏洞的代码多种多样,今天看到了一种就记录下来 
$message = isset($_POST[’message’]) ? $_POST[’message’] : ""; 
if (eregi("\r",$message) || eregi("\n",$message)){ die("No  

intrusion! ?? :(");} 
$message = clean(nl2br($message),’html’); 

$name = isset($_POST[’name’]) ? $_POST[’name’] : ""; 
if (eregi("\r",$name) || eregi("\n",$name)){ die("No intrusion! ??  

:(");} 
$name = clean($name,’html’); 

$url = isset($_POST[’url’]) ? $_POST[’url’] : ""; 
if (eregi("\r",$url) || eregi("\n",$url)){ die("No intrusion! ??  

:(");} 
$url = clean($url,’html’); 

$parent_name = isset($_POST[’parent_name’]) ? $_POST[’parent_name’]  

: ""; 
if (eregi("\r",$parent_name) || eregi("\n",$parent_name)){ die("No  

intrusion! ?? :(");} 
$parent_name = clean($parent_name); 

$email = isset($_POST[’email’]) ? $_POST[’email’] : ""; 
if (eregi("\r",$email) || eregi("\n",$email)){ die("No intrusion!  

?? :(");} 
$email = clean($email,’html’); 
if(($parent_id != "") and ($message != "")) $query = "INSERT INTO  

".$pixelpost_db_prefix."comments(id,parent_id,datetime,ip,message,name,url,email) 
VALUES(’NULL’,’$parent_id’,’$datetime’,’$ip’,’$message’,’$name’,’$url’,’$email’)"; 
$result = mysql_query($query); 
clean()函数并不是过滤用的,以上程序只是用了个3元判断是否有$_POST[$var],如果有就赋值,然 

后就提交到数据库里了。 
修补方法也很简单,可以用PHP自带的htmlspecialchars函数过滤掉HTML实体或者自己写过滤函数: 
function dangerchr($var){ 
$var = str_replace("\t","",$msg); 
$var = str_replace("<","<",$msg);  
$var = str_replace(">",">",$msg); 
$var = str_replace("\r","",$msg); 
$var = str_replace("\n","",$msg); 
$var = str_replace(" ","   ",$msg); 

}------来自PW的 

3目录遍历漏洞: 
这类漏洞一般会出现在一些比较简单的留言日记类程序或者邮件列表程序中。 
Simplog是国外的一款基于PHP的日记程序。该程序中就出现了目录遍历漏洞 
漏洞代码如下: 
$act = $_GET[’act’]; 
if ($act == ’’) 

include("blog.txt"); 

else 

include("act/$act.txt"); 

?> 
$blog_id = $_GET[’blogid’];  
if ($blog_id == ’’) 

include("blog.txt"); 

else 

include("./blog_entries/$blog_id.txt"); 
}  
?> 
从上面的代码可以清晰的看出问题所在,第一段程序获得$_GET[]提交的数据并赋值给$act,这里没有对 

act做任何的过滤,而在后面判断如果变量为空就把blog.txt包含进来,如果不为空就包含act目录下的 

$act.txt文件,这样当我们不管提交什么文件类型都会被加上.txt后缀,再加上我们可以用../来跳转到别的 

目录,就可以遍历整个服务器上的文件了。第2段程序也是同样的漏洞,只不过变量变成数字型了,我们 

一样可以构造类似于index.php?act=blog&blogid=../config.php这样的URL来读取敏感文件内容。 

修补方法很简单,对于数字形的只需用intval()函数来把ID强制整形化就可以了,对于字符形的可以 

用类似的代码来过滤$act = str_replace("../","",$act),当然这样写是不全面的,如有需要可以自定 

义一个过滤的函数,把危险字符都替换掉。 
精彩推荐
hack菜鸟入门
VB 从零开始编外挂(完
IPC入侵全接触
QQ跨站漏洞巧利用,强
WinXP中CPU占用100%原
黑客新技术 灰鸽子巧妙
实例讲解 黑客入侵论坛
ADSL共享上网方式大总
BMP文件格式分析
十招教你学会破解
热门软件
网 友 评 论
关于我们 - 联系方式 - 招聘信息 - 合作伙伴 - 网站地图 - 广告服务 - 我要投稿 - 设为首页 - 加入收藏
黑色反击 力倡网络安全,崇尚互联共享,欢迎各种媒体转载我们的原创作品 [转载请注明出处]。
EMAIL:hf110.com@gmail.com 备案:苏ICP备05010002号