需要的环境:dvwa

使用的工具:PHP手册

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>";
}
?>

首先进行if判断,使用isset函数判断post传入的参数是否为空,如果不为空,执行下面的语句

trim

遇到了不熟悉的语句trim,翻PHP手册并尝试使用该语句,

$target = **<u>trim</u>**($_REQUEST[ 'ip' ]);

由手册得知,trim可以去除字符串首尾的空白字符,能够使页面更加整洁

尝试trim函数

如图,php代码内参数左边有一个空格,中间一个空格,右边有两个空格,为了更加直观的看出区别,使用管道符对两个变量进行分割,同时输出

网页页面看不出太大区别

右键查看网页的源代码,可以看出管道符左右的区别,使用trim函数后,参数中间空格不受影响,两边的空格消失,没什么太大作用,只是使页面更加整洁美观

=============================================

array

翻手册查询语句array

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

使用array函数可以创建一个数组

=============================================

查询语句str_replace,array_keys

$target = str_replace( array_keys( $substitutions ), $substitutions, $target );
array_keys函数在str_replace函数中,从里到外对函数进行解析

array_keys

array_keys( $substitutions )
array_keys返回数组中的键名,可知该函数获取了array函数中的键名

尝试array_keys函数

使用var_dump输出array_keys函数的内容及类型

如图输出了一个索引数组

看起来不太明显,使用for循环对数组进行遍历

$arr1=array_keys($substitutions)
//定义一个变量arr1,把array_keys数组赋赋给变量arr1 for($a=0,$a<sizeof($substitutions),$a++){
//sizeof用于计算数组内元素的个数
//定义一个变量a为0,当变量a小于$substitutions变量内元素个数的时候停止,变量a自增 echo $arr1[$a]."<br \>";
//取$arr1数组内的第$a个元素,返回给$arr1,并输出,为了更加直观,拼接一个换行
//这样可以查看到array_keys返回的数组具体有什么
}

由此可知array_keys具体返回的数组

由此可知,array_keys函数将$substitutions数组中的键名取出并做成了一个新的索引数组

=============================================

str_replace

str_replace( array_keys( $substitutions ), $substitutions, $target )
str_replace函数可以对字符串进行替换

尝试str_replace函数
$substitutions = array(
'ipconfig' => '',
'whoami' => '',
'pwd' => '',
);
$arr1 = array_keys( $substitutions ); $a="whoamiabcipconfig123pwd";
echo $a.<br \>;
//分别输出执行str_replace前后的字符串
//str_replace(数组1返回的键名,数组1,变量(字符串))
echo str_replace($arr1, $substitutions, $a);

如图可知,str_replace将(第三个参数)中的字符串与(第一个参数)数组1返回的键名进行匹配,有相同的字符串就会访问(第二个参数)数组1查看规则将其替换为空

解析语句str_replace( array_keys( $substitutions ), $substitutions, $target )

str_replace( array_keys( $substitutions ), $substitutions, $target )
//先通过array_keys返回$substitutions数组内的键名,然后根据键名,查找传递过来的$target,如果有与键名相匹配的字符,就根据$substitutions数组内的value值进行替换

=============================================

stristr

stristr( php_uname( 's' ), 'Windows NT' )
php_uname用于返回php系统信息

尝试php_name,由此可知,该函数用于判定当前操作系统的版本(由于Windows系统和*nix系统的ping规则不同,所以需要区分,分别进行操作)

stristr是strstr的忽略大小写版本

Windows不区分大小写,但是php区分大小写,所以需要stristr函数来忽略大小写

strstr用于查找字符串的首次出现

解析语句stristr( php_uname( 's' ), 'Windows NT' )
stristr( php_uname( 's' ), 'Windows NT' )
//查看当前的操作系统是否为Windows,忽略大小写

=============================================

全代码解析

<?php
if( isset( $_POST[ 'Submit' ] ) ) {
//进行if判断,使用isset函数判断post传入的参数是否为空,如果不为空,执行下面的语句
$target = trim($_REQUEST[ 'ip' ]);
//去除用户输入字符串首尾的空白字符,并返回给变量$target,使页面更加整洁
$substitutions = array(
'&' => '',
';' => '',
'| ' => '',
'-' => '',
'$' => '',
'(' => '',
')' => '',
'`' => '',
'||' => '',
); //创建一个数组 $target = str_replace( array_keys( $substitutions ), $substitutions, $target );
//先通过array_keys返回$substitutions数组内的键名,然后根据键名,查找传递过来的$target,如果有与键名相匹配的字符,就根据$substitutions数组内的value值进行替换,再将数值返回给$target
if( stristr( php_uname( 's' ), 'Windows NT' ) ) {
//if进行判断,查看当前的操作系统是否为Windows,忽略大小写,如果为windows,执行下面的语句,对目标进行ping命令,返回给变量$cmd
$cmd = shell_exec( 'ping ' . $target );
}
else {
//if判断如果不为Windows则默认为*nix系统,对目标进行ping命令,限制为4个包,返回给变量$cmd
$cmd = shell_exec( 'ping -c 4 ' . $target );
}
//将返回的结果$cmd输出到页面
echo "<pre>{$cmd}</pre>";
}
?>

