Command Injection-命令注入(命令执行)
什么是命令注入?
命令注入是滥用应用程序的行为在操作系统上执行命令,使用与设备上的应用程序运行时相同的权限。例如,在作为名为joe的用户运行的web服务器上实现命令注入将在该joe用户下执行命令,从而获得joe拥有的任何权限。
命令注入漏洞也称为“远程代码执行”(RCE),因为攻击者可以诱使应用程序执行它们提供的一系列有效负载,而无需直接访问机器本身(即交互式 shell)。Web 服务器将处理此代码并在运行该应用程序的用户的权限和访问控制下执行它。
命令注入通常也称为“远程代码执行”(RCE),因为它能够在应用程序中远程执行代码。这些漏洞通常对攻击者来说是最有利可图的,因为这意味着攻击者可以直接与易受攻击的系统进行交互。例如,攻击者可能会读取系统或用户文件、数据以及类似的东西。
例如,能够滥用应用程序执行命令whoami以列出应用程序正在运行的用户帐户将是命令注入的一个例子。
发现命令注入
此漏洞的存在是因为应用程序经常使用 PHP、Python 和 NodeJS 等编程语言中的函数来向计算机操作系统传递数据并在其上进行系统调用。例如,从字段中获取输入并在文件中搜索条目。以下面的代码片段为例:
在此代码片段中,应用程序获取用户在名为$title在目录中搜索歌曲名称。让我们将其分解为几个简单的步骤。

- 应用程序将 MP3 文件存储在操作系统包含的目录中。
- 用户输入他们想要搜索的歌曲名称。应用程序将此输入存储到
$title变量中。 - 此变量中的数据被传递给搜索名为 songtitle 的文本文件的
$title命令。txt用于用户希望搜索的任何条目。grep - 搜索歌曲标题的输出。txt将决定应用程序是否通知用户歌曲存在与否。
代码:
<?php
$songs = "/var/www/html/songs";
if(isset$(_GET["title"])){
$title = $_GET["title"];
$command = "grep $title /var/www/html/songtitle.txt";
$search = exec($command);
if ($search == ""){
$return = "<p>The requested song</p> $title does </p><b>not</b><p> exist!</p>";
} else {
$return = "<p>The requested song</p> $title does </p><b>exist!</b>";
}
echo $return;
}
?>
现在,这类信息通常会存储在数据库中;然而,这只是应用程序从用户那里获取输入以与应用程序的操作系统交互的示例。
攻击者可以通过注入自己的命令让应用程序执行来滥用此应用程序。他们可以要求应用程序从更敏感的文件中读取数据,而不是使用grep在songtitle.txt中搜索条目
无论应用程序使用何种编程语言,都可能以这种方式滥用应用程序。只要应用程序处理并执行它,它就会导致命令注入。例如,下面的代码片段是一个用 Python 编写的应用程序。

请注意,您不需要了解这些应用程序背后的语法。但是,出于原因,我也概述了此 Python 应用程序的工作步骤。
“flask”包用于设置网络服务器- 使用
“subprocess”包在设备上执行命令的函数 - 我们在网络服务器中使用一个路由来执行提供的任何内容。例如,要执行
whoami,我们需要访问 http://flaskapp.thm/whoami

