MySQL长字符截断的实现示例
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):
?1 2 3 4 5 | CREATE TABLE USERS( id int (11) NOT NULL , //长度为7 username varchar (7) NOT NULL , password varchar (12) NOT NULL , ) |
分别插入以下SQL语句(注入提示消息)。
①插入正常的SQL语句。
?1 2 3 | mysql> insert into users(id,username, password ) values (1, 'admin' , 'admin' );//成功插入,无警告,无错误 Query OK,1 row affected(0.00 sec) |
②插入错误的SQL语句,此时的"admin "右面有三个空格,长度为8,已经超过了原有的规定长度。
?1 2 3 | mysql> insert into users(id,username, password ) values (2, 'admin ' , 'admin' ); //成功插入,一个警告 Query OK,1 row affected,1 warning(0.00 sec) |
③插入错误的SQL语句,长度已经超过原有的规定长度。
?1 2 3 | mysql> insert into users(id,username, password ) values (3, 'admin x' , 'admin' ); //成功插入,一个警告 Query OK,1 row affected,1 warning(0.00 sec) |
MySQL提示三条语句都已经插入到数据库,只不过后面两条语句产生了警告。那么最终有没有插入到数据库呢?执行SQL语句查看一下就知道了。
?1 | mysql> select username from users; |
可以看到,三条数据都被插入到数据库,但值发生了变化,此时在通过length来取得长度,判断值的长度。
?1 | mysql> select length(username) from users where id =1 ; |
可以发现,第二条与第三条数据的长度为7,也就是列的规定长度,由此可知,在默认情况下,如果数据超出列默认长度,MySQL会将其截断。
但这样何来攻击一说呢?
面查询用户名为'admin'的用户就知道了。
?1 | mysql> select username from users where username= 'admin' ; |
只查询用户名为admin的用户,但是另外两个长度不一致的admin用户也被查询出,这样就会造成一些安全问题,比如,有一处管理员登录是这样判断的,语句如下:
?1 | $sql = " select count (*) from users where username= 'admin' and password ='*******; |
假设这条SQL语句没有任何注入漏洞,攻击者也可能登录到管理页面。假设管理员登录的用户名为 admin,那么攻击者仅需要注册一个"admin”用户即可轻易进入后台管理页面,像著名的WordPress就被这样的方式攻击过。
到此这篇关于MySQL长字符截断的实现示例的文章就介绍到这了,更多相关MySQL长字符截断内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!
原文链接:https://blog.csdn.net/cyynid/article/details/129261347
1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。