php漏洞:PHP漏洞点滴来源: 发布时间:星期日, 2008年10月26日 浏览:211次 评论:0
这些代码都是真实存在的漏洞代码,我想把他们收集起来,漏洞代码看多了势必提高自己的漏洞识别能力.至少当拿到一个待分析的程序时知道那些地方会出问题,从而有目的性的读.
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),当然这样写是不全面的,如有需要可以自定 义一个过滤的函数,把危险字符都替换掉。 0
相关文章读者评论发表评论 |