需要的环境: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. Cron表达式介绍与示例

      1. 概念介绍 Cron表达式是一个具有时间含义的字符串,字符串以5~6个空格隔开,分为6~7个域,格式为X X X X X X X.其中X是一个域的占位符.最后一个代表年份的域非必须,可省略.单 ...

  2. 详解 APISIX Lua 动态调试插件 inspect

    作者罗锦华,API7.ai 技术专家/技术工程师,开源项目 pgcat,lua-resty-ffi,lua-resty-inspect 的作者. 原文链接 为什么需要 Lua 动态调试插件? Apac ...

  3. 笔记:C++学习之旅---IO库

    笔记:C++学习之旅---IO库 C++的输入输出分为三种: (1)基于控制台的I/O (2)基于文件的I/O (3)基于字符串的I/O           练习8.4  编写函数,以读模式打开一个文 ...

  4. Unix shell开头的#!

    1:位于脚本文件最开始 2:#!告诉系统内核应有哪个shell来执行所指定的shell脚本. 3:如#! /bin/bash ,#!与shell文件名之间可以有空格,没有限定. 4:指定的shell可 ...

  5. vue本地开发配置及项目部署

    一,  二,本地模拟配置代理,请求qq音乐的接口数据  三,axios请求头封装               参考http://www.axios-js.com/zh-cn/docs/#%E4%BB% ...

  6. sqlmap安全测试工具使用简介

    SQLmap是一个自动化的SQL注入工具,其主要功能是扫描,发现并利用给定的URL的SQL注入漏洞,目前支持的数据库是MySQL,Oracle,PostgreSQL,Microsoft  SQL  S ...

  7. 一文搞懂 Promise 新 Api allSettled 的用法和 all 区别,以及如何在不支持新特性的环境下实现一个 Polyfill

    开始 一文搞懂 Promise 新 Api allSettled 的用法和 all 区别,以及如何在不支持新特性的环境下实现一个 Polyfill allSettled 的用法 const runAl ...

  8. 中国剩余定理(CRT)学习笔记

    约定 \(A\perp B\) 表示 \(\gcd(A,B)=1\). \(A\mid B\) 表示 \(B\equiv 0\pmod{A}(A\neq0)\). 引入 考虑以下这道题: 有物不知其數 ...

  9. Python3.10动态修改Windows系统(win10/win11)本地IP地址(静态IP)

    一般情况下,局域网里的终端比如本地服务器设置静态IP的好处是可以有效减少网络连接时间,原因是过程中省略了每次联网后从DHCP服务器获取IP地址的流程,缺点是容易引发IP地址的冲突,当然,还有操作层面的 ...

  10. 消息推送平台的实时数仓?!flink消费kafka消息入到hive

    大家好,3y啊.好些天没更新了,并没有偷懒,只不过一直在安装环境,差点都想放弃了. 上一次比较大的更新是做了austin的预览地址,把企业微信的应用和机器人消息各种的消息类型和功能给完善了.上一篇文章 ...