乌云puzzle3 思路记录总结

0x00 线性同余算法计算随机数

看懂这篇文章:http://www.mscs.dal.ca/~selinger/random/

关键点在:

源码中先生成6位secret_key,再生成的随机token。我们可以逆向算一算:

于是我们只要生成一个超过32位的随机数连续序列,就可以计算出前面的随机数token了。
由于可能存在需要加1的情况,需要简单的爆破。

首先用同一个session生成一段随机数序列:

观察看到下列源码,发现每次csrf_token 用掉之后,会再次生成一个,于是可以多生成几个随机数序列。

python代码生成随机数序列为:

可以通过这个csrf_serial算出一个secret_key:

然后就可以fuzz下每一位了,有可能减1,最终可以得到一个PHPSESSION和一个secrect_key,这样就可以进行下一步了。

这里用到了hmac加密,算法在python中同样实现为:

0x01 json utf-8 编码绕过检测

得到secret_key后,可以执行一个任意命令,但是必须是无参的:

这里使用get_defined_functions函数,得到自定义函数:

注意: 加上X-Requested-With : XMLHttpRequest 头,才能得到json输出数据。

有个fd_show_show_source函数,执行可以得到flag.php源码:

目标很明确,绕过限制得到admin权限,想了半天,看懂代码。发现有个很奇怪的地方:

这里就可以想象到可以使用json什么手段,绕过前面的检测。寻寻觅觅,发现json支持unicode编码,测试如下:

程序输出:

0x02 大小写绕过函数调用

得到user权限后,还要绕过这么一句话:

这样才能调用read函数读取任意文件,整理思路:

进一步想到:

于是测试了下:

bingo~成功调用并输出代码。

于是就成功绕过限制得到admin权限了,具体代码请查看github,关键点代码如下:

0x03 说在最后

在我做到这一步的时候,官方writeup出来了,有人已经做出来了。环境也随之关闭了~
当时读了几个文件,没找到flag在哪,正想着多读几个配置文件,就关了~~

看了writeup后,最后一起读了那么多linux配置文件然后得到结果,思路不错。
贴上链接,mark~
https://www.91ri.org/7911.html

0x04 源码

https://github.com/angelwhu/ctfs/blob/master/wooyun_puzzle_2016_3/php_rand.py