guhetu 发表于 2016-6-23 11:04:48

打造自己的php半自动化代码审计工具

   0x00 PHP扩展进行代码分析(动态分析)
一.基础环境
二.使用PHPTracert
  编辑php.ini,增加:
三.测试
四.phptrace分析
  执行的代码如下:
  执行顺序是:
  参数含义:
名称值意义
seqint|执行的函数的次数   
type1/21是代表调用函数,2是代表该函数返回   
level-10执行深度,比如a函数调用b,那么a的level就是1,b的level就是2,依次递增   
funceval调用的函数名称   
st1448387651119460时间戳   
paramsstring函数的参数   
filec.php执行的文件   
lineno1此函数对应的行号   
  日志输出:
#!js
{"seq":0, "type":1, "level":1, "func":"{main}", "st":1448387651119445, "params":"", "file":"/var/www/html/2.php", "lineno":11 }
{"seq":1, "type":1, "level":2, "func":"a", "st":1448387651119451, "params":"", "file":"/var/www/html/2.php", "lineno":11 }
{"seq":2, "type":1, "level":3, "func":"b", "st":1448387651119452, "params":"", "file":"/var/www/html/2.php", "lineno":9 }
{"seq":3, "type":1, "level":4, "func":"c", "st":1448387651119453, "params":"", "file":"/var/www/html/2.php", "lineno":6 }
{"seq":4, "type":2, "level":4, "func":"c, "st":1448387651119457, "return":"NULL", "wt":4, "ct":4, "mem":48, "pmem":144 }
{"seq":5, "type":2, "level":3, "func":"b, "st":1448387651119459, "return":"NULL", "wt":7, "ct":6, "mem":48, "pmem":144 }
{"seq":6, "type":2, "level":2, "func":"a, "st":1448387651119459, "return":"NULL", "wt":8, "ct":8, "mem":80, "pmem":176 }
{"seq":7, "type":2, "level":1, "func":"{main}, "st":1448387651119460, "return":"1", "wt":15, "ct":14, "mem":112, "pmem":208 }
五.逻辑分析
  1.解析监控进程
  开一个后台进程一直刷新进程列表,如果出现没有tracer的进程就立即进行托管
  2.json提取
  通过对每一个文件的json进行提取,提取过程如下:
便利所有文件
读读取文件
提取json,按照seq排序
提取type=2的与type=1的进行合并
按照level梳理上下级关系存储同一个字典
按照seq排序,取出头函数进行输出
提取恶意函数往上提取level直到level=0
  函数对应如下:
#!python
list1={
  level1:
  level2:
  level3: #eval
  level4:
}
list2=
  3.数据查看
  通过追踪危险函数,然后将其函数执行之前的关系梳理出来进行输出,然后再进行人工审查。
  放上demo
http://static.wooyun.org/drops/20160103/20160103155527337041.jpg

http://static.wooyun.org/drops/20160103/20160103155529322102.jpg

六.使用XDEBUG
  修改php.ini
#!bash

zend_extension = "/usr/lib/php5/20131226/xdebug.so"
xdebug.auto_trace = on
xdebug.auto_profile = on
xdebug.collect_params = on
xdebug.collect_return = on
xdebug.profiler_enable = on
xdebug.trace_output_dir = "/tmp/ad/xdebug_log"
xdebug.profiler_output_dir = "/tmp/ad/xdebug_log"
  放上几个demo图片:
http://static.wooyun.org/drops/20160103/20160103155532530513.png
七.优缺点
  缺点
  人为参与力度较大,无法进行脱离人工的操作进行独立执行。
  优点
  精准度高,对于面向对象和面向过程的代码都可以进行分析。
0x01 语法分析(静态分析)
一.使用php-parser
  介绍:
二.安装
三.测试
#!php
<?php
include 'autoload.php';
use PhpParser\Error;
use PhpParser\ParserFactory;
$code = '<?phpeval($_POST)?>';
$parser = (new ParserFactory)->create(ParserFactory::PREFER_PHP7);
try {
  $stmts = $parser->parse($code);
  print_r($stmts);
  // $stmts is an array of statement nodes
} catch (Error $e) {
  echo 'Parse Error: ', $e->getMessage();
}
  输出如下:
#!js
Array
(
   => PhpParser\Node\Expr\Eval_ Object
  (
   => PhpParser\Node\Expr\ArrayDimFetch Object
  (
   => PhpParser\Node\Expr\Variable Object
  (
   => _POST
   => Array
  (
   => 1
   => 1
  )
  )
   => PhpParser\Node\Expr\ConstFetch Object
  (
   => PhpParser\Node\Name Object
  (
   => Array
  (
   => c
  )
   => Array
  (
   => 1
   => 1
  )
  )
   => Array
  (
   => 1
   => 1
  )
  )
   => Array
  (
   => 1
   => 1
  )
  )
   => Array
  (
   => 1
   => 1
  )
  )
)
  由此可见,我们需要提取出
  然后进行拼接之后即可发现原始语句是:
四.逻辑分析
通过该库进行语法分析
提取结果
提取危险函数
提取危险函数中存在的变量
从上文中提取此变量的赋值方式
分析出可控结果
输出结果
五.优缺点
  缺点
  对于面向对象的程序进行分析比较弱。
  优点
  适合大批量的自动化分析,可以脱离人工操作进行独立执行


       

                                                  


来源链接: http://drops.wooyun.org/tips/11757
页: [1]
查看完整版本: 打造自己的php半自动化代码审计工具