利用命令注入
您通常可以通过应用程序的行为来确定是否可能发生命令注入
使用用户输入通过数据填充系统命令的应用程序通常会出现意外行为。例如,shell operators;和将组合两个(或多个)系统命令并同时执行&它们&&
命令注入主要可以通过以下两种方式之一进行检测:
- 盲命令注入(Blind command injectionn)
- 详细命令注入 (Verbose command injection)
我在下表中定义了这两种方法,下面的两节将更详细地解释这些方法
| 方法 | 描述 |
|---|---|
| Blind(盲) | 这种类型的注入是在测试有效负载时应用程序没有直接输出的地方。您将必须调查应用程序的行为以确定您的负载是否成功。 |
| Verbose(详细) | 这种类型的注入是在您测试有效负载后从应用程序获得直接反馈的地方。例如,运行whoami命令以查看应用程序在哪个用户下运行。Web 应用程序将直接在页面上输出用户名。 |
检测盲命令注入
盲命令注入是在发生命令注入时;但是,没有可见的输出,因此不会立即引起注意。例如,执行了一条命令,但 Web 应用程序没有输出任何消息。
对于这种类型的命令注入,我们需要使用会导致一些时间延迟的有效载荷。例如,ping和sleep命令是用于测试的重要有效负载。例如,根据您指定的ping次数ping,应用程序将挂起x秒
另一种检测盲命令注入的方法是强制输出。这可以通过使用重定向运算符来完成,例如>,例如,我们可以告诉 Web 应用程序执行诸如之类的命令whoami并将其重定向到文件。然后我们可以使用一个命令来cat读取这个新创建的文件的内容
以这种方式测试命令注入通常很复杂,需要大量实验,尤其是 Linux 和 Windows 之间的命令语法不同
该curl 命令是测试命令注入的好方法。这是因为您可以使用curl 有效负载中的应用程序来往来传输数据。以下面的代码片段为例,一个简单的 curl payload 到应用程序就可以进行命令注入。
curl http://vulnerable.app/process.php%3Fsearch%3DThe%20Beatles%3B%20whoami
检测详细命令注入
以这种方式检测命令注入可以说是这两种方法中最简单的方法。详细命令注入是指应用程序向您提供有关正在发生或正在执行的事情的反馈或输出
例如,或命令的输出ping直接whoami显示在 Web 应用程序上
命令执行常用命令
我已经为 Linux 和 Windows 编译了一些常用的有效载荷到下表中
Linux
| payload | 描述 |
|---|---|
| whoami | 查看当前运行账户 |
| ls | 列出当前目录的内容。您可能会找到配置文件、环境文件(令牌和应用程序密钥)等文件,以及更多有价值的东西 |
| ping | 此命令将调用应用程序挂起。这将有助于测试应用程序的盲命令注入 |
| sleep | 这是测试盲命令注入应用程序的另一个有用的有效载荷,如果没有安装ping |
| nc | Netcat 可用于在易受攻击的应用程序上生成反向 shell。您可以使用此立足点在目标计算机周围导航以获取其他服务、文件或提升权限的潜在方法 |
Windows
| payload | 描述 |
|---|---|
| whoami | 查看当前运行账户 |
| dir | 列出当前目录的内容。您可能会找到配置文件、环境文件(令牌和应用程序密钥)等文件,以及更多有价值的东西 |
| ping | 此命令将调用应用程序挂起。这将有助于测试应用程序的盲命令注入 |
| timeout | 此命令还将调用应用程序挂起。ping如果未安装命令,它对于测试应用程序的盲命令注入也很有用 |

防止命令注入
可以通过多种方式防止命令注入。从尽可能少地使用编程语言中具有潜在危险的函数或库,到在不依赖用户输入的情况下过滤输入,应有尽有
下面的示例是 PHP 编程语言;然而,相同的原则可以扩展到许多其他语言
易受攻击的功能
在 PHP 中,许多函数与操作系统交互,通过 shell 执行命令;这些包括:
- Exec
- Passthru
- System
- shell_exec
以下面的代码片段为例。在这里,应用程序将只接受和处理输入到表单中的数字,whoami这意味着将不会处理任何命令

- 该应用程序将只接受特定的字符模式(数字 0-9)
- 然后应用程序将只继续执行这个全是数字的数据。
这些函数接受字符串或用户数据等输入,并将执行系统上提供的任何内容,任何未经适当检查而使用这些功能的应用程序都容易受到命令注入的攻击
** 输入消毒 **
清理应用程序使用的用户输入是防止命令注入的好方法。这是指定用户可以提交的数据格式或类型的过程。例如,一个仅接受数字数据或删除任何特殊字符(如>, &和 )的输入字段/
在下面的代码片段中,filter_input PHP 函数用于检查通过输入表单提交的任何数据是否为数字。如果不是数字,则一定是无效输入

** 绕过过滤器 **
应用程序将采用多种技术来过滤和清理从用户输入中获取的数据。这些过滤器将限制您使用特定的有效载荷;但是,我们可以滥用应用程序背后的逻辑来绕过这些过滤器。例如,一个应用程序可能去掉引号;我们可以改用它的十六进制值来获得相同的结果
执行时,虽然给出的数据格式与预期不同,但仍然可以解释并得到相同的结果


