---------------------------------------------------------------------
#1 算法剖析篇
-------------
相比以前 索马里的海贼 大牛破解的, 最新版的算法以及做了很大的改进。
可以看到 iv向量由原来的 $rnd = md5(microtime()) 变成了 $rnd = random(32);
如果仅仅是这样的话 ,倒是可以很快逆出来的,
但是,可以看到它增加了
用于判断数据的完整性。我们逆向推导下密文的还原过程。
1. 首先 base64_decode(str_replace(array('-P-', '-S-', '-Z-', '-X-'), array('+', '/', '0x', '0X'), $txt) 进行特殊符号替换和base64解码。
2. 带入 kecrypt.
(由于数学公式不好打 所以上传图片了- -)
结论:
对于密文的前N-6位,第i ,i+1 位 与其所对应的的 明文的 i 位 做异或运算(i为偶数) 结果是一个固定不变的值(Ki^Ki+1)
对于密文的后6位,当两个密文的长度 与32的余数 相等时,其值不变。
也就是说 ,要获取长度为x的明文所对应的密文,只要知道另一个为y的明文所对应的密文即可。其中
-----------------------------------------------
#2 waf绕过
-----------
在/api/js.php中,
调用了,跟到 tag
可以看到 fields table condition order offset pagesize 都无单引号包裹
然而由于
我们只能控制 condition order offset pagesize了
接下来就是绕过 strip_sql了。
这过滤简直可怕。
select任意字符from 以及select xxx都不行,
但是注意,limit后面的$offset.",".$pagesize; 是拼接起来的。
我们这样提交pagesize=from&offset=select xxx&moduleid=2&condition=userid=1 就可以绕过 select * from 的检测,
然后 select{x(name)} 绕过 select xxx。
为了方便 ,开启debug进行报错注入演示。
测试的payload为
一共 193字节。根据前面的公式 (2x+6)%32=(2y+6)%32 我们只要找一个已知明文为17字节的密文即可构造了。
在 公司联系方式这个地方可以很快的找到。