PHP漏洞点滴
[ 2007-03-25 03:55:12 | 作者: sun ]
这些代码都是真实存在的漏洞代码,我想把他们收集起来,漏洞代码看多了势必提高自己的漏洞识别能力.至少当拿到一个待分析的程序时知道那些地方会出问题,从而有目的性的读.
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),当然这样写是不全面的,如有需要可以自定
义一个过滤的函数,把危险字符都替换掉。
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),当然这样写是不全面的,如有需要可以自定
义一个过滤的函数,把危险字符都替换掉。
评论Feed: http://www.lziss.com/blog/feed.asp?q=comment&id=404
引用链接: http://www.lziss.com/blog/trackback.asp?id=404
引用链接: http://www.lziss.com/blog/trackback.asp?id=404
经营范围:商务咨询、企业管理咨询、投资咨询、市场策划、展览展示服务、劳动服务。
并可以为贵公司提供高质量网站建设及网站优化、产品推广服务
公司本次发布信息内容:食品、饮料、酒类、调味品等企业。如果有需要本公司进行产品投放市场前期
的策划,寻找代理商家,可以与我公司联系。
在本月10日以前联系的公司将可以安排贵公司产品参加11月份的华联超市全国订货会。
联系方式:电话 021--51021055-3
E-mail: sh-pai@hotmail,com.
联 系 人:邵先生