项目介绍
项目介绍
对于自动化漏洞检测,目前IAST技术是公认的解决方案,但基于PHP的IAST开源项目,目前还没有特别好的... 因此和团队小伙伴 在这里做了一些调研和实践,希望可以做一套面向PHP的IAST系统,满足php项目在测试环节的自动化安全测试,实现低误报的前提下,高检出
项目调研
IAST技术主要是通过插桩技术,监控每个请求的数据流执行情况,进而确认是否存在安全漏洞,其实现最早可追溯到Taint-0.3.0(A XSS codes sniffer) released - 风雪之隅 (laruence.com)php大神鸟哥做的php taint,经过10多年的迭代,仍存在一些问题,后人不断在此基础上进行二次开发 taint检测基本原理及二次开发PHP 运行时漏洞检测 ,主要思路直接修改taint扩展进行改造和使用php脚本进行功能完善。
用到的类似技术项目,如奇虎360 的phptrace
PHP扩展
技术实现主要借助PHP扩展,在扩展中标记污点变量,跟踪其运行,确认是否触发危险操作,详细的php内核开发可以参考深入理解PHP内核和PHP内核和原生扩展开发
需要知道的几个基础知识
PHP生命周期
PHP主程序在运行通过PHP扩展,丰富和完善其功能
扩展可以事先进行注册,php主程序在不同阶段进行调用扩展的功能函数
如模块加载(MINIT)时,调用扩展实现的PHP_MINIT函数
如在每次请求时(RINIT),调用扩展实现的 PHP_RINIT 函数
PHP基础结构
PHP内核中一共有8种类型变量
IS_NULL:空值类型
IS_LONG:长整型
IS_DOUBLE:双精度浮点数型
IS_BOOL:布尔型
IS_ARRAY:数组型
IS_OBJECT:对象型
IS_RESOURCE:资源型
IS_STRING:字符型
其中,IS_RESOURCE 用于表示一个资源类型,通常用于处理底层资源(如文件句柄、数据库连接等)。
由于出现常规安全漏洞的变量主要是字符串类型,对应的结构体 zend_string
struct _zend_string {
zend_refcounted_h gc; //
zend_ulong h;
size_t len;
char val[1];
};
继续查找 zend_refcounted_h 类型
grep -rnw '/www/server/php/72/include/php/' -e 'zend_refcounted_h'
//zend_value中的成员,存放内存回收相关信息
typedef struct _zend_refcounted_h {
uint32_t refcount; /* reference counter 32-bit */
union {
struct {
ZEND_ENDIAN_LOHI_3(
zend_uchar type,
zend_uchar flags, /* used for strings & objects */
uint16_t gc_info) /* keeps GC root number (or 0) and color */
} v;
uint32_t type_info;
} u;
} zend_refcounted_h;
污点标记位选择是 gc.u.v.flags 对应的操作宏是
#define GC_FLAGS(p) (p)->gc.u.v.flags
扩展创建
使用php自带的 ext_skel程序生成扩展
wget https://www.php.net/distributions/php-7.2.15.tar.gz
tar zxvf php-7-2.15.tar.gz
cd php-7.2.15/ext
./ext_skel -h
cd /home/
/home/php2/php-7.2.15/ext/ext_skel --extname=sidu --skel=/home/php2/php-7.2.15/ext/skeleton
创建一个名为sidu的扩展程序 ,整体结构如图所示
- config.m4 编译配置信息
- Php_sidu.h 扩展的头文件 不要修改文件名
- Sidu.c 扩展具体代码
- Sidu.php 测试扩展的php文件
编译扩展
cd /home/sidu
/www/server/php/72/bin/phpize
./configure --with-php-config=/www/server/php/72/bin/php-config
make && make install
注: PHP环境是使用宝塔安装的,安装路径在/www/server/php/72/,自己环境需要自行进行修改
php cli测试扩展
php -dextension=sidu.so sidu.php
PHP代码各位师傅要能看懂,是咱们学习PHP扩展的基础
这个代码就是调用扩展编写的confirm_sidu_compiled
php web下测试扩展
在php.ini 开启扩展,并重置配置信息
宝塔下的操作如下, 最后在服务面板 点击 重载配置 生效
将sidu.php放到web目录下 进行访问查看执行结果
phpinfo() 查看 多了一个sidu的扩展项目
php taint项目
有了前面的关于PHP扩展的基础后,继续学习PHP taint项目
学习一个新东西,一定要利用互联网/AI技术进行大量搜索资料,将会少走很多弯路,尤其是优秀的项目,网上资料应该都是比较齐全的
相关资料
php 官方资料
从官方文档上看,taint主要工作包括 污点标记、污点传递、污点删除、污点检测 4个部分,污点标记主要是对GPC参数进行标记,传递主要是对字符串操作时,进行传递,当遇到安全过滤函数时,删除污点,最后在危险操作函数如执行命令函数检测污点。
注: 由于taint是2012年发布的0.0.1版本,2020年发布的最新2.1.0版本,中间经过无数次迭代,官方文档并未及时更新,与最新版本代码存在比较大的差异,看官要注意,一起以code为准。
海量资料
可以说php taint最早的交互式安全测试,所以国内外有大量的使用者,网上的资料更是不计其数
基础介绍 其参考文档很有价值的, 使用PHP安全检测拓展Taint检测你的PHP代码写的相对深入,说出来taint的一些不足,只是时间有点老,参考的代码未必是taint最新版本, taint检测基本原理及二次开发 提出了二次开发的思路和部分代码,如每种漏洞类型一个标记,对json,base64等操作函数进行污点跟踪等。 PHP 运行时漏洞检测非常完善的二次开发,需要部署php等程序,相对繁琐,适合在测试环境使用。
项目学习
php taint是PHP的扩展,通过标记GPC请求参数,在关键函数处检测标记,能够检测xss漏洞,同时也可以检测SQL注入、命令注入等漏洞。
taint 安装
安装与其他扩展一致
wget https://pecl.php.net/get/taint-2.1.0.tgz
tar zxvf taint-2.1.0.tgz
cd taint-2.1.0
/www/server/php/72/bin/phpize
./configure --with-php-config=/www/server/php/72/bin/php-config
make && make install
ls -lh /www/server/php/72/lib/php/extensions/no-debug-non-zts-20170718/
taint 测试
测试代码
<?php
$a = trim($_GET['a']);
$file_name = '/tmp' . $a;
$output = "Welcome, {$a} !!!";
$var = "output";
$sql = "Select * from " . $a;
$sql .= "ooxx";
echo $output;
print $$var;
include($file_name);
mysql_query($sql);
?>
检出效果
taint的优势
- 不需payload,正常流量请求即可 (流量覆盖是检测的前提)
- 对业务几乎无影响 (除扩展冲突的情况)
- 低误报 (适合安全技术不高的用户 如功能测试同学使用)