题目来源:moectf-WEB。
首先打开给出的网址:网址呈现的代码如下,而且题目中说了,提示我们绕过md5验证。
<?php
error_reporting(0);
include_once "flag.php";
$a=$_GET['a'];
$b=$_POST['b'];
if(isset($a)){
if($a!=$b&&md5($a)===md5($b)){
echo $flag;
}else{
echo 'try again';
}
}else{
highlight_file(__FILE__);
}
有一些编程基础的一定会注意到那个if条件判断句。
if($a!=$b&&md5($a)===md5($b))
而且注意到两个变量a,b。
$a=$_GET['a']; //这个说明a变量是从我们发出的get请求中的参数a的值
$b=$_POST['b']; //同理b变量是我们发出的post请求的值
那么问题来了,我们怎样同时向浏览器发送get和post请求呢?
错误想法:由于python中的session有保存登陆状态的功能,我就想着看看能不能先用session发送一个get请求,然后再带上post的参数b发送post请求。代码如下:
import requests session = requests.session() url='http://47.98.215.112:78/?a=' //注意:这里还未填充值,因为我们还未设计到绕过md5的步骤,现在正在解决怎么同时发送get和post请求的问题。 data = { b:'' //同理:这里也仍然未填充数值。 } comment = requests.post(url=url, data=data) print(comment.text)
但是:这种想法是错误的,这个无法完成。
正确的方法是使用HackBar这个浏览器扩展。
但是这个HackBar开始收费了,网上有针对特定浏览器版本的破解版,但是我懒得折腾了。直接找了一个免费版替代品--HackBar Quantum。
打开firefox,输入:“hackbar”的搜索结果 – Firefox 附加组件(zh-CN) 安装即可。安装完左侧就出来功能条了。
通过这个工具,我们才可以方便的向浏览器同时发送get和post请求。
下面解决第二个问题:怎么绕过md5验证。
参考下面这篇文章:大佬汇总的很好。(9条消息) 总结ctf中 MD5 绕过的一些思路_y0un9er-CSDN博客_ctf md5绕过
我们针对此题目的类型选择:数组绕过。
即传入:
a[]=a&b[]=b
先在浏览器上输入网址,并且先传入一个参数:先把get请求参数a传入。然后点击回车。
然后在这再把post携带的参数传入。即可得到flag。