php扩展 waf,基于PHP扩展的WAF实现

0x00 前言

最近上(ri)网(zhan)上(ri)多了,各种狗啊盾啊看的好心烦,好多蜜汁shell都被杀了,搞的我自己也想开发这么一个斩马刀,顺便当作毕设来做了。

未知攻,焉知防。我们先来看看shell们都是怎么躲过查杀的:加密、变形、回调、隐藏关键字……总之就是一句话,让自己变得没有特征,这样就可以躲过狗和盾的查杀。但是万变不离其宗,无论怎么变形,最终都会回到类似这样的格式:

1

$_GET($_POST)

分为执行数据部分($_GET)和传递数据的部分($_POST),也就是说,无论怎么变形,在执行的过程中都会变成这个样子,接下来还是去执行类似system(), exec(), eval()等等函数,那么我们就直接定位到这里,检测该脚本是否调用危险函数,或是在脚本调用这些函数的时候进行分析,判断该脚本是否为非法用户的shell,会取到很不错的防御效果。

0x01 如何获取先机

既然分析出来了问题的根结,那么下一步就是要控制住这些危险函数的入口点,即system()等函数的底层入口,就像Windows API中hook掉zw系列函数一样,我们也要hook掉system()这些函数。

这里我们需要用到PHP Extension, 即PHP扩展,位于PHP内核zend和PHP应用代码之间,很明显,扩展可以监控应用层代码的执行细节,也可以调用内核提供的ZEND API接口,包括禁用类、禁用函数等等。图为PHP结合其他必要组件的基本结构。

802038bf5c675cdb9afee8c8ff92c622.png

在ZEND中提供了接口供我们进行这样的操作,通过zend_set_user_opcode_handler就可以达到目的,根据某大牛所说,只需要hook三个OPCODE即可。

1

2

3

ZEND_INCLUDE_OR_EVAL        处理eval()、require等

ZEND_DO_FCALL               函数执行system()等

ZEND_DO_FCALL_BY_NAME       变量函数执行 $func ="system";$func();等

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值