RCE-Labs超详细WP-Level9
分析源码
- 与前几关不同的语句依旧这个函数
preg_match("/[A-Za-z\"%*+,-.\/:;=>?@[\]^`|]/", $cmd)
- 这关WAF过滤了更多的字符
- 只剩下了 数字,
\
, 单引号, 和$
, 空格等可以使用
- 只剩下了 数字,
解题分析
- 这里就想到了
bash
终端可以将八进制转义作为命令进行执行- 注意的是, 这里要求的是
bash
- 所以在注释中, 探姬就说了, 这个靶场的 Dockerfile 通过执行如下命令
RUN ln -sf /bin/bash /bin/sh
- 首先要知道 PHP 的
system
命令执行的是/bin/sh
, 而/bin/sh
只是个软连接 - 而靶场使用的底层镜像
php:7.3-fpm-alpine
默认指向的/bin/busybox
/bin/busybox
不是bash
, 并不支持八进制转义
- 所以要通过上述命令重新定义软链
- 注意的是, 这里要求的是
- 那接着就讲一下如何使用八进制转义进行命令执行
- 使用
$''
的格式可以进行八进制转义进行命令执行- 比如
ls -> $'\154\163'
- 比如
- 但是如果要是命令中带有参数也是吗
- 比如
ls -l -> $'\154\163\40\55\154'
- 尝试了一下, 发现不行
- 比如
- 如果带有参数的话, 空格需要单独拿出来
- 比如
ls -l -> $'\154\163' $'\55\154'
- 比如
- 使用
解题步骤
- 上文大概简述了解题思路
- 探姬贴心的在靶场中留了一个
exp.php
- 而这个
EXP
, 就来源于探姬写的工具(下面是在线网址和项目地址)- https://github.com/ProbiusOfficial/bashFuck
- https://probiusofficial.github.io/bashFuck/
- 而这个
- 探姬贴心的在靶场中留了一个
- 使用
exp.php
生成 payload-
-
这个
exp.php
其实包含了后面几关
-
- 这个时候直接拿 payload 去用就可以了(真的吗)
- 记得上面说的, 带有参数的命令, 空格要单独拿出来吗?
- 所以最后 payload 如下
$'\143\141\164' $'\57\146\154\141\147'
扩展
$'...'
的用法
处理特殊字符
echo $'Hello\nWorld'
# 输出:
# Hello
# World
使用 Unicode 或十六/八进制字符
echo $'\u4F60\u597D' # 输出 "你好"
echo $'\xE4\xBD\xA0\xE5\xA5\xBD' # 也是 "你好"
处理引号和退格
echo $'It\'s a test' # 输出:It's a test
echo $'ABC\bD' # 输出:ABD (\b 退格,去掉 C)
结合变量
name="World"
echo $'Hello\n'$name
# 输出:
# Hello
# World