最新消息:欢迎大家关注安全工具箱微信公众号,域名信息查询,微信搜索安全工具箱添加关注即可,或访问在线安全工具箱

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

代码审计 表哥C 1090浏览 0评论

一、PHP扩展进行代码分析(动态分析)

基础环境

  1. apt-get install php5
  2. apt-get install php5-dev
  3. apt-get install apache
  4. apt-get install mysql

使用PHPTRACERT

  1. mkdir godhead
  2. wget https://github.com/Qihoo360/phptrace/archive/v0.3.0.zip
  3. unzip v0.3.0.zip
  4. cd ./phptrace-0.3.0/extension
  5. phpize5
  6. ./configure --with-php-config=/usr/bin/php-config
  7. make & make install
  8. cd ../cmdtool
  9. make

编辑php.ini,增加

  1. extension=trace.so

测试

  1. <?php
  2. for($i=0;$i<100;$i++){
  3.    echo $I;
  4.    sleep(1);
  5. }
  6. ?>

CLI

  1. php test.php &
  2. ps -axu|grep php
  3. ./phptrace -p pid

APACHE

  1. curl 127.0.0.1/test.php
  2. ps -aux|grep apache
  3. ./phptrace -p pid

PHPTRACE分析

执行的代码如下

  1. <?php
  2. function c(){
  3.    echo 1;
  4. }
  5. function b(){
  6.    c();
  7. }
  8. function a(){
  9.    b();
  10. }
  11. a();
  12. ?>

执行顺序是

  1. a>b>c>echo

参数含义

11111

