继续分析GitHub上的一个代码审计项目
challenge-1
1 | $users = array( |
这题只能在特定的环境下运行,根源在这里
存在这样一个bug1
2
3
4
5
6[2015-06-20 14:29 UTC] nikic@php.net
Description:
------------
var_dump([0 => 0] === [0x100000000 => 0]); // bool(true)
on all versions: http://3v4l.org/Sjdf8
其实是内部实现的时候:
1 | Bucket *p1, *p2 = NULL; |
result是32位的,而其他的是64位,这样如果我64位数据的低32位都是0就可以绕过了
同时users
数组中能解密的只有第5个,想办法让两个数组相等
Cookie: users[4,294,967,296]=5;users[1]=hund
这样$user===$input
同时由于$input[0]
未赋初值,那就是0了,这样就是admin了
challenge-10
1 |
|
小tricks:
var_dump(‘a’==true); 结果为true
var_dump(‘a’ == 0); 结果为true
所以id
输入一个字母就能够使得!$_GET['id']
为false,同时$id == 0
为true
$data
是从一个文件中得到的结果,这时候想到php伪协议,输入a=php://input
再post数据就行
eregi("111".substr($b, 0, 1), "1114")
结合后面的substr($b, 0, 1)!=4
要通过substr
函数的截断才行
所以设置$b=%00111111
, substr函数会被截断,strlen不会,eregi就能匹配上了。
补充一点php伪协议的知识,参考了LoRexxar师傅的文章。
php中支持的伪协议很多,
1 | file:// — 访问本地文件系统 |
我们最常用的任意文件读取的payload就是用了php://
协议:
1 | php://filter/read=convert.base64-encode/resource=upload.php |
针对php://filter
,官方文档是这样写的:
1 | 名称 描述 |
在我们的payload中,upload.php
就是要过滤的数据流,convert.base64-encode
就是要读链的筛选列表
之所以要base64编码,一般是为了数据传输的方便
官方文档中能够举了如下栗子:
1 |
|
除了base64之外还有其他的一些过滤器,官方文档中有些。
challenge-11
1 |
|
challenge-12
1 |
|
字符串直接拼接
?hello=);eval(phpinfo());//
challenge-13
1 |
|
可能是我对json不是很了解,这里必须都使用双引号才行。
两个不是弱类型的trick:
1 | var_dump(0===false) 为false |