dvwa-command injection 代码审计(超详细逐行审计)

dvwa-command injection 代码审计

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
    echo "<pre>{$cmd}</pre>";
}

?>

isset( $_POST[ 'Submit' ]此代码判断接受的post参数是否为空

$target = $_REQUEST[ 'ip' ];request方式接受ip参数

stristr( php_uname( 's' ), 'Windows NT' 此参数为真时,执行ping命令(意为在windows系统中执行ping命令)

否则执行ping命令4次(意为在unix或linux中执行ping4次)

其中的stristr函数如下

stristr()函数在PHP中用于在字符串中查找子字符串,并返回第一个匹配的子字符串及其后面的部分,而且不区分大小写

示例

$str = "Hello, World!";
$substring = "world";
$result = stristr($str, $substring);
echo $result; // 输出 "World!"

php_uname()函数如下,此代码中即为查看系统信息是否为Windows NT

在PHP中,php_uname()函数用于获取操作系统的信息。该函数返回一个包含系统信息的字符串,包括操作系统名称、主机名、内核版本、发布版本等

  • “a”:默认值,返回所有系统信息
  • “s”:返回操作系统名称
  • “n”:返回主机名
  • “r”:返回内核版本
  • “v”:返回发布版本
  • “m”:返回机器类型

最后则返回执行结果

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
    echo "<pre>{$cmd}</pre>";
}

?>

该级别代码几乎和low一致,仅添加两个过滤

关键代码部分

$substitutions = array( '&&' => '', ';' => '', );

此代码为使用array函数快速定义一个数组,并将其值赋给substitutions

$target = str_replace( array_keys( $substitutions ), $substitutions, $target );

array_keys( $substitutions )该函数为获取变量中的 键 即key

<?php
	$substitutions = array(
		'&&' => '',
		';'  => '',
	);
	var_dump($substitutions);
	print("<br/>");
	$a=array_keys($substitutions);
	var_dump($a);
?>

输出结果

image-20231121170431441

然后使用srt_replace()函数进行字符串替换

该函数如下

str_replace()函数用于在字符串中替换指定的子字符串。它可以用于执行简单的字符串替换操作,例如将一个子字符串替换为另一个子字符串

str_replace (mixed $search , mixed $replace , mixed $subject [, int &$count ]) : mixed

search是要搜索的字符串或字符串数组,replace是要替换为的字符串或字符串数组,subject是被搜索的原始字符串,count是一个可选参数,用于存储替换操作的次数

示例

$string = "Hello, World!";
$new_string = str_replace("World", "PHP", $string);
echo $new_string;

输出结果即为 Hello, PHP!

此处即,搜索输入的target的值,将其中substitutions数组中的键替换成substitutions变量中该键所对应的值,从而达成将输入的&&或者;进行置空过滤

high


<?php

if( isset( $_POST[ 'Submit' ]  ) ) {
    // Get input
    $target = trim($_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
    echo "<pre>{$cmd}</pre>";
}

?>

相较上一关,该难度差别在如下代码

$target = trim($_REQUEST[ 'ip' ]);

    // Set blacklist
    $substitutions = array(
        '&'  => '',
        ';'  => '',
        '| ' => '',
        '-'  => '',
        '$'  => '',
        '('  => '',
        ')'  => '',
        '`'  => '',
        '||' => '',
    );

增加了过滤项,但是原理不变

除此之外添加了trim()处理输入的内容

trim()函数用于删除字符串开头和结尾处的空白字符(空格、制表符、换行符等)或者其它指定字符

string trim ( string $str [, string $character_mask = " \t\n\r\0\x0B" ] )

str是要处理的字符串,character_mask是一个可选参数,用于指定要删除的字符。如果不指定$character_mask参数,默认会删除空格、制表符、换行符、回车符、空字符和垂直制表符

示例

$str = "   Hello, World!   ";
$new_str = trim($str);
echo $new_str;

输出结果为 Hello, World!

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
        echo "<pre>{$cmd}</pre>";
    }
    else {
        // Ops. Let the user name theres a mistake
        echo '<pre>ERROR: You have entered an invalid IP.</pre>';
    }
}

// Generate Anti-CSRF token
generateSessionToken();

?>

checkToken( $_REQUEST[ 'user_token' ], $_SESSION[ 'session_token' ], 'index.php' );

将三个参数传递给checktoken函数,checktoken函数一般用于验证匹配用户token和用户session是否匹配,如不匹配则跳转到index.php

$_REQUEST[ 'user_token' ]:这是一个 PHP 超全局数组,用于获取 HTTP 请求中的参数。在这里,$_REQUEST['user_token'] 用于获取名为 user_token 的参数的值。

$_SESSION['session_token']:这是 PHP 的会话(Session)变量,用于在用户会话之间存储数据。在这里,$_SESSION['session_token'] 用于获取名为 session_token 的会话变量的值

index.php:这是一个字符串,表示一个重定向页面的 URL。如果 checkToken 函数判断验证失败,用户将被重定向到这个页面

