1. 程式人生 > 實用技巧 >基於約束的SQL注入

基於約束的SQL注入

# 漏洞原理

在談論這種攻擊手法之前,首先我們需要了解幾個關鍵知識點。

1、在SQL中執行字串處理時,字串末尾的空格符將會被刪除。換句話說,‘nocoriander’和‘nocoriander ’幾乎是等效的

例如下列程式碼,和使用使用者名稱‘admin’結果是一樣的

1 select * from users where username='nocoriander       ';

2、在所有的INSERT查詢中,SQL都會根據varchar(n)來限制字串的最大長度。也就是說,如果字串的長度大於"n"個字元的話,那麼僅使用字串的前"n"個字元。比如特定列的長度約束為"5"個字元,那麼在插入字串"nocoriander"時,實際上只能插入字串的前5個字元,即"nocor"。

# 攻擊手法

首先建立資料庫 test

給test庫新增users表,表中有兩個欄位username,password

新增資料;username=admin;password=123456

檢視users表中的資料

使用另一種方式查看錶中的資料,

發現檢視的結果是一樣的

接下來再次新增資料

username='admin '; 注意:admin後面跟了空格

password='newpwd'

再次查看錶中的資料

給定條件,檢視users表中,username為admin的資料

# 漏洞危害

現在,如果使用使用者名稱“admin”和密碼“newpwd”登入的話,則所有搜尋該使用者名稱的SELECT查詢都將返回第一個資料記錄,也就是原始的資料記錄。

這樣的話,攻擊者就能夠以原始使用者身份登入。

# 防禦手段

1、將要求或者預期具有唯一性的那些列加上UNIQUE約束。

2、最好使用'id'作為資料庫表的主鍵。並且資料應該通過程式中的id進行跟蹤

3、可以用手動調整輸入引數的限制長度