Bugku CTF web 16
进入场景,你发现就出现了一段字符串什么都没有。

这个时候没有什么思路,不知道干什么。忽然想起rebots,于是打开御剑去扫描目录,果真扫到了一个.bak结尾的网站。

进入,要下载东西,下载下来一看,是题目要求。

接下来就是代码审计了。我们先大体看一下,就是输入key1和key2两个参数,然后使得他们md5弱类型比较相等,但是他们的值不相等。
然后我们再来仔细看一下代码。发现了这么几个函数:strstr() $_SERVER['REQUEST_URI'] sbustr() str_replace() parse_str()
然后我们再来分析这个函数。strstr(1,2) 函数 查找某个字符串中是否存在某个字符,存在的话就输出字符串中那个字符以及以后的语句。其中1处是进行查找的字符串,2处填入要查找的字符。
$_SERVER['REQUEST_URI'] 函数 显示出当前url路径
strstr($_SERVER['REQUEST_URI'], '?') 这两个函数一起用就会产生输出?及以后的字符串
sbustr(1,2,3) 分割函数 1处填要分割的字符串,2处填从第几位开始分割,3处(选填可以不填) 填入你要分割的长度
str_replace(1,2,3) 替换函数 1处填你要替换什么,2处填你要替换成什么,3处填你要进行替换的字符串
parse_str() 把查询字符串解析到变量中
好了,解释完各个函数源代码大概意思也就出来了。你传入key1和key2两个参数然后使得key1和key2的值不相等但是他们的md5值一样,并且题中对key有过滤,将key替换成空。
绕过str_replace()我们可以使用双写绕过:kekeyy
绕过md5($key1) == md5($key2) && $key1 !== $key2 我们有两种思路。1.我们使用数组,因为md5()无法处理数组,返回值都会之null。2.我们想到了php在处理长的字符串时会转换成科学计数法,于是找两个md5值是0e开头的
最终payload:?kekeyy1=s878926199a&kekeyy2=s155964671a 或者:?kekeyy1[]=1&kekeyy2[]=2

浙公网安备 33010602011771号