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


 

posted @ 2021-01-31 20:37  _serendipity  阅读(91)  评论(0)    收藏  举报