各位小伙伴,今天我们继续学习Command Injection,翻译为中文就是命令行注入。是指通过提交恶意构造的参数破坏命令语句结构,从而达到执行恶意命令的目的。在OWASP TOP 10中一种存在注入漏洞,最常见的就是SQL和命令行注入。PHP开发的系统中存在命令注入漏洞,也是PHP应用程序中常见的脚本漏洞之一,国内著名的Web应用程序Discuz!、DedeCMS等都曾经存在过该类型漏洞。

命令执行漏洞的产生原因一般就是将用户输入未经过滤或者过滤不严就直接当作系统命令进行执行,我们可以通过批处理中的一些技巧来一次执行多条命令,这样就可以执行任意命令。在命令执行中,常用的命令连接符号有五个:&&、&、||、|和;

&&:前一个指令执行成功,后面的指令才继续执行,就像进行与操作一样

||:前一个命令执行失败,后面的才继续执行,类似于或操作

&:直接连接多个命令

|:管道符,将前一个命令的输出作为下一个命令的输入

;:直接连接多个命令

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 {

// unix/Linux

$cmd = shell_exec( 'ping -c 4 ' . $target );

}

// Feedback for the end user

$html .= "<pre>{$cmd}</pre>";

}

?>

分析:

服务器端首先获取用户提交的ip,接着获取服务端的系统信息,根据不同操作系统选择不同的ping命令格式,但是后续并没有对用户的输入做任何的过滤,就会导致严重的漏洞

stristr()函数定义和用法:

stristr() 函数搜索字符串在另一字符串中的第一次出现。

注释:该函数是二进制安全的。

注释:该函数是不区分大小写的。如需进行区分大小写的搜索,请使用 strstr() 函数。

语法:stristr(string,search,before_search)

php_uname(mode)函数定义和用法:

这个函数会返回运行php的操作系统的相关描述,参数mode可取值:

”a”(此为默认,包含序列”s n r v m”里的所有模式),

”s”(返回操作系统名称),

”n”(返回主机名),

“r”(返回版本名称),

”v”(返回版本信息),

”m”(返回机器类型)。

漏洞利用

无论是linux系统还是windows系统,我们都可以用&&来执行多条命令语句。所以我们执行的payload可以是127.0.0.1&&ipconfig可以发现返回了执行结果,ip详细信息,见下面截图:

当然,这里的127.0.0.1可以换成任何IP地址,而&&后面可以接各种命令,例如127.0.0.1&&del c:windowsinfo.log, 则删除windows目录下info.log文件,del文件不会显示任何信息。

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

}

?>

分析:

通过源码我们可以看出,相对比于low级别,medium级别设置了黑名单,将&&和;做了过滤处理,&&不行,我们可以改用&

这里说明下几个符号的区别:

command1&command2&command3 三个命令同时执行

command1;command2;command3 不管前面命令执行成功没有,后面的命令继续执行

command1&&command2 只有前面命令执行成功,后面命令才继续执行

漏洞利用

我们就改用&,所以payload就变成了127.0.0.1&ipconfig

可以看到payload执行成功

3、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

$html .= "<pre>{$cmd}</pre>";

}

?>

分析:

还以为会是多么高端的过滤方式,只不过是把黑名单稍微细化了一下,但是依然可以使用|

Command 1 | Command 2

“|”是管道符,表示将Command 1的输出作为Command 2的输入,并且只打印Command 2执行的结果。

漏洞利用

127.0.0.1|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();

?>

分析:

通过源代码分析我们可以看到:

1、该模块中加入了Anti-CSRF token来防范CSRF攻击,同时每次随机生成了一个token,当用户提交的时候,在服务器端比对一下token值是否正确,不正确就丢弃掉,正确就验证通过。

// Check Anti-CSRF token

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

2、通过加入stripslashes函数来对输入的ip信息进行删除字符串中的反斜杠操作。

$target = stripslashes( $target );

3、对输入的信息通过“.”号进行分割,分割成多个数组。

// Split the IP into 4 octects

$octet = explode( ".", $target );

4、然后采用白名单机制来验证输入的信息是不是都是数字组成,然后把所有的数字通过“.”进行拼接,这样就保证了输入的信息只能是以“数字.数字.数字.数字”的形式限定了只能输入IP地址,避免了命令执行漏洞。

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];

(完)

---------------------------------------------------------------------------

关注安全 关注作者


