MySQL長字符截斷的實現示例

MySQL超長字符截斷又名"SQL-Column-Truncation",是安全研究者Stefan Esser在2008 年8月提出的。

在MySQL中的一個設置裡有一個sql_mode選項,當sql_mode設置為default時,即沒有開啟STRICT_ALL_TABLES選項時(MySQLsql_mode默認即default),MySQL對插入超長的值隻會提示warning,而不是error,這樣就可能會導致一些截斷問題。

新建一張表測試,表結構如下(MySQL5.1):

CREATE TABLE USERS(
id int(11) NOT NULL, //長度為7
username varchar(7)NOT NULL,
password varchar(12)NOT NULL , 
)

分別插入以下SQL語句(註入提示消息)。

①插入正常的SQL語句。

mysql> insert into users(id,username,password)values(1,'admin','admin');//成功插入,無警告,無錯誤
 
Query OK,1 row affected(0.00 sec)

②插入錯誤的SQL語句,此時的"admin "右面有三個空格,長度為8,已經超過瞭原有的規定長度。

mysql> insert into users(id,username,password)values(2,'admin       ','admin');
//成功插入,一個警告
Query OK,1 row affected,1 warning(0.00 sec)

③插入錯誤的SQL語句,長度已經超過原有的規定長度。

mysql> insert into users(id,username,password) values(3,'admin    x','admin');
//成功插入,一個警告
Query OK,1 row affected,1 warning(0.00 sec)

MySQL提示三條語句都已經插入到數據庫,隻不過後面兩條語句產生瞭警告。那麼最終有沒有插入到數據庫呢?執行SQL語句查看一下就知道瞭。

mysql> select username from users;

可以看到,三條數據都被插入到數據庫,但值發生瞭變化,此時在通過length來取得長度,判斷值的長度。

mysql> select length(username)from users where id =1 ;

可以發現,第二條與第三條數據的長度為7,也就是列的規定長度,由此可知,在默認情況下,如果數據超出列默認長度,MySQL會將其截斷。

但這樣何來攻擊一說呢?

面查詢用戶名為'admin'的用戶就知道瞭。

mysql> select username from users where username='admin';

隻查詢用戶名為admin的用戶,但是另外兩個長度不一致的admin用戶也被查詢出,這樣就會造成一些安全問題,比如,有一處管理員登錄是這樣判斷的,語句如下:

$sql = "select count(*) from users where username='admin' and password='*******;

假設這條SQL語句沒有任何註入漏洞,攻擊者也可能登錄到管理頁面。假設管理員登錄的用戶名為 admin,那麼攻擊者僅需要註冊一個"admin”用戶即可輕易進入後臺管理頁面,像著名的WordPress就被這樣的方式攻擊過。

到此這篇關於MySQL長字符截斷的實現示例的文章就介紹到這瞭,更多相關MySQL長字符截斷內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!

推薦閱讀: