MySQL長字元截斷如何實現

WBOY
發布: 2023-06-03 11:37:12
轉載
1592 人瀏覽過

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長字元截斷如何實現的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:yisu.com
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!