password
status
date
icon
category
tags
slug
summary
0x00 前言
实战碰到概率很低,故网上基本都是些简单的执行命令payload,今天考试正好碰到了,当时想到了几种绕过限制方法,事后分析记录下。
0x01 限制分析
网上一般是执行单个命令,这个位置虽然可以执行命令,但是同时受DTD语法+expect伪协议语法约束,限制极多,通过分析这俩约束,大概有如下限制
不可以使用
"
但是可以使用'
不可以使用实体编码、URL编码
不可以使用
<
>
虽然这俩有XML预定义实体引用,但这里确实不行,echo xxx > xxx
这种方法基本不可以不可以使用
|
,管道符被禁用那操作又少了不少,想base64解码传到sh也不行了。不可以使用
\
{}
:
必须符合 :8080
这种表示端口的格式不可以使用
(空格)0x02 环境快速搭建
0x03 getshell
3.1 空格绕过
看到这些限制熟悉CTF的肯定都能想到不少方法了
比如$IFS代表分隔符,但是这并非空格的完美替代
如
cat$IFS/etc/passwd
这种$IFS + 符号
是正常的,但是cat$IFSindex.php
这种$IFS+字母
则会提醒你没有cat.php
这个文件,这是因为bash把 $IFSindex
当作了变量名。这时候一般做法是用${IFS}
替代空格,不过这里{}
已经被限制了,所以只好使用$IFS$9
这种来代替空格了,$9
代表当前shell进程第9个参数,一般是空字符,同理其实 $8
$7
等等也都是空字符,而且这些变量在解释器里有特殊处理,不会和后面的字母、数字结合成变量名,这样空格问题基本就解决了。3.2 其他绕过?
但是
>
怎么办?sh -c "echo 23 $PS2 b"
这种情况下 $PS2
可以代替>
,但是双引号被限制了,故用$PS2
绕过是不行了。同时,因为反斜线被限制了,
printf
执行命令的方法也行不通了(如$(printf "\154\163")
)没有
"
\
可用的情况下着实难以绕过限制,这俩有一个就可以全盘绕过了,如果有大佬绕过了,麻烦留言教我。3.3 写webshell
既然绕不过某些限制,那就用允许范围内的方法写webshell吧。
最先想到的就是
curl
和wget
好在
http://
是可以不使用的(对:
有限制)3.4 任意命令执行
到上面这步其实大部分情况已经够了,但万一目录没有写文件权限,或者不出网怎么办?
在sh下确实没办法绕过限制了,但在别的编程语言下就未必了,你php环境总有php吧?
先确认一下php命令能不能用,按理来说就算不能直接用也能用绝对路径用,大部分情况下直接用就可以了。
到这就随意了,想执行什么命令都行,也没有限制了,
3.5 其他
利用php临时文件之类的奇怪方法也可以,不过没上面的好用,就不写了。
- 作者:fatekey
- 链接:https://blog.fatekey.icu/article/XXEexpect
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。