bugku--never_give_up

考察知识点:

1.对编码的敏感度

2.php伪协议(以及POST流)

3.通配符

4.弱比较

初步工作

进入页面,是这个样子:

查看源代码,发现有提示:

 那我们访问

ip/1p.html        我这里就是http://114.67.175.224:10713/1p.html

但是我们访问后,发现网站似乎被重定向了,是一个公网地址,我们要做的题目肯定不在公网ip里面,那我们就可以访问一下

view-source:114.67.175.224:10713/1p.html

可以看到源代码

 有一串字符,我们看到有点像url解码,又像base解码,我们可以先试着拿去url解码一下

  

解码完之后发现是这样的:

"<script>window.location.href='http://www.bugku.com';</script> 
<!--JTIyJTNCaWYoISUyNF9HRVQlNUInaWQnJTVEKSUwQSU3QiUwQSUwOWhlYWRlcignTG9jYXRpb24lM0ElMjBoZWxsby5waHAlM0ZpZCUzRDEnKSUzQiUwQSUwOWV4aXQoKSUzQiUwQSU3RCUwQSUyNGlkJTNEJTI0X0dFVCU1QidpZCclNUQlM0IlMEElMjRhJTNEJTI0X0dFVCU1QidhJyU1RCUzQiUwQSUyNGIlM0QlMjRfR0VUJTVCJ2InJTVEJTNCJTBBaWYoc3RyaXBvcyglMjRhJTJDJy4nKSklMEElN0IlMEElMDllY2hvJTIwJ25vJTIwbm8lMjBubyUyMG5vJTIwbm8lMjBubyUyMG5vJyUzQiUwQSUwOXJldHVybiUyMCUzQiUwQSU3RCUwQSUyNGRhdGElMjAlM0QlMjAlNDBmaWxlX2dldF9jb250ZW50cyglMjRhJTJDJ3InKSUzQiUwQWlmKCUyNGRhdGElM0QlM0QlMjJidWdrdSUyMGlzJTIwYSUyMG5pY2UlMjBwbGF0ZWZvcm0hJTIyJTIwYW5kJTIwJTI0aWQlM0QlM0QwJTIwYW5kJTIwc3RybGVuKCUyNGIpJTNFNSUyMGFuZCUyMGVyZWdpKCUyMjExMSUyMi5zdWJzdHIoJTI0YiUyQzAlMkMxKSUyQyUyMjExMTQlMjIpJTIwYW5kJTIwc3Vic3RyKCUyNGIlMkMwJTJDMSkhJTNENCklMEElN0IlMEElMDklMjRmbGFnJTIwJTNEJTIwJTIyZmxhZyU3QioqKioqKioqKioqJTdEJTIyJTBBJTdEJTBBZWxzZSUwQSU3QiUwQSUwOXByaW50JTIwJTIybmV2ZXIlMjBuZXZlciUyMG5ldmVyJTIwZ2l2ZSUyMHVwJTIwISEhJTIyJTNCJTBBJTdEJTBBJTBBJTBBJTNGJTNF-->" 

 

这个<!--  .....  -->里面的内容就非常像base编码了,先试一下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-->" 

可以隐约看到有一些字母,但还是%22%3b什么的很多东西,很像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($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,如何实现呢,一句句来分析

if(!$_GET['id'])
{
	header('Location: hello.php?id=1');
	exit();
}

如果不存在GET传参的id就跳转到 hello.php?id=1并退出程序

这个简单,我们直接给id传参就可以绕过


 

$id=$_GET['id'];
$a=$_GET['a'];
$b=$_GET['b'];
if(stripos($a,'.'))// $a no have .
{
	echo 'no no no no no no no';
	return ;
}

 分别三个GET传参,然后匹配$a 中是否含有符号.(点),绕过就是符号不含.就行

stripos就是匹配 $a 中第一次匹配到的 .


 

$data = @file_get_contents($a,'r');

 向变量$data写入$a的数据,就是$data=$a的意思,但是这里使用了file_get_contents这个函数,所以我们要利用地址的形式,形如http://  或者  php://

其中php://就是php的伪协议

伪协议就是小众协议的意思,比如php的伪协议只有php认识

这次就利用php伪协议的一种

php://input

他接受POST流传输的数据,而不是POST表单,什么意思?

我这里再仔细讲一遍:

关于POST流的问题

 这里使用BURP进行讲解

正常GET传参数据包:

 

POST传参数据包:

 

POST流传参数据包:

 

是不是觉得和POST传参数据包没有区别,注意看POST流数据包少了一句

 Content-Type: application/x-www-form-urlencoded

 这个就是表单,所以区别POST传参和传输POST流的主要区别就是有无表单

所以接下来看下一句代码

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了

$data="bugku is a nice plateform!"

这里使用php伪协议就可以实现。 


$id==0 因为传入id=0会被认为没有传参,所以我们传入id=0a就可以满足

这里考到了弱比较

”0aaaa“=="0"是成立的,因为数字和字母不可比较,只要字母前面的数字全一样就可以

比如:

”768sfaf“ == "768"

"123as"  不等于  ”12asd“


strlen($b)>5     就是变量$b的长度大于5 


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

eregi()匹配函数,匹配到则是True

"111".substr($b,0,1)  ->  拼接 “111”和  $b的第一个字符  (.是拼接字符串的意思)

比如$b=4321    那么  "111".substr($b,0,1) 就是1114


substr($b,0,1)  ->这就和上面一句矛盾了呀,第一个数字又要等于4又不能等于4怎么办?

方法一:

使用*通配符   只要传入$b=*12345就可以满足啦

*代表任意字符

最终payload:

 不要漏掉最下面的bugku is a nice plateform!

如果哪里写的不好,或者哪里不明白的欢迎评论区留言

 

 

  • 19
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值