前言

Vulnerability: Command Injection

LOW级别

代码:

<?php
if( isset( $_POST[ 'Submit' ] ) ) {
// 几首一个变量为ip的参数
$target = $_REQUEST[ 'ip' ];
// 判断系统
if( stristr( php_uname( 's' ), 'Windows NT' ) ) {
// Windows
$cmd = shell_exec( 'ping ' . $target );
}
else {
// *nix
$cmd = shell_exec( 'ping -c 4 ' . $target );
}
echo "<pre>{$cmd}</pre>";
}
?>

我们分析这个靶场的代码可以看到$_REQUEST接受用户传过来的值 我们并没有看到有什么过滤机制的代码所以 可以输入任何东西。

测试执行ping127.0.0.1没问题 我们利用管道命令来 再加命令语句

Medium级别

代码:

<?php 

if( isset( $_POST[ 'Submit' ]  ) ) { 

    $target = $_REQUEST[ 'ip' ]; 

    // 黑名单过滤
$substitutions = array(
'&&' => '',
';' => '',
); // 如果有黑名单字符则进行替换
$target = str_replace( array_keys( $substitutions ), $substitutions, $target ); // 判断系统
if( stristr( php_uname( 's' ), 'Windows NT' ) ) {
// Windows
$cmd = shell_exec( 'ping ' . $target );
}
else {
// *nix
$cmd = shell_exec( 'ping -c 4 ' . $target );
}
echo "<pre>{$cmd}</pre>";
} ?>

我们注意6-9行 这里是个黑名单过滤 我们可以想办法绕过    这里虽然把&&和分号;加入了黑名单,但是我们还可以用逻辑或(||)、管道符(|)或(&)来命令执行  绕过

High级别

代码:

<?php 

if( isset( $_POST[ 'Submit' ]  ) ) {
// Get input
$target = trim($_REQUEST[ 'ip' ]); // 白名单
$substitutions = array(
'&' => '',
';' => '',
'| ' => '', //主义这一行 l后面是空格说明仅仅过滤了l+空格 没过滤单独的l
'-' => '',
'$' => '',
'(' => '',
')' => '',
'`' => '',
'||' => '',
); $target = str_replace( array_keys( $substitutions ), $substitutions, $target ); if( stristr( php_uname( 's' ), 'Windows NT' ) ) {
// Windows
$cmd = shell_exec( 'ping ' . $target );
}
else {
// *nix
$cmd = shell_exec( 'ping -c 4 ' . $target );
} echo "<pre>{$cmd}</pre>";
} ?>

127.0.0.1|net user照样绕过

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 ); //stripslashes()过滤删除由 addslashes() 函数添加的反斜杠。 // 以.分割命令
$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 ) ) {
// 以.拼接
$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(); ?>

最新文章

  1. [驱动开发] windbg符号表
  2. 远程连接Windows2008R2时服务器报Terminal Services错误的解决办法
  3. CentOS of MySQL command
  4. React 性能调优原理
  5. “0x5003eaed” 指令引用的“0x00000000”内存。该内存不能为“read”
  6. ios在项目中打开word文档、ppt等总结
  7. KoaHub平台基于Node.js开发的Koa的调试实用程序
  8. SQL存储过程和函数
  9. AT24C02使用详解
  10. php中向前台js中传送一个二维数组
  11. Maven项目pom文件设置JDK版本
  12. 逆向工程-获得IPsearch的注册码
  13. java随笔5 完整路径的应用
  14. 安装Python 库软件时提示&quot;setuptools must be installed to install from a source distribution&quot;错误
  15. topcoder srm 455 div1
  16. Win2008R2配置WebDeploy(转)
  17. USACO The Lazy Cow
  18. 3D打印产业链全景图
  19. 网络控制API 路由表 arp表 包括tcp的这些参数都是从哪里设置
  20. 访问修饰符public,private,protected和default的区别?

热门文章

  1. Anderson《空气动力学基础》5th读书笔记 第1记——流动相似性
  2. Windos--jar包注册成服务
  3. Linux入门到放弃之六《磁盘和文件系统管理二》
  4. python- pyqt5 一个存疑问题
  5. 活动可视化搭建系统——你的KPI被我承包了
  6. Luogu P5072 [Ynoi2015]盼君勿忘
  7. 震惊!你还不知道SpringBoot真正的启动引导类
  8. XJOI 7191 Genius ACM
  9. 从比心APP源码的成功,分析陪玩系统源码应该如何开发
  10. VUE自定义(有限)库存日历插件