Bugku never_give_up

本题考查了:编码、文件包含、通配符绕过、若比较绕过

 

 打开题目发现只有这一句话,看到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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值