$target = stripslashes( $target );该行代码为过滤输出内容

stripslashes() 函数用于去除由 addslashes() 函数添加的反斜杠。在 PHP 中,addslashes() 用于在特定字符前添加反斜杠,以防止 SQL 注入和其他安全漏洞。而 stripslashes() 则用于将这些反斜杠去除,恢复原始的字符串

$octet = explode( ".", $target );该行explode函数通过 点 将输入的内容分段,被分割的部分会以数组的形式存储在变量中

if( ( is_numeric( $octet[0] ) ) && ( is_numeric( $octet[1] ) ) && ( is_numeric( $octet[2] ) ) && ( is_numeric( $octet[3] ) ) && ( sizeof( $octet ) == 4 ) ) {该行代码使用is_numeric函数判断该分割后的数组中的每个元素是否为数字,当全部都为数字时判断为真,才会向下执行,is_numric函数会将十六进制也视为数字,可以考虑将代码编程16进制,但是由于有分段组合成ip的这一步,所以该方法也不能实现

$target = $octet[0] . '.' . $octet[1] . '.' . $octet[2] . '.' . $octet[3];重新将该数组拼接,然后剩下的代码就与之前一样了

可以说是限制了所有字符和字母

numeric( $octet[3] ) ) && ( sizeof( $octet ) == 4 ) ) {`该行代码使用is_numeric函数判断该分割后的数组中的每个元素是否为数字,当全部都为数字时判断为真,才会向下执行,is_numric函数会将十六进制也视为数字,可以考虑将代码编程16进制,但是由于有分段组合成ip的这一步,所以该方法也不能实现

$target = $octet[0] . '.' . $octet[1] . '.' . $octet[2] . '.' . $octet[3];重新将该数组拼接,然后剩下的代码就与之前一样了

可以说是限制了所有字符和字母

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

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

相关文章

姓氏情侣家庭亲子谐音顽梗头像分销流量主微信抖音小程序开发

姓氏情侣家庭亲子谐音顽梗头像分销流量主微信抖音小程序开发 姓氏情侣头像&#xff1a;提供各种姓氏的情侣头像模板&#xff0c;用户可根据自己的姓氏选择合适的头像进行定制。 家庭头像&#xff1a;为家庭成员提供多种形式的头像模板&#xff0c;让用户可以选择合适的家庭头像…

使用Arrays.asList与不使用的区别

在写算法的时候&#xff0c;遇到了有的题解使用的是Arrays.asList&#xff0c;也有的是直接新建一个List集合将元素加进去的。 看了一下算法的时间&#xff0c;两者居然相差了9秒。 算法原地址&#xff1a; 力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长…

虾皮选品免费工具:如何用知虾进行虾皮市场分析选品

在如今的电商时代&#xff0c;了解市场需求和选择热销产品是成功经营的关键。虾皮作为东南亚地区最大的电商平台之一&#xff0c;提供了一系列的选品工具&#xff0c;帮助卖家在市场竞争中脱颖而出。本文将介绍如何使用虾皮的免费工具——知虾进行虾皮市场分析选品&#xff0c;…

Google Chrome 任意文件读取 (CVE-2023-4357)漏洞

漏洞描述 该漏洞的存在是由于 Google Chrome 中用户提供的 XML 输入验证不足。远程攻击者可以创建特制网页&#xff0c;诱骗受害者访问该网页并获取用户系统上的敏感信息。远程攻击者可利用该漏洞通过构建的 HTML 页面绕过文件访问限制&#xff0c;导致chrome任意文件读取。Li…

捷诚管理信息系统 SQL注入漏洞复现

0x01 产品简介 捷诚管理信息系统是一款功能全面&#xff0c;可以支持自营、联营到外柜租赁的管理&#xff0c;其自身带工作流管理工具&#xff0c;能够帮助企业有效的开展内部审批工作。 0x02 漏洞概述 捷诚管理信息系统CWSFinanceCommon.asmx接口存在SQL注入漏洞。未经身份认…

<C++> 模板-下

目录 前言 一、非类型模板参数 二、类模板的特化 1. 概念 2. 函数模板特化 3. 类模板特化 4. 全特化 5. 偏特化 5.1 特化部分参数 5.2 对某些类型的进一步限制 三、模板的分离编译 1. 概念 2. 分离编译 3. 解决方法 1. 显式实例化 2. 在一个文件内写声明和定义 四、模板总结 …

基于nodejs学校宿舍管理系统-计算机毕设 附源码45118

nodejs学校宿舍管理系统 摘要 信息化社会内需要与之针对性的信息获取途径&#xff0c;但是途径的扩展基本上为人们所努力的方向&#xff0c;由于站在的角度存在偏差&#xff0c;人们经常能够获得不同类型信息&#xff0c;这也是技术最为难以攻克的课题。针对学校宿舍管理系统等…

Java_异常详解

前言 异常是什么,异常如何抛出,如何抛出自定义异常,异常处理主要的五个关键字&#xff1a;throw,try,catch,finally,throws ,异常的处理流程 异常是什么 在Java中&#xff0c;将程序执行过程中发生的不正常行为称为异常。比如之前写代码时经常遇到的&#xff1a; 1. 算数异…

PySide6 Tutorials (一)表格小部件魔改

前言 Pyside6官方教程给了一个使用表格显示颜色的教程&#xff0c;原教程地址如下&#xff1a;源地址&#xff0c; 结合前面button信号的学习&#xff0c;就魔改添加了如下功能&#xff1a;增加一列按钮&#xff0c;可以修改该行的颜色值&#xff0c;通过点击按钮生成指定的颜…

口袋参谋:找关键词的三种方法!

​如何找热搜关键词&#xff1f;99%的商家都不知道。那么今天可以根据我说的三种方法去做。 第一种方法&#xff1a;利用竞争对手 通过分析竞争对手&#xff0c;正在使用和采取何种优化方法&#xff0c;来帮助你理解市场上正在流行什么样的关键字&#xff0c;这些热词可以直接从…

uniapp中swiper 轮播带左右箭头,点击切换轮播效果demo(整理)

可以点击箭头左右切换-进行轮播 <template><view class"swiper-container"><swiper class"swiper" :current"currentIndex" :autoplay"true" interval"9000" circular indicator-dotschange"handleSw…

golang指针学习

package mainimport "fmt"func main() {name:"飞雪无情"nameP:&name//取地址fmt.Println("name变量的内存地址为:",&name)fmt.Println("name变量的值为:",name)fmt.Println("name变量的内存地址为:",nameP)fmt.Prin…

中大型企业网搭建(毕设类型)

毕业设计类别 某大学网络规划与部署 目录 某大学网络规划与部署 第一章项目概述 1.1 项目背景 1.2 网络需求分析 第二章网络总体设计方案 2.1 网络整体架构 2.2 网络设计思路 第三章 网络技术应用 3.1 DHCP 3.2 MSTP 3.3 VRRP 3.4 OSPF 3.5 VLAN 3.6 NAT 3.7 WLAN 3…

完美解决:yum -y install nginx 报出 没有可用软件包 nginx。错误:无须任何处理

目录 一、问题&#xff1a; 二、原因&#xff1a; 三、解决方法&#xff1a; 一、问题&#xff1a; [rootlocalhost ~]# yum -y install nginx 已加载插件&#xff1a;fastestmirror Loading mirror speeds from cached hostfile * base: mirrors.bfsu.edu.cn * extras: m…

纽扣电池/含纽扣电池产品上架亚马逊各国法规标准要求16 CFR 第 1700.15/20 ANSI C18.3M(瑞西法案认证)

亚马逊纽扣电池认证标准有哪些&#xff1f; 一、美国站&#xff08;亚马逊纽扣电池/含纽扣电池商品&#xff09;安全测试标准要求&#xff1a; 16 CFR 第 1700.15 、16 CFR 第 1700.20 ANSI C18.3M、警示标签声明要求&#xff08;第 117-171 号公众法&#xff09; 二、澳大…

SQL的连接join

一、连接说明 union、intersect等集合运算&#xff0c;它的特征是以 “行” 为单位进行操作&#xff0c;通俗点说&#xff0c;就是进行这些集合运算&#xff0c;会导致记录行数的增减&#xff0c;使用union会增加记录行数&#xff0c;使用 intersect 或 expect 会减少行记录&a…

java中,通过替换word模板中的关键字后输出一个新文档

一、要用到的jar包 我已上传了相关的jar包&#xff0c;需要的可以通过以下链接直接下载&#xff1a; https://download.csdn.net/download/qq_27387133/88558034 具体jar包截图&#xff1a; 二、实现的代码 注意&#xff1a;文件要用docx格式!!! word变量替换的方法&#…

模板初阶学习

✨前言✨ &#x1f4d8; 博客主页&#xff1a;to Keep博客主页 &#x1f646;欢迎关注&#xff0c;&#x1f44d;点赞&#xff0c;&#x1f4dd;留言评论 ⏳首发时间&#xff1a;2023年11月21日 &#x1f4e8; 博主码云地址&#xff1a;博主码云地址 &#x1f4d5;参考书籍&…

docker-compose安装harbor

docker-compose安装harbor 环境&#xff1a;centos7 1、安装docker 官方文档 https://docs.docker.com/engine/install/centos/ 1、卸载旧版本 $ sudo yum remove docker \docker-client \docker-client-latest \docker-common \docker-latest \docker-latest-logrotate …

设计模式—结构型模式之享元模式

设计模式—结构型模式之享元模式 享元模式(Flyweight Pattern)&#xff0c;运用共享技术有效地支持大量细粒度对象的复用。系统只使用少量的对象&#xff0c;而这些对象都很相似&#xff0c;状态变化很小&#xff0c;可以实现对象的多次复用。对象结构型。 在享元模式中可以共…