2013-02-27 99 views
0

我有一篇關於SQL注入的文章(它是什麼 - 它如何完成以及如何避免)。我知道它是什麼以及它是如何工作的。但我似乎無法在我的數據庫上重現注射。SQL注入:語法錯誤

我做了一個非常簡單的數據庫,使用MySQL工作臺,意味着視頻俱樂部。電影 - 股票價格 - 客戶購物車等 我也做了一個非常簡單的HTML頁面,從中我可以添加電影 - 查看我有什麼股票等

所以我有一個txt字段,其中我輸入電影名稱,我找回這個特定電影的一些信息。

是得到我鍵入名稱,使查詢::

$name = $_POST ['txtfld']; 
$sql = ("SELECT * FROM test_table WHERE adad = '$Mname'"); 
if ($result = mysqli_query($dbc,$sql)) 

現在,當我給代碼「A」作爲輸入一切正常。我得到一個pk等於[a]的條目。 查詢變成:: SELECT * FROM test_table WHERE adad ='a'。

下一步是看看,如果我能得到整個表或從一些隨機項。 輸入是:A '或 'X'= 'X] 查詢變得:: SELECT * FROM TEST_TABLE其中阿達德=' a' 或 'X'= 'X' 一切正常,我也得到返回整個表格的內容。

下一步是嘗試注入第二查詢。我試圖更新test_table。 輸入是:: [a;' update test_table set asda ='123456'where adad ='u] 查詢現在變成:SELECT * FROM test_table WHERE adad ='a;' UPDATE TEST_TABLE SET ASDA = '123456' WHERE阿達德= 'U'

我得到了一個語法錯誤,所以我想盡語法我能想到的,包括 [一個的;」 UPDATE test_table SET asda ='123456'where adad ='u';#] 。他們都沒有工作。

事情是,我真的不知道爲什麼我得到一個語法錯誤。

對於上面mysqli_error給出的輸入,同時回波我插入返回返回該消息

error: You have an error in your SQL syntax; check the manual that corresponds to your 
MySQL server version for the right syntax to use near 'update test_table set asda = 
'123456' where adad = 'u'' at line 1 

SELECT * FROM test_table WHERE adad = 'a;' UPDATE test_table SET asda = '123456' WHERE 
adad = 'u' 

我沒有看到任何語法錯誤回波返回,我不得到其中mysqli_error返回結尾處的第二個[']字符來自。

從我明白這是什麼,而在執行第二查詢故障(無論什麼查詢 - 下降,插入,更新)

我是否錯過了什麼?

在此先感謝。

Michael。

+0

[如何防止SQL注入PHP?](http://stackoverflow.com/questions/60174/how-to-prevent-sql-injection-in-php) – 2013-02-27 16:02:07

+0

在你的發佈的例子中,你有一個 - 分號 - 引用:''a'' UPDATE'。它應該是一個引號分號:「a」;更新'。因此,SQL無法區分'SELECT'的結尾和'UPDATE'的開始。 – 2014-06-05 05:06:46

回答

0

爲了讓您的堆疊查詢注射技術工作,你將需要使用「mysqli_multi_query()」函數:

http://php.net/manual/en/mysqli.multi-query.php http://www.websec.ca/kb/sql_injection#MySQL_Stacked_Queries

MSSQL是默認支持堆查詢的唯一數據庫。

也可能是一種更好的注入技術和更可靠的注入技術,它會是UNION攻擊,然​​後從「mysql.user」表中轉儲MySQL憑據,然後使用這些來破壞數據庫。

+0

謝謝。正是我想知道的。將我的php從mysqli_query更改爲mysqli_multi_query和繁榮。我可以使用html表單來改變我的模式。我已經使用聯盟攻擊成功,但只是爲了獲得我「不應該」獲得的信息。不要改變模式。 – Silas 2013-03-05 12:51:45

2

MySQL的PHP​​驅動程序不允許多個查詢在一個單一的 - >查詢()調用,正是因爲這個原因。這是一種防注入防禦,可以防止經典的攻擊。對於所有的PHP數據庫接口(mysql,mysqli,pdo)來說都是如此,因爲它們都使用相同的底層mysql C api庫來實際與db進行通信。在單個查詢調用中運行2+查詢的任何嘗試都會導致語法錯誤。

但請注意,它不能防止您的' or 1=1注射。

+0

好吧,這麼想。但仍然Bobby表攻擊是一種非常常見的方法,因爲我看到(很多描述sql注入的站點多少使用這種方法)。我應該有什麼樣的數據庫才能夠改變架構,而不是僅僅能夠獲取我不應該能夠獲得的信息? 謝謝 – Silas 2013-02-27 16:22:52

+2

不能爲其他'big'dbs說話,但除非他們已經專門針對PHP進行了強化,或者將非多重查詢業務烘焙到他們的接口庫中,否則ANY db在理論上容易受到架構變更。主要問題是人們使用FAR權限較高的DB帳戶運行其網站。一個面向網絡的賬戶永遠不應該改變/刪除priv。選擇確定,更新/刪除MAYBE,修改/刪除... **永遠不會**。例如使用適當授權的帳戶不可能使用bobbytables。 – 2013-02-27 16:25:53

+0

PDO :: query()默認允許多查詢。 – 2013-02-27 16:31:39