IT技术博客大学习 共学习 共进步

PHP Taint – 一个用来检测XSS漏洞的扩展

风雪之隅 2012-03-04 18:11:52 累计浏览 3,586 次

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

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

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

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

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

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

extension=taint.sotaint.enable=

启用这个扩展以后, 如果在一些关键函数(或者语句: 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.

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

建议继续学习

  1. 几种极其隐蔽的XSS注入的防护 (累计阅读 5,545)
  2. 一段Javascript的代码 (累计阅读 4,183)
  3. 新浪微博的XSS攻击 (累计阅读 4,004)
  4. 使用Http-only Cookie来防止XSS攻击 (累计阅读 3,905)
  5. xss简单渗透测试 (累计阅读 3,523)
  6. 对HTML做白名单过滤 (累计阅读 3,445)
  7. 深掘XSS漏洞场景之XSS Rootkit (累计阅读 3,203)
  8. XSS 前端防火墙 —— 可疑模块拦截 (累计阅读 2,244)
  9. XSS 前端防火墙 —— 内联事件拦截 (累计阅读 2,185)