Press "Enter" to skip to content

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

之前, 小顿和我提过一个想法, 就是从PHP语言层面去分析,找出一些可能的注入漏洞代码. 当时我一来没时间, 而来也确实不知道从何处下手..

直到上周的时候, 我看到了这个RFC: RFC:Taint.

但是这个RFC的问题在于, 它需要为PHP打Patch, 修改了PHP本身的数据结构, 这对于以后维护, 升级PHP来说, 很不方便, 也会有一些隐患.

虽然这样, 但这个RFC却给了我一个启发, 于是我就完成了这样的一个扩展:Taint Extension

这个扩展使用起来, 很简单(目前只支持5.2.6 ~ 5.3.10):

下载源代码以后, 编译, 安装. 然后在php.ini中要开启这个扩展(建议不要在生产环境开启这个扩展):

extension=taint.so
taint.enable=1

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

<?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
?>

目前因为还没有支持5.4(5.4的实现方法, 要依赖于我将要和Dmitry讨论的一个新需求), 所以目前还没有发布一个下载包, 大家可以先直接从源代码下载: Taint on Github.

上面的例子显示了简单的用法, 回头我会再完善下文档….

enjoy~

74 Comments

  1. scfood
    scfood 2013-03-14

    我也无法下载,怎么弄啊!

  2. hell
    hell 2012-08-30

    不能应用于 win 版本 无奈啊 鸟哥 封装成 win 下扩展呗

  3. […] 这里的关键在于第四步,因为服务器端可能会做一些限制,比如encode或者长度限制,测试的时候需要想办法看看是否能绕过限制。 这种类型的XSS漏洞,用白盒的方法也比较容易发现。我司有一款牛逼工具可以通过追踪输出变量,看在赋值过程中是否有被编码来判断是否存在注入,少有误报(但有漏报:D),PHP有款开源的扩展做的也是类似的事情,点击看PHP Taint – 一个用来检测XSS/SQL/Shell注入漏洞的扩展。不过只检测$_GET/$_POST/$_COOKIE,同事后来改了下源码支持$_SERVER变量。 […]

  4. phpairspace
    phpairspace 2012-05-13

    那比如说这个来自$_REQUEST的参数已经做过过滤了,能否有方法取消这个warning的输出呢?一直输出warning对页面的js/ajax等效果有影响。

  5. 雪候鸟
    雪候鸟 2012-05-12

    @phpairspace, taint在发现你在关键函数使用了来自$_REQUEST的参数就会提示你可能会有问题, 它默认提示的是warning~

  6. phpairspace
    phpairspace 2012-05-12

    就是说只要有require 变量的话就都会报warning么?变量做过限制的话也不行么?

  7. 雪候鸟
    雪候鸟 2012-05-12

    @phpairspace 代码中没看到require啊?

  8. phpairspace
    phpairspace 2012-05-12

    在测试是遇到类似的代码
    $q = $_GET[‘q’];
    $controller = dirname(__FILE__);

    if ($q) {
    $controller .= ‘/controller/’.$q;

    if (realpath($controller) != $controller) {
    exit(‘Access Denied’);
    }
    }

    require $controller;

    当访问q=index.php时会报Warning: require() [function.require]: File path contains data that might be tainted
    请教下鸟哥什么情况下会有注入的风险?

  9. Chiotis
    Chiotis 2012-05-10

    sorry….autoload可能是是我这边用来记录taint错误的set_error_handler的函数在auto定义之前被触发了导致。

  10. Chiotis
    Chiotis 2012-05-10

    发现autoload失败的问题还是存在,在自定义的loader 函数里,include会被误报有安全问题,导致加载不到不到文件。

  11. Chiotis
    Chiotis 2012-05-10

    感谢,初步验证已经好了。后续再试用一阵,如果有问题及时反馈给您。

  12. @Laruence
    @Laruence 2012-05-10

    好的,我今天试下。

  13. chiotis
    chiotis 2012-05-08

    @Laruence 目前遇到的有,1、数组中的变量(原值为’/’)经过一系列传递后,成了一个*RECURSION*; 2、autoload偶尔失效。 误报倒没什么,可以忽略,反正结果只是参考。

  14. Laruence
    Laruence 2012-05-08

    @chioits 你能说说具体是什么bug么, taint目前是beta版本,可能会有些bug

  15. chiotis
    chiotis 2012-05-08

    BUG太多了,各种诡异现象。误报也很多,真实项目中完全没用。

  16. frank
    frank 2012-04-18

    有没有相应的工程说明和代码解释文档啊,大牛

  17. laruence
    laruence 2012-03-09

    @hm 多管齐下, 前台转义只是XSS, taint还关注于sql注入, 命令注入等.

  18. hm
    hm 2012-03-09

    推荐的做法应该是后台吐原文、统一由前台(JS)转义输出吧,鸟哥怎么看呢

  19. toms
    toms 2012-02-17

    好像不能回复呢

  20. rookie
    rookie 2012-02-17

    @雪候鸟

    可能跟我的环境有关系,终于安装好了,我改一下
    vim taint.c /*zend_error_noreturn(E_ERROR, “Cannot use assign-op operators with overloaded objects nor string offsets”);*/
    zend_error(E_ERROR, “Cannot use assign-op operators with overloaded objects nor string offsets”);

    效果相当好,太感谢,你太给力了

  21. airwin
    airwin 2012-02-17

    谁给个win版dll?~~

  22. rookie
    rookie 2012-02-16

    taint-0.0.1.tgz

    #phpize
    #./configure –enable-taint
    #make
    #cp modules/taint.so /usr/lib64/php/modules/

    #cat /etc/php.d/taint.ini
    ; Enable taint extension module
    extension=taint.so

    #tail /etc/php.ini
    ;XSS code sniffer
    [taint]
    taint.enable=1

  23. 雪候鸟
    雪候鸟 2012-02-16

    @rookie 没道理啊, zend_error_noreturn是在zend.h定义的, 被php.h包含, 你是怎么编译的?

  24. rookie
    rookie 2012-02-16

    PHP 5.3.6 (cli)

  25. jekhy
    jekhy 2012-02-16

    @rookie 我手动改了下taint.c,把zend_error_noreturn改为zend_error就可以了,参考:http://stackoverflow.com/questions/2556113/swig-generated-code-fails-to-run-on-php-5-3-2-undefined-symbol-zend-error-noret

  26. rookie
    rookie 2012-02-16

    PHP Warning: PHP Startup: Unable to load dynamic library ‘/usr/lib64/php/modules/taint.so’ – /usr/lib64/php/modules/taint.so: undefined symbol: zend_error_noreturn in Unknown on line 0

  27. Anonymous
    Anonymous 2012-02-16

    PHP Warning: PHP Startup: Unable to load dynamic library ‘/usr/lib64/php/modules/taint.so’ – /usr/lib64/php/modules/taint.so: undefined symbol: zend_error_noreturn in Unknown on line 0

  28. xinbe
    xinbe 2012-02-16

    真是一个不错的套件
    之前都是写regexp来搜寻源码
    把这个纳入到开发、测试环境中应该挺不错的

  29. wclssdn
    wclssdn 2012-02-15

    不错 赞一个~~~

  30. 匿名
    匿名 2012-02-15

    //Warning: main() [function.echo]

    如果输出没有转义, 这种提示main() 这个可能要找一下,echo貌似是语法结构,不是function

  31. cnwill
    cnwill 2012-02-15

    博主一直是我们的解困导师!

  32. Rhythm
    Rhythm 2012-02-14

    给PHP写插件真是必备技能。

  33. Ckai
    Ckai 2012-02-14

    鸟哥v5

  34. KnightE
    KnightE 2012-02-14

    已在开发环境上安装,体验一下看看

  35. leijuly
    leijuly 2012-02-14

    每天上来看一看, 进阶学习。 博主造福广大基层PHPer啊

  36. pangee
    pangee 2012-02-14

    过滤输入,转义输出……

  37. Kenny
    Kenny 2012-02-14

    为什么无法下载啊?

Leave a Reply

Your email address will not be published. Required fields are marked *