後臺登錄(實驗吧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
將十六進制的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';
結果