LengF:在看《PHP進階漏洞稽核技術》認真的看了這兩點,暫且記下。
對于很多web應用檔案在很多功能是不容許重複資料的,比如使用者注冊功能等。一般的應用程式對于送出注冊的username和資料庫裡已有的username對比是不是已經有重複資料,然而我們可以通過“資料截斷”等來饒過這些判斷,資料庫在處理時候産生截斷導緻插入重複資料。
1) Mysql SQL Column Truncation Vulnerabilities
這個漏洞又是大牛Stefan Esser發現的(Stefan Esser是我的偶像:)),這個是由于mysql的sql_mode設定為default的時候,即沒有開啟STRICT_ALL_TABLES選項時,MySQL對于插入超長的值隻會提示warning,而不是error(如果是error就插入不成功),這樣可能會導緻一些截斷問題。測試如下:
mysql> insert into truncated_test(`username`,`password`) values("admin","pass");
mysql> insert into truncated_test(`username`,`password`) values("admin x", "new_pass");
Query OK, 1 row affected, 1 warning (0.01 sec)
mysql> select * from truncated_test;
+----+------------+----------+
| id | username | password |
+----+------------+----------+
| 1 | admin | pass |
| 2 | admin | new_pass |
+----+------------+----------+
2 rows in set (0.00 sec)
2) Mysql charset Truncation vulnerability
這個漏洞是80sec發現的,當mysql進行資料存儲處理utf8等資料時對某些字元導緻資料截斷。測試如下:
mysql> insert into truncated_test(`username`,`password`) values(concat("admin",0xc1), "new_pass2");
Query OK, 1 row affected, 1 warning (0.00 sec)
mysql> select * from truncated_test;www.2cto.com
+----+------------+----------+
| id | username | password |
+----+------------+----------+
| 1 | admin | pass |
| 2 | admin | new_pass |
| 3 | admin | new_pass2 |
+----+------------+----------+
2 rows in set (0.00 sec)
很多的web應用程式沒有考慮到這些問題,隻是在資料存儲前簡單查詢資料是否包含相同資料,如下代碼:
$result = mysql_query("SELECT * from test_user where user='$user' ");
....
if(@mysql_fetch_array($result, MYSQL_NUM)) {
die("already exist");
}