PHP 代码安全审计——程序员容易忽略的安全问题-注入篇
作者:不走的钟
程序员主要考虑功能设计,但往往忽略了程序的安全性,最近在项目中审计PHP代码时,遇到二个简单而很多程序员都容易忽略的问题,安全问题不容小视,往往微小问题便可导致全站覆没,看下边代码:
场景一
<?php include("config.php") ; $id=$_GET['id']; if (!is_numeric($id)) { header("location:index.php"); } ?> <div> <?php $contb = mysql_fetch_array(mysql_query("select tit from xid where id2=$id")); ?> ……
这段代码,看出问题了么?
if (!is_numeric($id)) //判断是否是数字 { header("location:index.php"); //如果不是数字,返回到index.php }
看上去好像没什么问题,但经验丰富的朋友一看就知道问题所在,这里程序仅仅是返回到index.php,并没有退出,
<?php $contb = mysql_fetch_array(mysql_query("select tit from xid where id2=$id")); ?>
所以,上边这句sql依然会执行从而导致sql注入。
解决方法当然很简单,返回后加入exit();即可,如下:
<?php include("config.php") ; $id=$_GET['id']; if (!is_numeric($id)) { header("location:index.php"); exit(); } ?> <div> <?php $contb = mysql_fetch_array(mysql_query("select tit from xid where id2=$id")); ?> ……
场景二
<?php include("config.php") ; if (!get_magic_quotes_gpc()) { $id=addslashes($_GET['id']); } $contb = mysql_fetch_array(mysql_query("select lm from xid where id=$id")); …… ?>
这个场景,同样是存在注入漏洞,犯错的人更多。很多人都以为经过addslashes过滤后就安全了,实际上开启magic_quote_gpc=on之后,相当于使用addslshes()这个函数,但并没有完全做到防注入,
提交id=1 and ( select length(@@version))>1 and 1=1 /*就可以了,这种只是相当于过滤了单引号的数字型注入,过滤了单引号可以使用char或者hex转换,来绕过限制。
数字型应该使用intval()强制将参数转换成数字。
不错不错,这是注入类型的一些,还有包含、上传、执行的也值得总结下
可以,有时间我整理下,那先把名字改下 加上 注入篇
希望博主能多多分享一些好的博文,持续关注中
10
这段代码怎么利用啊? 整个页面都被返回了
这种手工不能注入,需要写工具,如exp.php
利用方法,参考:
http://www.007hack.com/?p=749
观注中……
这个确实有点复杂的,研究很久才看懂