跳转至

项目介绍

项目介绍

对于自动化漏洞检测,目前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 官方资料

php taint官方介绍及对应最新代码

从官方文档上看,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,正常流量请求即可 (流量覆盖是检测的前提)
  • 对业务几乎无影响 (除扩展冲突的情况)
  • 低误报 (适合安全技术不高的用户 如功能测试同学使用)

taint改造

Back to top