Moke|墨客

 找回密码
 立即注册
搜索
查看: 1911|回复: 0

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

[复制链接]

307

主题

317

帖子

1665

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1665

优秀版主荣誉管理论坛元老

发表于 2016-6-23 11:04:48 | 显示全部楼层 |阅读模式
   0x00 PHP扩展进行代码分析(动态分析)
一.基础环境
二.使用PHPTracert
  编辑php.ini,增加:
三.测试
四.phptrace分析
  执行的代码如下:
  执行顺序是:
  参数含义:
名称  值  意义  
seq  int|执行的函数的次数   
type  1/2  1是代表调用函数,2是代表该函数返回   
level  -10  执行深度,比如a函数调用b,那么a的level就是1,b的level就是2,依次递增   
func  eval  调用的函数名称   
st  1448387651119460  时间戳   
params  string  函数的参数   
file  c.php  执行的文件   
lineno  1  此函数对应的行号   
  日志输出:
#!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:[seq,type,func,param,return]
  level2:[seq,type,func,param,return]
  level3:[seq,type,func,param,return] #eval
  level4:[seq,type,func,param,return]
}
list2=  
  3.数据查看
  通过追踪危险函数,然后将其函数执行之前的关系梳理出来进行输出,然后再进行人工审查。
  放上demo




六.使用XDEBUG
  修改php.ini  
#!bash
[xdebug]
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图片:

七.优缺点
  缺点
  人为参与力度较大,无法进行脱离人工的操作进行独立执行。
  优点
  精准度高,对于面向对象和面向过程的代码都可以进行分析。
0x01 语法分析(静态分析)
一.使用php-parser
  介绍:
二.安装
三.测试
#!php
<?php
include 'autoload.php';
use PhpParser\Error;
use PhpParser\ParserFactory;
$code = '<?php  eval($_POST[c][/c])?>';
$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
(
  [0] => PhpParser\Node\Expr\Eval_ Object
  (
  [expr] => PhpParser\Node\Expr\ArrayDimFetch Object
  (
  [var] => PhpParser\Node\Expr\Variable Object
  (
  [name] => _POST
  [attributes:protected] => Array
  (
  [startLine] => 1
  [endLine] => 1
  )
  )
  [dim] => PhpParser\Node\Expr\ConstFetch Object
  (
  [name] => PhpParser\Node\Name Object
  (
  [parts] => Array
  (
  [0] => c
  )
  [attributes:protected] => Array
  (
  [startLine] => 1
  [endLine] => 1
  )
  )
  [attributes:protected] => Array
  (
  [startLine] => 1
  [endLine] => 1
  )
  )
  [attributes:protected] => Array
  (
  [startLine] => 1
  [endLine] => 1
  )
  )
  [attributes:protected] => Array
  (
  [startLine] => 1
  [endLine] => 1
  )
  )
)  
  由此可见,我们需要提取出
  然后进行拼接之后即可发现原始语句是:
四.逻辑分析
通过该库进行语法分析
提取结果
提取危险函数
提取危险函数中存在的变量
从上文中提取此变量的赋值方式
分析出可控结果
输出结果
五.优缺点
  缺点
  对于面向对象的程序进行分析比较弱。
  优点
  适合大批量的自动化分析,可以脱离人工操作进行独立执行


       

                                                    


来源链接: http://drops.wooyun.org/tips/11757
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

 

 

快速回复 返回顶部 返回列表