依旧是bugku的题库,被疯狂教做人orz
extract变量覆盖
1 | <?php |
$_GET获得参数时会打包成数组,而extract()会将数组的键作为变量名,值作为变量值。于是我们可以通过这里修改flag的值
而flie_get_contents()则是取获取参数所对应的文件的内容并转为字符串,于是把flag和shiyan设为空就能确保content和shiyan相等
payload: ?shiyan=&flag=
strcmp比较字符串
1 | <?php |
strmcp()的老漏洞,当数组和字符串比较会返回0,于是这里pyaload: a[]=0
得flag
urldecode二次编码绕过
1 | <?php |
这里就先获取id,和hackerDJ比较,若不相同,再url解码后再次比较,相同就输出flag
这里要注意的是url传参时已经解码过一次了,于是要构造语句二次解码时才为hackerDJ
payload: ?id=%2568ackerDJ
md5()函数
1 | <?php |
这里就是要没md5()前usr和psw不等,md5()后完全相等
用之前的方法,构造数组让md5()返回null或用特殊字符串md5后成科学计数法
payload: ?username[]=1&password[]=2
数组返回NULL绕过
看题目,直接写了?password[]=null就得到flag,不过还是想看看里面是什么
1 | <?php |
两个条件,一个是ereg()的正则匹配,这里可以用%00截断绕过;第二个是password中要有–,所以正常的应该是 ?password=a%00--
然后上面那个为什么能过,ereg()不能处理数组,于是返回null,而null==false但并不是null===false。strpos也是同样,而null也!==false于是出flag
弱类型整数大小比较绕过
1 | $temp = $_GET['password']; |
这道很容易,判断是不是数字,是就结束,不是继续。然后比较大小,大于1336就出flag。这里走弱类型比较漏洞,payload: ?password=1337n
sha()函数比较绕过
1 | <?php |
看了这么多,和之前那道md5()一样,sha()也处理不了数组
payload: ?name[]=1&password[]=2
md5加密相等绕过
1 | <?php |
还是md5的题,QNKCDZO看起来很熟悉,就是md5后成科学计数法的字符之一,于是让a在md5后也成科学计数法就行
payload: ?a=240610708
十六进制与数字比较
1 | <?php |
这题就是输入password里的参数要和number一样,但number全是数字。而ascii码在1到9之间就会返回false结束语句
这里要绕就直接转成16进制,这样就算每个字符转为ascii码也不会在1到9之间,同时也和number相等
payload: ?password=0xdeadc0de
变量覆盖
虽然给我丢了串php啦,但好像和第一题没什么不一样,payload: ?a=&b=
ereg正则%00截断
1 | <?php |
读一遍,和之前的题差不多,就多了个要求字符长度小于8且值大于9999999。一开始想用16进制发现不够,然后想了好久才想到用科学计数法代替
payload: ?password=1e8%00*-*
(这里有点坑,代码里写错了)
strpos数组绕过
1 | <?php |
和前面的题基本一样,用数组绕过strpos,因为是null所以并不完全等于false
payload: ?ctf[]=1
数字验证正则绕过
1 | <?php |
这题有点问题,post个password=都能出flag,不过还是认真分析一下
[[:graph:]]匹配的是非空格非TAB外字符,于是0 >= preg_match(‘/^[[:graph:]]{12,}$/‘, $password) 就是要输入password字符串长度大于12
然后’/([[:punct:]]+|[[:digit:]]+|[[:upper:]]+|[[:lower:]]+)/‘这个匹配任意一个标点、数字、大写或小写字母,6 > preg_match_all($reg, $password, $arr)这里就是要求匹配六次以上
下面循环数组那块就是要求要有3种以上不同种类字符在password中
最后还要等于字符的42,于是这里不能用str去比较绕过,只能用纯数字,于是就想到16进制或科学计数法
payload: ?password=42.0e+0000000||420.00000000e-1||0x2a.00000000000000000