題目
做法
啟動靶機,打開給出的網址
隨便輸點東西進去,測試一下
輸入1、1’、1"判斷SQL語句閉合方式
輸入以上兩個都是以下結果
但是,輸入1’時,出現的是另外結果
輸入1,1"時,SQL語句沒有報錯,只是提示我們輸入的值是不對的,而輸入1’時卻有截然不同的結果,因此我們可以先假設SQL語句閉合方式是單引號
注:以下sql語句如’1" ’ 實際上是’1"’ ,這里只是為了快速區分
(1)一般情況下,SQL語句閉合方式為單引號
當用戶名為1時,形成的sql語句是
select * from table_name where username=‘1’ and password=‘123’;
當用戶名為1"時,形成的sql語句是正確的
select * from table_name where username='1" ’ and password=‘123’;
當字符串內需要包含雙引號時,除了使用轉義字符外,也可以使用一對單引號來包括字符串。此時字符串內的雙引號被視為普通字符,無需特殊處理
同理,當字符串內需要包含單引號時,除了使用轉義字符外,也可以使用一對雙引號來包括字符串。此時字符串內的單引號被視為普通字符,無需特殊處理
補充
使用(轉義字符)來判斷SQL注入的閉合方式
原理:當閉合字符遇到轉義字符時,會被轉義,那么沒有閉合符的語句就不完整了,就會報錯,通過報錯信息我們就可以推斷出閉合符。
分析報錯信息:看\斜杠后面跟著的字符,是什么字符,它的閉合字符就是什么,若是沒有,則為數字型。
(但是在本題中有兩個變量,這個方法不太適用)
當用戶名為1’時,形成的sql語句是錯誤的
select * from table_name where username=‘1’ 'and password=‘123’;
第一個單引號和第二個單引號形成了新的閉合,剩余第三個單引號,組成的sql語句不正確,于是語句報錯
因此,SQL語句閉合方式是單引號
(2)假設MySQL語句為雙引號閉合
username輸入1時,形成的sql語句是正確的
select * from table_name where username="1"and password=“123”;
username輸入1"時,形成的sql語句是
select * from table_name where username=“1” "and password=“123”;
正確的SQL語句不可以出現一對雙引號包含雙引號的。所以上面這條應該出現SQL報錯,但實際沒有報錯,因此我們假設的雙引號閉合方式是不成立的
username輸入的是1’,形成的sql語句是正確的,不會報錯
select * from table_name where username="1’ "and password=“123”;
而然實際上這條語句報錯了,因此我們假設的雙引號閉合方式是不成立的
綜上,我們可以推出SQL語句閉合方式是單引號
進行SQL注入
萬能賬號密碼獲取入口:
萬能賬號密碼使用詳解,滲透測試常用的入門級操作 - 知乎
由上得:該數據庫的閉合方式為單引號
因此,在理解完以上網頁內容后,我們回歸該題
當我們不知道用戶的賬號并且不知道用戶的密碼時,可以使用萬能賬號
我們隨便挑選一個——a or true #
但是它上面的萬能賬號都沒有加單引號’或是雙引號"
因此,綜上,我們需要在a后面加上本題的閉合符號,“ ’ ” 得出我們所需的賬號為a’ or true #
密碼隨便輸即可(但是看到其他人通常這種情況都直接寫一樣的,不知道有啥玄機在里面,這里注意一下)
復制,回去題目提交flag
補充做法(使用HackBar,不過跟上面的大差不差)
自行下載HackBar V2
前提:
先看測試后的網址(與為剛從靶機點進來的網址進行對比),可以看到我們輸入的賬號密碼都顯示在url中,可知此處是get傳參
補充:get傳參——參數和 URI 之間用問號?
隔開, 參數鍵值用等號=
連接,然后參數之間用連接符&
拼接起來
因為get傳參為參數直接暴露在 URL 中,且網頁文件名為check.php,只是處理登錄校驗的常見文件名,而非諸如 login.php(通過表單 POST 傳參)等需要動用其他工具,則可直接使用HackBar 修改參數
點擊啟動靶機后給出的網址,彈出頁面,按F12,選擇HackBar V2(綠色圖標那個)
按一下Load URL,即可獲取當前頁面的網址
然后隨便輸入用戶名密碼,進去后看看網址
我們直接看測試后多出的網址
username=后面跟的是賬號
password=后面跟的是密碼
因此,我們根據上面說的思路,把萬能賬號填進去,密碼隨便填,構造一下,復制
check.php?username=a' or true %23& password=1
然后填進Load URL得出的網址后面,點擊Execute執行
解釋:%23是#的 URL 編碼形式,表示普通字符#,
在 URL 中,某些字符有特殊含義,需要使用URL 編碼(即百分號編碼)來表示,
類似于進制統一一樣,為了避免不必要的麻煩,我們通常都把格式統一一下,
以下字符在 URL 中可直接使用,無需編碼:字母:`a-z`、`A-Z`數字:`0-9`部分符號:`-`、`_`、`.`、`~`
但是遇到特殊字符的時候,最好去查一查看下要不要轉變成URL
得出flag
更新
于2025.06.04