高级cmd攻击命令_一步一步学习DVWA渗透测试(Command Injection命令行注入)-第七次课...相关推荐

  1. cmd php 不是内部命令_一步一步学习DVWA渗透测试(Command Injection命令行注入)-第七次课...

    各位小伙伴,今天我们继续学习Command Injection,翻译为中文就是命令行注入.是指通过提交恶意构造的参数破坏命令语句结构,从而达到执行恶意命令的目的.在OWASP TOP 10中一种存在注 ...

  2. 一步一步学习DVWA渗透测试(CSP Bypass绕过内容安全策略)-第十二次课

    小伙伴们,今天我们继续学习. Content-Security-Policy是指HTTP返回报文头中的标签,浏览器会根据标签中的内容,判断哪些资源可以加载或执行.翻译为中文就是绕过内容安全策略.是为了 ...

  3. uibot在子程序执行js失败_使用 Node.js 将珍藏的 bash 脚本封装成命令行工具

    阐述如何将一个常用的 bash 脚本融入 npm 生态之中,此处以最近遇到的一个 CR 提交脚本为例. 背景 作为程序猿,大家或多或少地都用过 GitHub 上的 merge request 功能.当 ...

  4. linux终端字体放大_微软Build:Windows 将附完整Linux内核,新命令行工具,开源六小时冲上GitHub第二...

    21CTO导读:微软于2016年成为Linux基金会的成员,同时宣布加入OSI,以增加其在宣传开源软件的使用.贡献和发布方面的作用,包括其客户和整个生态系统. 微软还是Linux基金会的"高 ...

  5. linux java转码_用Linux shell脚本批量转换java源文件编码(支持命令行选项)

    最近在用ant给java项目打jar包,但是程序运行出来之后,全部乱码,于是想到用Linux的iconv命令给java源文件转码,但是总不能一个一个地转吧,效率太低下了,于是便写了个Linux she ...

  6. node.js mysql防注入_避免Node.js中的命令行注入安全漏洞

    在这篇文章中,我们将学习正确使用Node.js调用系统命令的方法,以避免常见的命令行注入漏洞. 我们经常使用的调用命令的方法是最简单的child_process.exec.它有很一个简单的使用模式;通 ...

  7. linux mysql命令行导入_在linux中导入sql文件的方法分享(使用命令行转移mysql数据库)...

    因导出sql文件 在你原来的网站服务商处利用phpmyadmin导出数据库为sql文件,这个步骤大家都会,不赘述. 上传sql文件 前面说过了,我们没有在云主机上安装ftp,怎么上传呢? 打开ftp客 ...

  8. linux 渗透工具_适用于Linux的十大最佳渗透测试工具

    linux 渗透工具 This article covers some of the best penetration testing tools for Linux Cybersecurity is ...

  9. 【愚公系列】2023年05月 网络安全高级班 031.应急响应溯源分析(红队渗透测试军火库)

最新文章

  1. linux下定时清理磁盘日志步骤
  2. 【总结】DIV+CSS有可能遇到的问题
  3. Android协程学习
  4. 将Fri May 04 17:25:34 CST 2012形式的日期字符串转换成java.util.Date对象的方法
  5. 李宏毅的可解释模型——三个任务
  6. 【成长之路】【python】python基础2
  7. Struts2中的类型转换
  8. 微信小程序使用 wxparse 解析 iframe腾讯视频
  9. 关于极限精简版系统(RAMOS专用)的说明(FAQ)
  10. 【阅读笔记】《创京东:刘强东亲述创业之路》
  11. 浙江大学计算机学院复试拟录取名单,浙江大学计算机学院2015年考研复试拟录名单...
  12. 什么是顶尖的互联网产品经理?
  13. SpringMVC入门运行成功的实例(一)
  14. uploadify---jQuery多文件上传
  15. 普通家用电风扇电机绕组
  16. 天津大学大作业管理概论答案
  17. 使用Intel DCI/Inte System Debugger跟踪主机启动过程 中CSME/Bios信息
  18. react-dom.development.js:6202 Unable to preventDefault inside passive event listener invocation 错误
  19. DirectX (9) 纹理映射
  20. 无线网络中信噪比(SNR)计算

热门文章

  1. 米线店结账程序 装饰着模式_实验报告2_装饰者模式
  2. Eigen(1)配置VS2015
  3. mybatis 使用in 查询时报错_MyBatis(四):mybatis中使用in查询时的注意事项
  4. 15crmo焊接后多长时间探伤_承压设备渗透探伤检测方法简单操作思路
  5. vue 兄弟组件之间的传值
  6. 单点登陆的三种实现方式
  7. UTF-8和GBK有啥区别?
  8. jquery(js) 增加 删除 修改属性样式、元素内容
  9. async 和 await 之异步编程的学习
  10. 创建vue项目(三)路由跳转、反向代理、本地存储、状态管理