LengF:在看《PHP高級漏洞審覈技術》認真的看了這兩點,暫且記下。
對於不少web應用文件在不少功能是不允許重複數據的,好比用戶註冊功能等。通常的應用程序對於提交註冊的username和數據庫裏已有的username對比是否是已經有重複數據,然而咱們能夠經過「數據截斷」等來饒過這些判斷,數據庫在處理時候產生截斷致使插入重複數據。html
1) Mysql SQL Column Truncation Vulnerabilitiesmysql
這個漏洞又是大牛Stefan Esser發現的(Stefan Esser是個人偶像:)),這個是因爲mysql的sql_mode設置爲default的時候,即沒有開啓STRICT_ALL_TABLES選項時,MySQL對於插入超長的值只會提示warning,而不是error(若是是error就插入不成功),這樣可能會致使一些截斷問題。測試以下:web
mysql> insert into truncated_test(`username`,`password`) values("admin","pass");sql
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 vulnerabilityfetch
這個漏洞是80sec發現的,當mysql進行數據存儲處理utf8等數據時對某些字符致使數據截斷。測試以下:spa
mysql> insert into truncated_test(`username`,`password`) values(concat("admin",0xc1), "new_pass2");
Query OK, 1 row affected, 1 warning (0.00 sec)orm
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)htm
不少的web應用程序沒有考慮到這些問題,只是在數據存儲前簡單查詢數據是否包含相同數據,以下代碼:
$result = mysql_query("SELECT * from test_user where user='$user' "); ....if(@mysql_fetch_array($result, MYSQL_NUM)) { die("already exist");}