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

发布时间 2023-08-18 20:21:56作者: MiracleWolf

一、题目链接

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伪协议既可以用于文件包含也可以用于创建文件。