DVWA靶场实战(二)

二、Command Injection:

1.漏洞介绍:

  Command Injection,中文叫做命令注入,是指通过提交恶意构造的参数破坏命令语句结构,从而达到执行恶意命令的目的。PHP命令注入攻击漏洞是PHP应用程序常见的脚本漏洞之一。

2.漏洞成因:

  (1)外部参数可控:

    应用程序调用了执行系统命令的函数,比如服务器程序通过system、eval、exec等函数直接或者间接的调用cmd.exe。

  (2)内部拼接命令:

    服务器将输入的恶意参数拼接到正常命令中,从而执行命令造成攻击。

3.漏洞危害:

  黑客如果能够利用命令执行漏洞,那么将像控制自己电脑一样控制,自由的进行操作,比如关闭防火墙、查询密码、开启远程服务等操作。

4.防御措施:

  (1)设计者尽可能少设计使用一些命令执行函数。

  (2)若有必要使用,那么必须对特殊函数做过滤,对用户输入的命令做检查,对客户端提交的变量在进入执行命令前做好过滤和检查等。

5.攻击方法:

  可以用以下命令来拼接输入的命令:

    ·A;BA

      →不论正确与否都会执行B

    ·A&B

      →A后台运行,A和B同时执行

    ·A&&B

      →A执行成功后才会执行B

    ·A|B

      →A执行的输出结果作为B命令的参数,A不论正确与否,都会执行B

    ·A||B

      →A执行失败后才会执行B的命令

6.实战:

  在开始实战前有个注意事项,在Low级别下,尝试用“127.0.0.1&&ipconfig”命令进行注入后,发现会有乱码情况。那么解决的方法如下:

    ①在DVWA的安装目录下(……/WWW/DVWA-master/dvwa/includes)找到文件“dvwaPage.inc.php”

    ②打开这个文件,然后全文查找charest=utf-8,有好几处charest=utf-8,然后全部修改成为charest=gb2312

    ③接下来就不会有乱码了

  接下来正式进入实战环节:

    (1)Low:

      ①代码分析:

<?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
$html .= "<pre>{$cmd}</pre>";
} ?>

        可以看到这里直接将target变量放入shell_exec()执行ping命令,没有任何过滤,用户端可以直接拼接特定的命令,来执行并获取想要的信息。

        首先测试“127.0.0.1”这里加上后台命令后就是“ping 127.0.0.1”

        接下去,测试“127.0.0.1&&ipconfig”,执行命令为“ping 127.0.0.1 && ipconfig”,这里结果如下:

        最后尝试“127.0.0.1 && ipconfig && systeminfo”,没问题,可以通过构造恶意传参系统命令或者直接传木马。

  (2)Medium

    代码分析:

<?php

if( isset( $_POST[ 'Submit' ]  ) ) {
// Get input
$target = $_REQUEST[ 'ip' ]; // Set blacklist
$substitutions = array(
'&&' => '',
';' => '',
); // Remove any of the charactars in the array (blacklist).
$target = str_replace( array_keys( $substitutions ), $substitutions, $target ); // 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
$html .= "<pre>{$cmd}</pre>";
} ?>

    这里设置了“黑名单过滤规则”,但是只起到了过滤两种字符分别是“&&”和“;”两种字符,但可以想办法绕过。比如“127.0.0.1 & ipconfig”、“127.0.0.1 | ipconfig”、“111 || ipconfig”等

  (3)High:

    代码分析:

<?php

if( isset( $_POST[ 'Submit' ]  ) ) {
// Get input
$target = trim($_REQUEST[ 'ip' ]); // Set blacklist
$substitutions = array(
'&' => '',
';' => '',
'| ' => '',
'-' => '',
'$' => '',
'(' => '',
')' => '',
'`' => '',
'||' => '',
); // Remove any of the characters in the array (blacklist).
$target = str_replace( array_keys( $substitutions ), $substitutions, $target ); // 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
$html .= "<pre>{$cmd}</pre>";
} ?>

    这里虽然看上去有有些敏感字符被过滤了,但是“|”的后面明显有个空格,意思就是只要不使用空格还是可以绕过的,比如“127.0.0.1 |ipconfig”就是仍然生效的。当然,ipconfig指令也是可以替换的。

 (4)Impossible:

    代码分析:

<?php

if( isset( $_POST[ 'Submit' ]  ) ) {
// Check Anti-CSRF token
checkToken( $_REQUEST[ 'user_token' ], $_SESSION[ 'session_token' ], 'index.php' ); // Get input
$target = $_REQUEST[ 'ip' ];
$target = stripslashes( $target ); // Split the IP into 4 octects
$octet = explode( ".", $target ); // Check IF each octet is an integer
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]; // 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
$html .= "<pre>{$cmd}</pre>";
}
else {
// Ops. Let the user name theres a mistake
$html .= '<pre>ERROR: You have entered an invalid IP.</pre>';
}
} // Generate Anti-CSRF token
generateSessionToken(); ?>

    这里已经严格限制了输入接收的参数只能是“数字.数字.数字.数字”的模式,所以不存在命令注入的漏洞了。

