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;HdhCmsTest2cto测试数据 +----+------------+----------+ | 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"); }
查看更多关于mysql数据截断 - 网站安全 - 自学php的详细内容...