[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)
响应头中有提示这里绕过需要传入ffifdyop。原理如下:
copy来的原理之后跳转到一个页面,查看页面源代码拿到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源码如下:

<?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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值