mysql中in查询效率低的替代方法_无需“in”的SQL盲注

本文介绍了一种在TetCTF挑战中绕过过滤限制的SQL盲注技术,利用sys.x$schema_flattened_keys和sys.x$statement_analysis表获取表名及列名,通过特殊技巧实现数据检索。

accd4bce7e0c5c8e3705af38e79d7af3.png

为了锻炼安全技术,我在TetCTF上想寻找一些新奇的网络挑战,并注意到一个有趣的系统——“Secure System”。

其中挑战目标是制作一个和SQL盲注有关的payload,并且不使用:

  • UNION … SELECT
  • information_schema
  • “in”和“or”等关键词

尽管还有其他安全过滤,但以上关键词是最难克服的障碍。

d64b8a08428cfba8e47b615df9a52a9a.png

information_schema的替代方法

f7afdcf351d98307a7fb0ac41f329451.png

我在网上搜索了一下从MySQL数据库中检索表名的替代方法,但没有找到任何可行的方法。所有的技术都依赖于information_schema或mysql.innodb_table_stats,但这两者都会被“in”关键词过滤掉。所以,我需要寻找新方法,并在研究了一段时间后成功发现了替代品sys.x$schema_flattened_keys

ebecb134196d9eff5d2c9f9afece1e07.png

在上述示例中,不仅包含一个table_name列,还包含“索引列”。但这不是唯一的方法,还有另一个表sys.schema_table_statistics可显示更多的表:

287c2abc98563c3d9e0b1c7c9aef23f0.png

通过这种方法和SQL盲注技术,我成功得到了目标表名Th1z_Fack1n_Fl4444g_Tabl3

他人的解决方案

在尝试检索列名的时候,我遇到了不小的困难,尝试了很多方法都不成功。但我发现的表格sys.x$statement_analysis可让我查看其他参与者的解决方案。

67a2ac3cfef1ed61b3e761ba0a5ec546.png

我很好奇是否有人找到了列名,但脚本运行要花费很多时间,所以我只检索上面示例中的内容。这也许能在将来帮我解决其他SQL注入挑战!

在没有列名的情况下检索数据

ca72afabdee55d2e20457a2b4b0829ca.png

如果一个表只包含一列,那么很轻易就可在不知道列名的情况下检索出数据,只需一个简单的SUBSTR((SELECT * FROM table),1,1)='x'就可,但如果一个表包含多个列,那么这个查询就会抛出一个错误。不过这里有个技巧,就是将查询语句与相同数量的列进行比较!

9f490ec8b073e03e8971f9ea188892d9.png

通过小于号替换等号,你可以逐字符检索出数据。不过还有一个问题——MySQL中的字符串比较在默认情况下是不区分大小写的。

区分大小写

e69e18a819f9fa7e2f1182cc1bac8e5e.png


通过以上方法我可以得到全是小写字母的flag,现在就需要一个区分大小写的方法。我发现将字符串转换为二进制格式后,会强制进行字节对字节的比较,这正是我所需要的。但问题是,BINARY函数中的“in”被过滤掉了。

c999f1b15f8e2df3c80951f6a7002dfc.png


此时我注意到,当一个字符串连接一个二进制的值时CONCAT("aa", BINARY("BB")),其得到的也将是二进制。因此我需要找到一个方法,将一个二进制字符串插入CONCAT函数中。

经过反复试验,我终于发现MySQL中的JSON对象是二进制对象,因此,CAST(0 AS JSON)会返回一个二进制字符串,进而SELECT CONCAT(“A”, CAST(0 AS JSON))也会返回一个二进制字符串。

77c801989631ba5f99341eca760dbcc3.png

综合以上改进,我成功地获得了完整的flag,它实际上只含有一个大写字符,但还是花了我几个小时。

TetCTF{0wl_d0nkey_means_Liarrrrrrr}

有趣的挑战和解决方案

这正是我喜欢CTF的地方,一个简单的安全挑战就可以引导出很棒的研究。我不确定我的解决方案是否为最好,但对我来说这是一个伟大的旅程!

此外(关于这个挑战的其他内容),我们一开始希望使用ORD(SUBSTR((SELECT smth),x,1))=77去检索值,但是由于过滤了“or”关键词,ORD被禁止了。不过还是可以通过CONV(HEX(SUBSTR((SELECT ...),x,1)),16,10)=77绕过。以下是Oracle盲注的payload:

10681862a50b5801c595526186f15b9a.png

最后根据这些方法和已经检索到的表名,payload如下:

9f30d19b45865809efdb8bfb76c0a4f4.png

详细链接点击这里。

本文由白帽汇整理并翻译,不代表白帽汇任何观点和立场

来源:无需“in”的SQL盲注|NOSEC安全讯息平台 - 白帽汇安全研究院

原文:https://medium.com/@terjanq/blind-sql-injection-without-an-in-1e14ba1d4952

白帽汇从事信息安全,专注于安全大数据、企业威胁情报。

公司产品:FOFA-网络空间安全搜索引擎、FOEYE-网络空间检索系统、NOSEC-安全讯息平台。

为您提供:网络空间测绘、企业资产收集、企业威胁情报、应急响应服务。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值