本题考查了:编码、文件包含、通配符绕过、若比较绕过
打开题目发现只有这一句话,看到url通过GET传入id,尝试修改id的值发现怎么改回显都不变,所以看一下源代码
发现这里貌似有个提示,我们访问一下这个页面
114.67.175.224:19072/1p.html
访问完发现直接跳转到bugku的首页,这里应该是被重定向到bugku了,那就直接看源码
view-source:http://114.67.175.224:19072/1p.html
看到源码发现其中一行看起来像是url编码和base64编码混合得到的,所以我们尝试先url解码
url解码完之后看到<!-- -->之间的是base64编码,然后进行base64解码
base64解码之后还需要一次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 !!!";
}
?>
这应该就是真正的源代码了,我们来分析一下
if(!$_GET['id'])
{
header('Location: hello.php?id=1');
exit();
}
这里只要有GET传参,!$_GET['id']就会返回false,if的内容就不会执行,成功绕过
$id=$_GET['id'];
$a=$_GET['a'];
$b=$_GET['b'];
这里告诉我们需要通过GET传入三个参数id、a、b
if(stripos($a,'.'))
{
echo 'no no no no no no no';
return ;
}
`stripos() 函数查找字符串在另一字符串中第一次出现的位置(不区分大小写)`
这里就是查找 '.' 在变量a中第一次出现的位置, 所以变量a中不能含有 '.' 这样stripos()就会返回false就能绕过这个if
$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 !!!";
}
`file_get_contents() 把整个文件读入一个字符串中`
该段代码, 第一行表示已读的方式读取变量a中的文件然后转化成字符串赋值给data, 然后需要满足if中的几个条件就能得到flag
$data=="bugku is a nice plateform!"
data的内容要为"bugku is a nice plateform!" , 就是a里的文件的内容得是这个, 这里可以使用文件包含中的伪协议, data伪协议和input伪协议都可以绕过, 这里我使用data协议(稍微简单一点)
$id==0 and strlen($b)>5
这里需要id=0, 但是这样相当于没有传入id, 这里是若比较让id=0a就能绕过, strlen()函数是返回字符串长度, 那么b的长度要大于5
eregi("111".substr($b,0,1),"1114") and substr($b,0,1)!=4
`eregi()函数在一个字符串搜索指定的模式的字符串,搜索不区分大小写,如果匹配成功返回true,否则,则返回false`
`substr($b,0,1) 返回从字符串b第一位开始的一个字符`
这里是要在"111"拼接上变量b的第一个字符要为"1114", 那么这里需要b是一个以4开头的字符串, 但是下一个条件说b第一个字符不能是4, 这样就矛盾了, 这里可以用通配符进行绕过
`"?"作为通配符可以代表一个任意字符`
所以我们让b的第一位为"?"就可以绕过了,那么综上我们的payload为
?id=0a&a=data://text/plain,bugku is a nice plateform!&b=?12345