客串逆向工程,一瞬获取悬镜WAF规则
0x00引言 悬镜是我见过最恶心的WAF之一,这个拦截那个拦截,根本不搞语法分析,见到不对劲的就拦截,根本绕不过。 我的意思并不是觉得它做的太好了所以我觉得恶心,不是这样的。我就是单纯很不服气,像长亭科技的那个SQLCHOP搞的语法分析,精准拦截payload我绕不过是我菜,我输得心服口服。像悬镜这样看见/*就拦截完全是作弊嘛。 除此之外悬镜的拦截规则也很奇妙,比如说我来个id=1'它要拦截,但是id=1111'就不拦截,Union注入的测试不拦截,但是真的要查点什么敏感的东西又要拦截。这究竟是什么奇葩规则啊啊啊啊啊啊。 因此我很想一窥悬镜的规则,于是从一个搞Web的跨界逆向,抄起IDA一探究竟 0x01寻找规则 打开悬镜的目录,我们可以根据名字很容易找libruleset.so文件,看起来就是处理规则的。拖到IDA里一下找到了函数 这说明那个/usr/share/xmirror/rules/apache/rule.db就是规则,哈哈哈直接放在db里面结果被我找到了。 可惜事情并没有这么简单 当我打开这个DB的时候发现这个只是配置文件,用于描述哪些防护策略生效了而并没有描述规则的具体内容 后来我多尝试了几个so文件后发现有个叫做 mod_xmirrorsec.so的文件内有玄机有个叫做get_rule_set的函数尤为起眼。 这个函数直接读入 xmirror_rule.so这个文件,是直接读而不是load,而这个文件之前用IDA无法识别,很显然这就是真正的规则! 0x02编写程序,读取规则 这个代码并不复杂,无非就是读取并解密。因此剩下要做的事情很简单,抄抄改改代码的事嘛。 #include <iostream> #include <openssl/aes.h> using namespace std ; unsigned char ivec[ 16 ]; unsigned