[BJDCTF 2020]easy_md5

TL;DR

  1. php弱类型比较md5碰撞绕过,强类型比较传数组绕过
  2. ffifdyop md5后的值字符串值为’or’6<乱码>,可用于构造sql注入的bypass
  3. 没思路了看看网页源代码、看看响应头

过程

拿到题目链接,放到burp里,发现响应头中的提示:select * from 'admin' where password=md5($pass,true)
[BJDCTF 2020]easy_md5_第1张图片这里绕过需要传入ffifdyop。原理如下:
[BJDCTF 2020]easy_md5_第2张图片之后跳转到一个页面,查看页面源代码拿到php代码如下:

$a = $GET['a'];
$b = $_GET['b'];

if($a != $b && md5($a) == md5($b)){
    header('Location: levell14.php');

这里有一个php的弱类型比较。需要满足变量a与变量b不相等,但a与b的md5值需要相等。因为php的弱类型比较(==),当字符串都0e开头且都是数字时,弱类型比较都等于0。

因此一般两个思路,一是寻找哪些字符串本身不相等,但md5之后都是以0e开头的纯数字,可以写个代码进行遍历碰撞,也可以搜索现成的。第二是传入数组类型的参数,因为md5函数的参数不能是数组(md5不能加密数组),加密数组时会返回空,两个数组加密后两个空,当然相等了。下面给出一些例子:

s1502113478a
0e861580163291561247404381396064
  
s1885207154a
0e509367213418206700842008763514
  
s1836677006a
0e481036490867661113260034900752
  
s155964671a
0e342768416822451524974117254469
  
s1184209335a
0e072485820392773389523109082030
  

其实也不必如此麻烦,因为给了源码,即便bypass,结果也只不过时跳转到levell14.php页面,直接访问即可。

访问后得到php源码如下:


error_reporting(0);
include "flag.php";

highlight_file(__FILE__);

if($_POST['param1']!==$_POST['param2']&&md5($_POST['param1'])===md5($_POST['param2'])){
    echo $flag;
}

这里使用了强类型比较,方法一失效,使用方法二,传入两个数组类型的变量,得到flag。

Reference

https://segmentfault.com/a/1190000039189857

你可能感兴趣的:(CTF刷题,php)