国税之家

 


标题: PHP漏洞代码点滴
sky19791111
荣誉版主
Rank: 7Rank: 7Rank: 7


一级嘉奖   原创先锋勋章  
UID 5688
精华 30
积分 1099
帖子 1368
现金 868 金币
阅读权限 100
注册 2006-5-11
来自 sky19791111@163.com
状态 离线
 
发表于 2008-1-9 00:24  资料  个人空间  主页 短消息  加为好友     
PHP漏洞代码点滴


这些代码都是真实存在的漏洞代码,我想把他们收集起来,漏洞代码看多了势必提高自己的漏洞识别能力.至少当拿到一个待分析的程序时知道那些地方会出问题,从而有目的性的读.

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","<br />",$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),当然这样写是不全面的,如有需要可以自定

义一个过滤的函数,把危险字符都替换掉。





如果帅是罪,那我已经罪恶滔天;
如果酷是错,那我已经一错再错;
如果聪明要受刑罚,那我要遭千刀万剐!!!

顶部
[广告] 氙气超强光-战术手电-蚂蚁淘宝店铺开张
 


Powered by Discuz! My SQL  © 2001-2007 网站备案信息: 豫ICP备06011305号

当前时区 GMT+8, 现在时间是 2008-11-21 01:24 清除 Cookies - 联系我们 - 国税之家