打造自己的php半自动化代码审计工具
作者:admin | 时间:2017-8-26 11:21:13 | 分类:黑客技术 隐藏侧边栏展开侧边栏
一、PHP扩展进行代码分析(动态分析)
基础环境
-
apt-get install php5
-
apt-get install php5-dev
-
apt-get install apache
-
apt-get install mysql
使用PHPTracert
-
mkdir godhead
-
wget https://github.com/Qihoo360/phptrace/archive/v0.3.0.zip
-
unzip v0.3.0.zip
-
cd ./phptrace-0.3.0/extension
-
phpize5
-
./configure --with-php-config=/usr/bin/php-config
-
make & make install
-
cd ../cmdtool
-
make
编辑php.ini,增加
-
extension=trace.so
测试
-
<?php
-
for($i=0;$i<100;$i++){
-
echo $I;
-
sleep(1);
-
}
-
?>
CLI
-
php test.php &
-
ps -axu|grep php
-
./phptrace -p pid
apache
-
curl 127.0.0.1/test.php
-
ps -aux|grep apache
-
./phptrace -p pid
phptrace分析
执行的代码如下
-
<?php
-
function c(){
-
echo 1;
-
}
-
function b(){
-
c();
-
}
-
function a(){
-
b();
-
}
-
a();
-
?>
执行顺序是
-
a>b>c>echo
参数含义
日志输出
-
{"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进行提取,提取过程如下
1.便利所有文件
2.读读取文件
3.提取json,按照seq排序
4.提取type=2的与type=1的进行合并
5.按照level梳理上下级关系存储同一个字典
6.按照seq排序,取出头函数进行输出
7.提取恶意函数往上提取level直到level=0
函数对应如下
-
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]
-
-
}
3.数据查看
通过追踪危险函数,然后将其函数执行之前的关系梳理出来进行输出,然后再进行人工审查。
放上demo
使用XDEBUG
安装
-
apt-get install php5-xdebug
修改php.ini
-
[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图片
优缺点
缺点
人为参与力度较大,无法进行脱离人工的操作进行独立执行。
优点
精准度高,对于面向对象和面向过程的代码都可以进行分析。
二、语法分析(静态分析)
案例:
http://php-grinder.com/
http://rips-scanner.sourceforge.net/
使用php-parser
介绍:
-
http://www.oschina.net/p/php-parser
-
https://github.com/nikic/PHP-Parser/
安装
-
git clone https://github.com/nikic/PHP-Parser.git & cd PHP-Parser
-
curl -sS https://getcomposer.org/installer | php
PHP >= 5.3; for parsing PHP 5.2 to PHP 5.6
-
php composer.phar require nikic/php-parser
PHP >= 5.4; for parsing PHP 5.2 to PHP 7.0
-
php composer.phar require nikic/php-parser 2.0.x-dev
测试
-
<?php
-
include 'autoload.php';
-
use PhpParser\Error;
-
use PhpParser\ParserFactory;
-
-
$code = '<?php eval($_POST[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();
-
}
输出如下
-
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
-
)
-
-
)
-
-
)
由此可见,我们需要提取出
-
[0] => PhpParser\Node\Expr\Eval_ Object
-
[name] => _POST
-
[parts] => Array
-
(
-
[0] => c
-
)
然后进行拼接之后即可发现原始语句是:
-
eval($_POST[c])
逻辑分析
代码解析
1.通过该库进行语法分析
2.提取结果
3.提取危险函数
4.提取危险函数中存在的变量
5.从上文中提取此变量的赋值方式
6.分析出可控结果
7.输出结果
优缺点
缺点
对于面向对象的程序进行分析比较弱。
优点
适合大批量的自动化分析,可以脱离人工操作进行独立执行
作者: ConD0r