这道题全程我都是用bp做的
拿到题目
我们查看页面源代码得到
代码审计
我们要用get传入id和gg两个参数,id和gg的值要求不能相等,但是id和gg的md5强比较必须相等
if(isset($_GET['gg'])&&isset($_GET['id'])) {$id=$_GET['id'];$gg=$_GET['gg'];if (md5($id) === md5($gg) && $id !== $gg) {echo 'You got the first step';
进入下一个循环体中,我们看到了这个函数
is_numeric($passwd)
s_numeric() 函数用于检测变量是否为数字或数字字符串。
PHP 版本要求:PHP 4, PHP 5, PHP 7
如果指定的变量是数字和数字字符串则返回 TRUE,否则返回 FALSE,注意浮点型返回 1,即 TRUE。
if(isset($_POST['passwd'])) {$passwd=$_POST['passwd'];if (!is_numeric($passwd)){if($passwd==1234567){echo 'Good Job!';highlight_file('flag.php')
所以这串代码是告诉我们如果post个passwd参数,且passwd必须是数字或数字字符串,passwd的值必须与1234567相等,这里就是php的弱绕过,当我们传入1234567a时,就是字符型和数字型进行比较,所以当传入的值passwd=123456a的时候:则会先把1234567admin转化成1234567再进行比较。
我们知道,md5强比较绕过有两种方法,第一种数组绕过,因为md5无法处理数组,返回null时即为true,第二种就是用两个完全相同的md5值绕过,即
array1=%4d%c9%68%ff%0e%e3%5c%20%95%72%d4%77%7b%72%15%87%d3%6f%a7%b2%1b%dc%56%b7%4a%3d%c0%78%3e%7b%95%18%af%bf%a2%00%a8%28%4b%f3%6e%8e%4b%55%b3%5f%42%75%93%d8%49%67%6d%a0%d1%55%5d%83%60%fb%5f%07%fe%a2
array2=%4d%c9%68%ff%0e%e3%5c%20%95%72%d4%77%7b%72%15%87%d3%6f%a7%b2%1b%dc%56%b7%4a%3d%c0%78%3e%7b%95%18%af%bf%a2%02%a8%28%4b%f3%6e%8e%4b%55%b3%5f%42%75%93%d8%49%67%6d%a0%d1%d5%5d%83%60%fb%5f%07%fe%a2
所以,我们用get传入?id[]=1&gg[]=2
然后用bp抓包,传入passwd=1234567a,并将get请求变更为post
需要注意的点时,此时如果重发包过去,页面是没有反应的
我们需要将原先的get传入的参数复制了放在请求行上
即
因为变更请求时,bp会将get的参数变为post,所以我们需要重新写入
这样我们就得到了flag
总结:
此题不难,但是注意和收获的地方很多
收获:
1.is_numeric() 函数用于检测变量是否为数字或数字字符串,当为浮点数时,返回值为1,即为true
2.php的弱绕过
注意的点:
我们在用bp变更包的请求方式时,如果原先已经传入了get参数,我们变更为post请求时,bp会把原先的get传入的参数和后面加上的参数一样转换成post参数,所以我们需要将原先get传入的参数放在包的请求行上,使其成为get参数,然后才能进行重发包