CTF-Web中对于RCE常用姿势总结
PHP的RCE中一些小技巧
空格过滤绕过
1、大括号{}:{cat,flag.php}
2、$IFS代替空格:$IFS$9,${IFS},$IFS这三个都行
Linux下有一个特殊的环境变量叫做IFS,叫做内部字段分隔符 (internal field separator)。?cmd=ls$IFS-I
单纯$IFS2,IFS2被bash解释器当做变量名,输不出来结果,加一个{}就固定了变量名?cmd=ls${IFS}-l$IFS$9后面加个$与{}类似,起截断作用,$9是当前系统shell进程第九个参数持有者始终为空字符串。?cmd=ls${IFS}$9-l
3、重定向字符<,<>
4、%09绕过(相当于Tab键)(可以搭配/fl* 使用)
文件名过滤绕过
1、??和绕过
过滤flag文件名用??和绕过
1 | |
以上指令等效于cat /flag
2、单引号(‘)双引号(“”)反引号(``)反斜杠()绕过正则
1 | |
对php来说这是fl””ag而不是flag关键字不会匹配上,但是对于linux系统来说cat /fl””ag等效于cat /flag。外面包裹的是单引号里面就是双引号,外面包裹的是双引号里面就是单引号,或者用斜线\去掉功能性(如preg_match中对于标点的过滤就是使用的\去掉功能性),避免报错
3、特殊变量:$1到$9、$@和$*
这些特殊变量输出为空,或者在单词结尾处插入$x,这里的x可以是任意字母
1 | |
4、拼接绕过
1 | |
6、利用linux中的环境变量
使用环境变量里的字符执行变量
1 | |
1 | |
比如${PATH:5:1}指的是取路径的第五位(从0开始数,第0位是/)的字符,步长为1,即只取一个字母l,以此类推就能拼接成关键字flag.php
没有单独的WAF用preg_match进行waf的
1、直接执行系统命令
1 | |
2、内敛执行 (反字节符)
1 | |
注意结尾的分号,有反字节符,要核对一下是否转义。 利用echo命令和tac相结合来实现。flag采用*绕过。`` 是反字符节
3、利用参数输入+eval
1 | |
1 | |
注意上一行结尾的分号都不能省略。因为是以php代码形式来执行的。
4、利用参数输入+include
这里的eval也可以换为include,并且可以不用括号。但是仅仅可以用来读文件了。
1 | |
也可以尝试写入木马 file_put_contents(“123.php”,%20%27%27); 访问123.php,然后就可以连马。可以利用已知的其他函数来凑出所需要的字符串来绕过
5.利用已知的其他函数来 凑出 所需要的字符串来绕过
使用pos(localeconv)来获取小数点
localeconv可以返回包括小数点在内的一个数组;pos去取出数组中当前第一个元素,也就是小数点。 scandir可以结合它扫描当前目录内容。?c=print_r(scandir(pos(localeconv()))); 可以看到当前目录下有flag.php 通过array_reverse把数组逆序,通过next取到第二个数组元素,也即flag.php?c=show_source(next(array_reverse(scandir(pos(localeconv())))));
1 | |
6.利用已知函数 直接 绕过
使用时,需要配合print或者echo使用
1 | |
1 | |
7.使用未被过滤的命令。passthru直接读取
1 | |
8.日志注入
1 | |
/var/log/nginx/access.log是nginx默认的access日志路径,访问该路径时,在User-Agent中写入一句话木马,然后用中国蚁剑连接即可
9.awk
1 | |
10.异或、取反、自增、临时文件
可以参考
https://www.leavesongs.com/PENETRATION/webshell-without-alphanum.html
https://www.leavesongs.com/PENETRATION/webshell-without-alphanum-advanced.html
https://mp.weixin.qq.com/s/fCxs4hAVpa-sF4tdT_W8-w
https://www.cnblogs.com/ECJTUACM-873284962/p/9433641.html
https://www.cnblogs.com/cimuhuashuimu/p/11546422.html
这里只写取反的方法,这些方法适用于过滤了所有字母的RCE题目,例如
1 | |
payload如下,可以使用system、passthru等函数
1 | |
含有单独的WAF
可以参考php解析字符串特性
php解析时
1.删除前后的空白符(空格符,制表符,换行符等统称为空白符)
2.将某些字符转换为下划线(包括空格) num _num +num这些会统一解析为num,认为是同一个变量,但是waf读取是传入什么就是什么,也就是说waf判断num的参数传入内容,_num +num num 这样就能绕过waf。
例题
waf
源码
1 | |
在js的waf中对 num 的解析就是其传入的,但是php中对 num的解析就变成了num
- Title: CTF-Web中对于RCE常用姿势总结
- Author: lzz0403
- Created at : 2025-01-23 00:00:00
- Updated at : 2026-05-03 12:19:02
- Link: https://www.cnup.top/2025/01/23/CTF-Web中对于RCE常用姿势总结/
- License: This work is licensed under CC BY-NC-SA 4.0.