WEB题 —–RCE
提示:7字符RCE
RCE:远程代码执行
7字符: 这是关键限制。它意味着你最终能够注入并成功执行的整个命令字符串,长度最多只有7个字符(包括字母、数字、符号、空格等一切)。
Payload(有效载荷)/ˈpeɪləʊd/ ** 指的是在利用一个系统、网络或软件的漏洞时,被传输并最终执行的那一段恶意代码或数据**。它的目的是实现攻击者的特定目标。
核心思想: 攻击者先找到一种“投送”方式(漏洞利用方法),然后将“货物”(Payload)投送进去并让它发挥作用。
1 | /?1=cat /f* |
详细解释
- 使用通配符 ?
作用:在路径名扩展中,代表任意一个单个字符
斜杠 /
路径分隔符
作用:用来分隔目录层级,构成一个完整的路径
1
作用:get请求参数的名称
=
作用:参数名与参数值的分隔符
cat
命令名
作用:Linux命令,用于连接文件并打印到标准输出设备(屏幕)上
解释:这是要执行的主要命令。当后面跟着文件名时,它会显示该文件的内容
(空格)
作用:命令中的参数分隔符
解释:在Shell中,空格用于区分命令本身(
cat)和它的参数(/f*)。这是必不可少的f
作用:文件名的一部分,字面量字符
解释:表示我们要找的文件名必须以字母 “ f ” 开头。在ctf中flag文件通常被命名为flag,flag.txt,flag.php等。
通配符
解释:这是整个Payload的精华所在。*可以匹配零个或多个任意字符。
f*这个模式的意思是:匹配根目录下所有以字母 f开头的文件和目录名。
完整意思是:利用网站的命令注释漏洞,通过通配符技巧,尝试读取服务器上某个你已知开头字母但不确定全名的关键文件。
WEB题——-空格绕过
题目提示:在遇到空格被过滤的情况下,通常使用 %09 也就是TAB的URL编码来绕过,在终端环境下 空格 被视为一个命令分隔符,本质上由 $IFS 变量控制,而 $IFS 的默认值是空格、制表符和换行符,所以我们还可以通过直接键入 $IFS 来绕过空格过滤。
解释:
// 空格比作 刀
当Shell(终端)看到 cat /flag.txt时,它发现中间有一把“刀”(空格),于是它就沿着这把刀切下去,得到 cat和 /flag.txt两块。
输入:cat /flag.txt
Shell的工作:识别出“命令块”是 cat,“参数块”是 /flag.txt
部分一. 理解“分隔符” 和 $IFS
- 空格被视为命令分隔符
当Shell看到 cat /flag.txt时,它发现中间有一把“刀”(空格),于是它就沿着这把刀切下去,得到 cat和 /flag.txt两块。
- 本质上由
$IFS变量控制
IFS 是一个特殊的Shell变量,它的全称是 Internal Field Separator(内部字段分隔符)
可以理解为shell官方认证清单,这个清单上写了哪些字符可以被当作分隔符来用
在默认情况下,这个清单($IFS的值)就是:空格、制表符、换行符
部分二. 理解绕过原理
现在我们知道,Shell认的是“官方清单”$IFS,而不是某一把特定的“刀”。那么绕过过滤的思路就清晰了
情况一:过滤了“空格”
1 | /?cmd=cat /flag |
题目代码可能会把你输入中的空格字符删除或拦截。
- 你的输入:
cat /flag - 题目处理:
cat/flag(空格被删除) - 结果:执行失败,Shell认为
cat/flag是一个不存在的命令
如何绕过?
既然“官方清单” 上还有其他的刀,我们换一把刀就行
1.制表符(Tab键)
- 制表符也在$TFS清单上
- 你的输入:cat【Tab】/flag
- 题目处理: 只过滤空格,不过滤Tab,所以输入可以通过
- Shell看到:
cat【Tab】/flag。Shell一查清单,发现Tab也是官方认可的刀,于是顺利切分,执行成功。 - 值得注意的是:在URL里,Tab键写作
%09,所以payload是cat%09/flag
2.直接出示“官方清单”本身:$IFS
1 | /?cmd=cat$IFS/flag |
- 这是更高级的技巧。我不直接给你一把刀,我给你看“官方清单”
- 你的输入:
cat$IFS/flag.txt - Shell的处理分两步:
- 第一步:变量替换。Shell看到
$IFS,就去查这个变量的值,发现是“空格、Tab、换行”。 - 第二步:解析命令。替换后,命令变成了
cat【空格】/flag.txt。Shell再一解析,发现中间有清单上的空格,于是顺利切分执行。
- 第一步:变量替换。Shell看到
因为题目只过滤“空格”这个具体的字符,它不会过滤 $、I、F、S这四个字符。所以这个Payload能完美绕过。
所以,这段话的精髓是:Shell是通过检查 $IFS变量中的字符来分割命令的。既然默认的分隔符不止空格一个,那么当空格被过滤时,我们就可以使用其他默认分隔符(如Tab),或者直接使用 $IFS变量本身来“间接”地使用空格。
做题先——-> 解读代码啊!!!;少了关键信息怎么找到flag
比如:
1 |
|
字面拆解
1 | isset($_GET['cmd']) ? hello_shell($_GET['cmd']) : null; |
isset($_GET['cmd'])(检查URL中是否存在名为cmd的GET参数)?(三元运算符:如果为真,则…)hello_shell($_GET['cmd'])(调用hello_shell函数,并把cmd参数的值传进去):(否则…)null(什么都不做)
言尽于此了………………………………………..
读完代码发现flag和空格都会被过滤掉
所以我们需要执行
1 | /?cmd=cat%09/fla? |
因为会过滤掉/flag,所以我们用/fla?代替
为什么呢???
关键就在于: ?(通配符)
在平常你叫它问号,它不挑你的理,但是在这你应该叫什么?嗯?
通配符 ?的定义是: 匹配任意一个(正好一个)字符。
所以:
/fla?这个模式,会匹配任何以/fla开头,后面跟着恰好一个字符的字符串。
划重点—划重点
当我们直接cat /flag攻击,后台检查:发现字符串包含了子串flag,触发过滤,攻击失败。
使用通配符攻击 cat /fla? 后台检查:发现fla?,不包含连续的flag四个字符,就会绕过过滤,继续执行代码
反正就是这样……………………………
总结一下:
用 /fla?代替 /flag的原理是“李代桃僵”。我们用一个在过滤规则眼里是“无害字符”(?)、但在Shell眼里是“万能牌”的特殊符号,在命令执行阶段“变”出我们被禁止使用的字母,从而绕过过滤。 这是CTF中非常经典和有效的技巧。
嗯……就是这样……..全文完