命令执行测试
使用刚刚讲到的姿势使用命令执行,如果忘记,可以使用命令执行备忘单
可以使用以下代码测试命令执行
<?php
echo @shell_exec("ping -n 4".$_GET['c']);
?>
Command Injection-命令注入(命令执行)的更多相关文章
- DVWA(四):Command Injection 全等级命令注入
Command Injection : 命令注入(Command Injection),对一些函数的参数没有做好过滤而导致用户可以控制输入的参数,使其恶意执行系统命令或这cmd.bash指令的一种注入 ...
- CTF练习三 —— 命令注入&命令执行绕过
这个题是第四届强网杯也就是2020.8.22号开始的那场一道简单的命令注入题,再这之前我并没有学习过命令注之类的知识,,,看到题之后先搜在学,,误打误撞解了出来,过段时间wp就会放出来,所以这里就不对 ...
- 安全性测试入门:DVWA系列研究(二):Command Injection命令行注入攻击和防御
本篇继续对于安全性测试话题,结合DVWA进行研习. Command Injection:命令注入攻击. 1. Command Injection命令注入 命令注入是通过在应用中执行宿主操作系统的命令, ...
- Fortify Audit Workbench 笔记 Command Injection(命令注入)
Command Injection(命令注入) Abstract 执行不可信赖资源中的命令,或在不可信赖的环境中执行命令,都会导致程序以攻击者的名义执行恶意命令. Explanation Comman ...
- PHP漏洞全解(二)-命令注入攻击
本文主要介绍针对PHP网站常见的攻击方式中的命令攻击.Command Injection,即命令注入攻击,是指这样一种攻击手段,黑客通过把HTML代码输入一个输入机制(例如缺乏有效验证限制的表格域)来 ...
- PHP命令注入笔记
一.PHP命令注入介绍 在学习php相关的攻击时,遇到了Command Injection,即命令注入攻击,是指这样一种攻击手段,黑客通过把HTML代码输入一个输入机制(例如缺乏有效验证限制的表格域) ...
- PHP代码审计之命令注入
命令注入 命令注入就是通过利用无验证变量构造特殊语句对服务器进行渗透. 注入的种类有很多,而不仅仅是SQL Injection. php常见注入有以下几种(常见:,常见!!): 命令注入 (Comma ...
- 安全测试5_服务端的安全漏洞(SQL注入、命令注入、文件操作类)
前面大致讲解了下客户端的安全漏洞,现在来讲解下服务端的安全漏洞. 1.SQL注入(SQL Injection),是一种常见的Web安全漏洞,攻击者利用这个漏洞,可以访问或修改数据,或者利用潜在的数据库 ...
- CVE-2020-15778 OpenSSH命令注入漏洞复现
一.漏洞概要 OpenSSH 8.3p1及之前版本中的scp允许在scp.c远程功能中注入命令,攻击者可利用该漏洞执行任意命令.目前绝大多数linux系统受影响. 参考链接:https://githu ...
- DVWA之Command Injection
Command Injection Command Injection,即命令注入,是指通过提交恶意构造的参数破坏命令语句结构,从而达到执行恶意命令的目的.PHP命令注入攻击漏洞是PHP应用程序中常见 ...
随机推荐
- Tplmap-20220206
Usage: python tplmap.py [options] 选项: -h, --help 显示帮助并退出 目标: -u URL, --url=URL 目标 URL -X REQUEST, -- ...
- ProcessLassoLauncher.exe
html, body { font-size: 15px } body { font-family: Helvetica, "Hiragino Sans GB", 微软雅黑, &q ...
- 从redis中取出数据并转成java对象
1.//数据存入redis中 redisTemplate.opsForValue().set(loginame, JSON.toJSONString(users),1000,TimeUnit.SECO ...
- 第三课 Hello World显示
HelloWorld 1.新建文件件 2.新建java文件 3.编写代码 public class Hello{ public static void main(String[] args){ Sys ...
- 20 local_settings文件配置 && .gitignore
1 local_settings 第一步:需要在项目根目录下的settings配置如下 try: from .local_settings import * except Exception: pas ...
- element UI 选择时间点(可选择某一个或者多个时间点)
html代码如下: <el-date-picker ref="datesRef" type="dates" v-model="searchObj ...
- 查看linux机器上的cpu个数
1. 查看 cpu 的物理核数cat /proc/cpuinfo| grep "physical id"| sort| uniq| wc -l 查看每个物理CPU中core的个数( ...
- python 时间戳转日期 不自动补零 without zero-padding
1. 时间戳转日期 代码 import time timestamp = 1568171336 time_format = "%Y-%m-%d %H:%M:%S" time_loc ...
- 从xml读取gps数据获取经纬高
#!/usr/bin/python # -*- coding: UTF-8 -*- from xml.dom.minidom import parse import xml.dom.minidom & ...
- Deformable DETR (ICLR2021)
Pre-Trained Image Processing Transformer paper:https://arxiv.org/abs/2010.04159 code:https://github. ...