2011-10-12 53 views
7

首先,我不是試圖破解或做任何非法的事情。以爲我讓你們知道。我有一個客戶想要我在他的系統上做一些修改,當我看着它的時候,我注意到沒有任何東西被逃脫。我不是在開玩笑,沒有任何東西正在逃脫。我向他解釋說,擁有這樣的系統是不安全的。然後他繼續告訴我,他有這樣的系統幾年了,什麼也沒有發生。我需要告訴他他的系統不安全,但我真的不知道要執行SQL注入。以下是一些使用$ _GET的查詢,並且不會轉義。需要幫助與sql注入

SELECT *,DATE_FORMAT(joined,'%M %d, %Y') as \"Joined\" FROM `members` WHERE `name` LIKE '".$ltr."%' ORDER BY points DESC LIMIT $page,50 

這裏的另一個問題:

SELECT * FROM groups WHERE id=$thisladder[grid] 

,我看到的是「可能」清理$ _GET的唯一事情是這樣的功能:

if (!ini_get('register_globals')) { 
    $superglobals = array($_SERVER, $_ENV, 
     $_FILES, $_COOKIE, $_POST, $_GET); 
    if (isset($_SESSION)) { 
     array_unshift($superglobals, $_SESSION); 
    } 
    foreach ($superglobals as $superglobal) { 
     extract($superglobal, EXTR_SKIP); 
    } 
} 

這有可能是上面的功能可能對變量進行消毒。是的,系統也使用註冊全局變量,這也是不好的。

我也做了一個備份,以防萬一。

+2

你想知道如何防止SQL注入,或向客戶證明它不安全? – skyuzo

+3

哦,不僅他們不逃避任何事情,而且他們明確地*模仿'register_globals'功能,如果它被禁用的話!這是第一個! – rid

+0

我不知道如何證明它。但我知道mysql_real_escape和準備好的語句是要走的路。 – user962449

回答

6

不能說比http://xkcd.com/327/更好。

但話又說回來,作爲Marc B說,忘記SQL注入,register_globals是更壞。從未想過我真的會看到它仿效,以防萬一它關閉。

+0

上帝,我們是這樣的書呆子,不能停止笑那些圖像哈哈。所以全局變量比注入最差? O_0 – user962449

+0

@ user962449,用'register_globals',您只需簡單的包含在你的GET請求,例如更換幾乎任何變量的值。 – rid

5

一些有趣的事情,以顯示你的「朋友」他的代碼是多麼愚蠢是:

http://example.com/badscript.php?_GET[]=ha+ha+I+pwned+your+GET+superglobal 
http://example.com/badscript.php?_SESSION[issuperuser]=1 

這種事情是EXACTLY爲什麼register_globals的是這樣一個徹頭徹尾的F'ingly魯鈍的想法,(後FAR太長)最終被設置爲OFF。

忘記了SQL注入 - 那個愚蠢的代碼段允許遠程PHP變量注入。

+0

這就像所有注射的母親...... –

+0

@Marc B:我不敢苟同,該代碼將無法正常工作與否註冊全局上。如果$ _SESSION關閉並且會話尚未初始化,則可能會被覆蓋,但是'session_start'無論如何都會將其刪除。您可能想引用一個PHP版本,直到註冊全局變量設置爲on時纔有可能。 – hakre

+0

@hakre:的確,會話一個完全取決於當在session_start相對於僞註冊全局呼籲。只是用它來演示BAD register_globals可能如何。 –

1

如果登錄代碼看起來是這樣的:

$query = 'SELECT id FROM users WHERE username=\''.$_POST['username'].'\' AND password=\''.$_POST[password].'\''; 
$result = mysql_query($query); 
etc, etc... 

試試輸入到這個登錄字段

username = "whatever" 
password = "' OR 1" 

有意義嗎?

+0

密碼被散列。所以我猜這個腳本沒有那麼糟糕:/ – user962449

+0

然後使用「或OR 1」作爲用戶名。 – dqhendricks

+0

請注意,我不是用sql注入的wiz。所以我只是輸入''OR 1'? – user962449