DVWA靶场实战(二)——Command Injection的更多相关文章

  1. DVWA靶场实战(七)——SQL Injection

    DVWA靶场实战(七) 七.SQL Injection: 1.漏洞原理: SQL Inject中文叫做SQL注入,是发生在web端的安全漏洞,主要是实现非法操作,例如欺骗服务器执行非法查询,他的危害在 ...

  2. DVWA笔记之二:Command Injection

    命令注入 1.Low级别 <?php  if( isset( $_POST[ 'Submit' ]  ) ) {      // Get input      $target = $_REQUE ...

  3. DVWA靶场实战(十二)——XSS(Stored)

    DVWA靶场实战(十二) 五.XSS(Stored): 1.漏洞原理: XSS的Stored被称作存储型XSS漏洞,漏洞的原理为语句被保存到服务器上,显示到HTML页面中,经常出现在用户评论的页面,攻 ...

  4. DVWA靶场实战(五)——File Upload

    DVWA靶场实战(五) 五.File Upload: 1.漏洞原理: File Upload中文名叫做文件上传,文件上传漏洞是指用户上传了一个可执行脚本文件(php.jsp.xml.cer等文件),而 ...

  5. DVWA靶场实战(三)——CSRF

    DVWA靶场实战(三) 三.CSRF: 1.漏洞原理: CSRF(Cross-site request forgery),中文名叫做"跨站请求伪造",也被称作"one c ...

  6. DVWA靶场实战(四)——File Inclusion

    DVWA靶场实战(四) 四.File Inclusion: 1.漏洞原理: 随着网站的业务的需求,程序开发人员一般希望代码更加灵活,所以将被包含的文件设置为变量,用来进行动态调用,但是正是这种灵活性通 ...

  7. DVWA靶场实战(一)——Brute Force

    DVWA靶场实战(一) 一.Brute Force: 1.漏洞原理: Brute Force是暴力破解的意思,大致原理就是利用穷举法,穷举出所有可能的密码. 2.攻击方法: Burpsuite中的In ...

  8. DVWA靶场实战(六)——Insecure CAPTCHA

    DVWA靶场实战(六) 六.Insecure CAPTCHA: 1.漏洞原理: Insecure CAPTCHA(不安全的验证码),CAPTCHA全程为Completely Automated Pub ...

  9. DVWA靶场实战(九)——Weak Session IDS

    DVWA靶场实战(九) 九.Weak Session IDS: 1.漏洞原理: Weak Session IDS也叫做弱会话,当用户登录后,在服务器就会创造一个会话(session),叫做会话控制,接 ...

随机推荐

  1. Mybatis-Plus自动生成器生成代码基于springboot项目启动

    创建springbootweb项目 pom.xml 导入 MBP 依赖 <dependency> <groupId>com.baomidou</groupId> & ...

  2. 使用工厂方法模式设计能够实现包含加法(+)、减法(-)、乘法(*)、除法(/)四种运算的计算机程序,要求输入两个数和运算符,得到运算结果。要求使用相关的工具绘制UML类图并严格按照类图的设计编写程序实

    2.使用工厂方法模式设计能够实现包含加法(+).减法(-).乘法(*).除法(/)四种运算的计算机程序,要求输入两个数和运算符,得到运算结果.要求使用相关的工具绘制UML类图并严格按照类图的设计编写程 ...

  3. 还在使用@Autowrired注入?不妨试试@RequiredArgsConstructor

    一.前言 小编最近在项目里看到有的同事大神用到了Lombok中的一个@RequiredArgsConstructor,带着好奇发现这个东西就是简化了一些@Autowired注解,想想如果一个Servi ...

  4. 11.-ORM-基本操作-创建数据

    一.ORM-操作 基本操作包括增删改查,即(CRUD)操作 CRUD是指在做计算处理时增加(create).读取查询(read).更新(update).删除(delete) ORM CRUD 核心 - ...

  5. 9-模型层及ORM介绍

    一.模型层 模型层负责和数据库之间进行通信     二.Django配置mysql数据库 1.Django默认的数据库是sqllite3,将其更改为mysql数据库需要进行对应配置 1.安装mysql ...

  6. k8s机器群扩容问题

    今天遇到了一个很奇葩的问题.公司新人吧k8s集权扩容完后,发现服务器上的磁盘没有做分区2T磁盘没有做任何动作 把两台slave节点扩容上去的节点弄到了/目录.由于是生产环境情况比较特殊并没通过kube ...

  7. 某 .NET RabbitMQ SDK 有采集行为,你怎么看?

    一:背景 1.讲故事 前几天有位朋友在微信上找到我,说他的一个程序上了生产之后,被运维监控定位到这个程序会向一个网址为: http://m.365ey.net 上不定期打数据,而且还是加密的格式,要他 ...

  8. Python基础部分:9、数据的类型和内置方法

    目录 一.数据类型内置方法理论 1.什么是数据内置方法 2.如何调用数据内置方法 二.整型(int)内置方法与操作 1.类型转换 2.进制数转换 三.浮点型(float)内置方法与操作 1.类型转换 ...

  9. Fibonacci数列 与 杨辉三角

    Fibonacci数列:除第一个与第二个数之外,其余数均由前两个数相加得到: 1, 1, 2, 3, 5, 8, 13, 21, 34, ... 通过生成器,程序如下: def fib(max): m ...

  10. MessagePack 和System.Text.Json 序列号 反序列化对比

    本博客将测试MessagePack 和System.Text.Json 序列号 反序列化性能 项目文件: Program.cs代码: using BenchmarkDotNet.Running; us ...