bugku web never_give_up
打开靶场后先照例查看源码,发现了1p.html这个页面
进入这个文件,注意需要从源码的页面进入该页面,否则会显示另一个界面(暂不明白原理)
根据变量Words的形式,先进行URL解码,再进行部分base64解码后,发现解码后的字符又是URL编码格式,所以再次进行URL解码
最后得出一段代码,整理过后如下所示
接下来便是代码审计环节:
如果参数id为0或者为null时自动定位到hello.php?id=1
如果参数a的第二位字符为.时,输出no no no no no no no,结合之后的代码,个人认为这里是提示我们使用php伪协议
tips:stripos()与strpos()的区别是前者不区分大小写
这几行代码是核心部分:
①file_get_contents()函数可以将整个文件读入一个字符串中。源码中变量 $data 是由file_get_contents()函数读取变量 $a
的值而得,所以 $a 的值必须为数据流,可是使用php伪协议中的php://input来访问原始请求数据中的只读流,也就是说我们可以在报文主体中post “bugku is a nice plateform!”,通过php://input来访问。
②$id == 0,这显然与前文代码中的id不为0相矛盾,需要使用绕过,根据php的弱类型特点,我们可以使id = 0e123。
③eregi()函数进行不区分大小写的正则表达式匹配,substr(string,start,len)函数用来截取字符串。此处的意思是"111"与substr($b,0,1)拼接得到的字符串需要与"1114"相匹配,同时substr($b,0,1) != 4又进行限制。这时我们应该想到ereg() 函数或 eregi() 函数存在空字符截断漏洞,简单介绍一下,就是参数中的正则表达式或者匹配字符串遇到空字符则截断丢弃后面的数据,加上strlen($b) > 5这个限制条件,我们可以使b = %00abcde,此时字符串长度为6,因为通过get请求传参接收的是已经被URL解码过的值,此时%00已经被解码为null字符了
综合以上,我们就可以构建payload:?id=0e123&a=php://input&b=%00abcde,同时在报文主体中加上"bugku is a nice plateform!"
bugku web never_give_up
原文:https://www.cnblogs.com/r1kka/p/15302872.html