2013-01-10 75 views
3

最近,我想過這樣的事情:SQL注入改變返回值

$sql = "SELECT password FROM users WHERE user = '" . $_POST["user"] . "'"; 
$result = mysql_query($sql); 

if (myql_num_rows($result) != 1) { 
//Error 
} 

$data = mysql_fetch_array($result); 

if ($data["password"] == md5($_POST["password"])) { 
//Welcome 
} else { 
//Error 
} 

即使逃逸不使用參數化querys或至少,我想不出一個適當的SQL注入,使用它可以得到波谷到的Welcome點。您需要修改返回的密碼,然後您可以將其密碼作爲md5值使用。

任何想法,如果這是可能的?

+1

我沒有找到如何防止sql注入的方法。似乎你甚至沒有看過我的帖子。 – Zulakis

+0

閱讀下面: http://stackoverflow.com/questions/60174/how-to-prevent-sql-injection-in-php –

+0

@halfer是的,對不起。那是我一分鐘寫的一篇未經測試的素描。 – Zulakis

回答

8

使用下列值用戶:

obviouslyinvalidusername' union select MD5('password123') as password -- 

隨後的password123密碼應進行身份驗證。我不知道此時您將登錄哪個用戶帳戶,因爲這部分邏輯未顯示。

+0

是的,這將通過要求只返回一行,只要沒有用戶在數據庫中調用'''! +1 – halfer

+1

@halfer:好點,更新:)根據我的經驗,最危險的注射是在最後允許'union'語句的形式。 – mellamokb

+0

實際上,您可能希望在這裏「選擇」一個「用戶」,但許多系統公開列出用戶名(配置文件),因此獲取此名稱可能很簡單。 – halfer

0
"'; UPDATE user SET password=MD5('fakepass') where username='username'" 

這會將任意密碼作爲md5散列插入到數據庫中。

+2

這不適用於'mysql_query',因爲它只執行一條語句。看到這裏:http://uk1.php.net/manual/en/function.mysql-query.php – halfer

+0

是的,這將無法正常工作。 – Zulakis