首页 > 本站原创 > PHP 代码安全审计——程序员容易忽略的安全问题-注入篇

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()强制将参数转换成数字。

  1. CC
    2012年2月21日13:52 | #1

    不错不错,这是注入类型的一些,还有包含、上传、执行的也值得总结下

  2. 2012年2月21日16:13 | #2

    可以,有时间我整理下,那先把名字改下 加上 注入篇

  3. 2012年2月22日21:22 | #3

    希望博主能多多分享一些好的博文,持续关注中

  4. spades_q
    2012年3月13日18:14 | #4

    10

    这段代码怎么利用啊? 整个页面都被返回了

  5. spades_q
    2012年3月13日18:15 | #5
  6. 2012年3月13日20:33 | #6

    这种手工不能注入,需要写工具,如exp.php

  7. 2012年3月13日21:50 | #7

    利用方法,参考:
    http://www.007hack.com/?p=749

  8. 2012年6月9日11:23 | #8

    观注中……

  9. 2012年9月11日15:02 | #9

    这个确实有点复杂的,研究很久才看懂