日志输出

  1. {"seq":0, "type":1, "level":1, "func":"{main}", "st":1448387651119445, "params":"", "file":"/var/www/html/2.php", "lineno":11 }
  2. {"seq":1, "type":1, "level":2, "func":"a", "st":1448387651119451, "params":"", "file":"/var/www/html/2.php", "lineno":11 }
  3. {"seq":2, "type":1, "level":3, "func":"b", "st":1448387651119452, "params":"", "file":"/var/www/html/2.php", "lineno":9 }
  4. {"seq":3, "type":1, "level":4, "func":"c", "st":1448387651119453, "params":"", "file":"/var/www/html/2.php", "lineno":6 }
  5. {"seq":4, "type":2, "level":4, "func":"c, "st":1448387651119457, "return":"NULL", "wt":4, "ct":4, "mem":48, "pmem":144 }
  6. {"seq":5, "type":2, "level":3, "func":"b, "st":1448387651119459, "return":"NULL", "wt":7, "ct":6, "mem":48, "pmem":144 }
  7. {"seq":6, "type":2, "level":2, "func":"a, "st":1448387651119459, "return":"NULL", "wt":8, "ct":8, "mem":80, "pmem":176 }
  8. {"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进行提取,提取过程如下
1.便利所有文件
2.读读取文件
3.提取json,按照seq排序
4.提取type=2的与type=1的进行合并
5.按照level梳理上下级关系存储同一个字典
6.按照seq排序,取出头函数进行输出
7.提取恶意函数往上提取level直到level=0
函数对应如下

  1. list1={
  2.     level1:[seq,type,func,param,return]
  3.     level2:[seq,type,func,param,return]
  4.     level3:[seq,type,func,param,return] #eval
  5.     level4:[seq,type,func,param,return]
  6. }

3.数据查看

通过追踪危险函数,然后将其函数执行之前的关系梳理出来进行输出,然后再进行人工审查。

放上demo

11111

使用XDEBUG

安装

  1. apt-get install php5-xdebug

修改php.ini

  1. [xdebug]
  2. zend_extension = "/usr/lib/php5/20131226/xdebug.so"
  3. xdebug.auto_trace = on
  4. xdebug.auto_profile = on
  5. xdebug.collect_params = on
  6. xdebug.collect_return = on
  7. xdebug.profiler_enable = on
  8. xdebug.trace_output_dir = "/tmp/ad/xdebug_log"
  9. xdebug.profiler_output_dir = "/tmp/ad/xdebug_log"

放上几个demo图片

11111

优缺点

缺点

人为参与力度较大,无法进行脱离人工的操作进行独立执行。

优点

精准度高,对于面向对象和面向过程的代码都可以进行分析。

二、语法分析(静态分析)

案例:
http://php-grinder.com/
http://rips-scanner.sourceforge.net/

使用PHP-PARSER

介绍:

  1. http://www.oschina.net/p/php-parser
  2. https://github.com/nikic/PHP-Parser/

安装

  1. git clone https://github.com/nikic/PHP-Parser.git & cd PHP-Parser
  2. curl -sS https://getcomposer.org/installer | php

PHP >= 5.3; for parsing PHP 5.2 to PHP 5.6

  1. php composer.phar require nikic/php-parser

PHP >= 5.4; for parsing PHP 5.2 to PHP 7.0

  1. php composer.phar require nikic/php-parser 2.0.x-dev

测试

  1. <?php
  2. include 'autoload.php';
  3. use PhpParser\Error;
  4. use PhpParser\ParserFactory;
  5. $code = '<?php  eval($_POST[c])?>';
  6. $parser = (new ParserFactory)->create(ParserFactory::PREFER_PHP7);
  7. try {
  8.    $stmts = $parser->parse($code);
  9.    print_r($stmts);
  10.    // $stmts is an array of statement nodes
  11. } catch (Error $e) {
  12.    echo 'Parse Error: ', $e->getMessage();
  13. }

输出如下

  1. Array
  2. (
  3.    [0] => PhpParser\Node\Expr\Eval_ Object
  4.        (
  5.            [expr] => PhpParser\Node\Expr\ArrayDimFetch Object
  6.                (
  7.                    [var] => PhpParser\Node\Expr\Variable Object
  8.                        (
  9.                            [name] => _POST
  10.                            [attributes:protected] => Array
  11.                                (
  12.                                    [startLine] => 1
  13.                                    [endLine] => 1
  14.                                )
  15.                        )
  16.                    [dim] => PhpParser\Node\Expr\ConstFetch Object
  17.                        (
  18.                            [name] => PhpParser\Node\Name Object
  19.                                (
  20.                                    [parts] => Array
  21.                                        (
  22.                                            [0] => c
  23.                                        )
  24.                                    [attributes:protected] => Array
  25.                                        (
  26.                                            [startLine] => 1
  27.                                            [endLine] => 1
  28.                                        )
  29.                                )
  30.                            [attributes:protected] => Array
  31.                                (
  32.                                    [startLine] => 1
  33.                                    [endLine] => 1
  34.                                )
  35.                        )
  36.                    [attributes:protected] => Array
  37.                        (
  38.                            [startLine] => 1
  39.                            [endLine] => 1
  40.                        )
  41.                )
  42.            [attributes:protected] => Array
  43.                (
  44.                    [startLine] => 1
  45.                    [endLine] => 1
  46.                )
  47.        )
  48. )

由此可见,我们需要提取出

  1. [0] => PhpParser\Node\Expr\Eval_ Object
  2. [name] => _POST
  3. [parts] => Array
  4.                                        (
  5.                                            [0] => c
  6.                                        )

然后进行拼接之后即可发现原始语句是:

  1. eval($_POST[c])

逻辑分析

代码解析

1.通过该库进行语法分析
2.提取结果
3.提取危险函数
4.提取危险函数中存在的变量
5.从上文中提取此变量的赋值方式
6.分析出可控结果
7.输出结果

优缺点

缺点

对于面向对象的程序进行分析比较弱。

优点

适合大批量的自动化分析,可以脱离人工操作进行独立执行

 

转载请注明:安全工具箱 » 打造自己的PHP半自动化代码审计工具

发表我的评论
取消评论
表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址