C / PHP · 2016/01/19 2

PHP Taint – 一个用来检测XSS/SQL/Shell注入漏洞的扩展

之前在网上偶然看到这个扩展,可以以白盒源码级的方式来检测常见的安全问题,引用鸟哥的话讲

启用这个扩展以后, 如果在一些关键函数(或者语句: echo, print, system, exec, 等等), 或者输出的地方*直接*(没有经过转义, 安全过滤处理)使用了来自$_GET, $_POST或者$_COOKIE的数据, 则Taint就会提示你

然后本博文简单记录下安装中过程和可能遇到的一些问题和注意啥的

安装

wget http://pecl.php.net/get/taint-1.2.2.tgz 
tar zxvf taint-1.2.2.tgz
cd taint-1.2.2
phpize(如果找不到该命令,需要apt-get或者yum install php5-dev)
./configure
make
make install

上面taint的下载地址请在http://pecl.php.net/package/taint 中按照你的php版本来选择对应的下载

需要注意该扩展不支持5.5,5.6有点小坑,支持5.2到5.4,7或者更新

安装后修改你php.ini(具体路径按照你安装的问题寻找)增加taint的配置

extension=taint.so (具体路径自行修改)
taint.enable=1

然后重启apache或者php-fpm即可

全部结束后可以打印下phpinfo看看是不是有taint了

附:有时编译时可能会提示INIT_PZVAL_COPY未定义,此时需要在php_taint.h定义

#ifndef INIT_PZVAL_COPY
#define INIT_PZVAL_COPY(z,v) \
	(z)->value = (v)->value; \
	Z_TYPE_P(z) = Z_TYPE_P(v); \
	Z_SET_REFCOUNT_P(z, 1); \
	Z_UNSET_ISREF_P(z);
#endif

然后重新编译下即可

实例

    <?php
     $a = $_GET['a'];
     
     $file_name = '/tmp' . $a;
     $output = "Welcome, {$a} !!!";
     $var = "output";
     $sql = "Select * from " . $a;
     $sql .= "ooxx";
     
     echo $output;
    //Warning: main(): Attempt to echo a string which might be tainted in xxx.php on line x
     
     print $$var;
    //Warning: main(): Attempt to print a string which might be tainted in xxx.php on line x
     
     include($file_name);
    //Warning: include() [function.include]: File path contains data that might be tainted in xxx.php on x
     
     mysql_query($sql);
    //Warning: mysql_query() [function.mysql-query]: First argument contains data that might be tainted in xxx.php on line x
    ?>

 

引用整理自

http://www.freebuf.com/articles/web/8551.html

http://www.secoff.net/archives/461.html

http://www.laruence.com/2012/02/14/2544.html