关于DVWA靶场高难度命令执行的代码审计的更多相关文章

  1. DVWA之Command injection(命令执行漏洞)

    目录 Low Medium Middle Impossible 命令执行漏洞的原理:在操作系统中, &  .&& .|  . ||   都可以作为命令连接符使用,用户通过浏览器 ...

  2. DVWA之命令执行

    一.命令执行漏洞 命令执行漏洞是指可以随意执行系统命令,属于高危漏洞之一,也属与代码执行范围内,好比说一句话木马<?php@eval($_POST['cmd']);?> 二.分类: 1.代 ...

  3. Kali学习笔记30:身份认证与命令执行漏洞

    文章的格式也许不是很好看,也没有什么合理的顺序 完全是想到什么写一些什么,但各个方面都涵盖到了 能耐下心看的朋友欢迎一起学习,大牛和杠精们请绕道 实验环境: Kali机器:192.168.163.13 ...

  4. PHP的命令执行漏洞学习

    首先我们来了解基础 基础知识来源于:<web安全攻防>徐焱 命令执行漏洞 应用程序有时需要调用一些执行系统命令的函数,如在PHP中,使用system.exec.shell_exec.pas ...

  5. 从DVWA靶场学代码审计

    DVWA是较为经典的一个传统漏洞的靶场 内置了low,medium,hight,impossible四个安全级别供安全人员去研究相关漏洞.今天就来对impossible这个级别进行代码审计,从中学习一 ...

  6. DVWA靶场之File Inclusion(文件包含)通关

    文件包含,未经过严格过滤,将一些恶意构造带入了包含函数,可以使用一些包含函数来包含一些其他乱七八糟的东西,要么导致任意文件读取,要么命令执行 文件包含包括远程文件包含(RFI)和本地文件包含(LFI) ...

  7. CVE 2021-44228 Log4j-2命令执行复现及分析

    12月11日:Apache Log4j2官方发布了2.15.0 版本,以修复CVE-2021-44228.虽然 2.15.0 版本解决了Message Lookups功能和JNDI 访问方式的问题,但 ...

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

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

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

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

  10. DVWA靶场实战(二)——Command Injection

    DVWA靶场实战(二) 二.Command Injection: 1.漏洞介绍: Command Injection,中文叫做命令注入,是指通过提交恶意构造的参数破坏命令语句结构,从而达到执行恶意命令 ...

随机推荐

  1. 如何玩转国产神器:接口一体化协作平台Apifox!

    前言:Apifox是什么? 简介: 简单来说,Apifox = swagger + mock + postman+Jmeter,是API 文档.API 调试.API Mock.API 自动化测试一体化 ...

  2. #Powerbi 利用视觉对象着色地图,制作数据地图

    日常工作中,有时我们会遇到需要地图来展示我们的数据场景,利用POWERBI,我们可以快速的制作自己的业务地图. Powerbi自带了三大地图,今天我们用到的是形状地图. 步骤讲解: 第一步:下载对应的 ...

  3. 数据库定时备份winserver2012篇

    目录 1 序言 2 任务计划相关知识点介绍 2.1 任务计划 是什么? 2.2 批处理文件 2.2.1 批处理文件简介 2.2.2 批处理常用命令介绍 3 各个数据库备份脚本 3.1 Oracle数据 ...

  4. Vue拖拽排序

    转载至https://www.crazyming.com/note/757/ 使用拖拽功能来实现排序. 需要先学习w3cschool 关于拖拽的教程:http://www.w3school.com.c ...

  5. 2022-03-31:有一组 n 个人作为实验对象,从 0 到 n - 1 编号,其中每个人都有不同数目的钱, 以及不同程度的安静值(quietness) 为了方便起见,我们将编号为 x 的人简称为

    2022-03-31:有一组 n 个人作为实验对象,从 0 到 n - 1 编号,其中每个人都有不同数目的钱, 以及不同程度的安静值(quietness) 为了方便起见,我们将编号为 x 的人简称为 ...

  6. mysql报错Unknown collation: utf8mb4_0900_ai_ci

    mysql报错Unknown collation: utf8mb4_0900_ai_ci 解决方案: 将文件内的所有 utf8mb4_0900_ai_ci 换成 utf8_general_ci utf ...

  7. calendar.monthrange

    import calendar calendar.monthrange(2019,5) 输出结果:(2, 31) 解析: 这里使用了函数 calendar.monthrange(year,month) ...

  8. 使用vite的创建vue项目

    首先也是打开项目文件目录 在标签处快速打上cmd即可打开cmd窗口 然后按照顶部图进行操作即可完成 安装完成的样子如下图 紧接着输入 npm run dev 将Local 的IP复制到浏览器打开,出现 ...

  9. MassTransit类库Saga文档翻译

    翻译自 Saga State Machines Saga State Machines(状态机) Saga State Machines(状态机)以前被称为Automatonymous,从v8开始被合 ...

  10. 读文献先读图——主成分分析 PCA 图

    上周五彩斑斓的气泡图 有让你眼花缭乱吗? 本周,化繁为简的PCA图 你值得拥有!  数据分析| 科研制图﹒PCA 图 关键词:主成分分析.降维 1665 年的鼠疫 牛顿停课在家提出了万有引力 ;183 ...