首页 > Web开发 > 详细

bugku web never_give_up

时间:2021-09-17 16:23:11      阅读:12      评论:0      收藏:0      [点我收藏+]

技术分享图片

打开靶场后先照例查看源码,发现了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

(0)
(0)
   
举报
评论 一句话评论(0
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!