专栏首页信安之路Bypass ngx_lua_waf SQL 注入防御(多姿势)

Bypass ngx_lua_waf SQL 注入防御(多姿势)

本文作者:Bypass

ngx_lua_waf 是一款基于 ngx_lua 的 web 应用防火墙,使用简单,高性能、轻量级。默认防御规则在 wafconf 目录中,摘录几条核心的 SQL 注入防御规则:

`select.+(from|limit)

(?:(union(.*?)select))

(?:from\W+information_schema\W)`

这边主要分享三种另类思路,Bypass ngx_lua_waf SQL 注入防御。

环境搭建

github 源码:

https://github.com/loveshell/ngx_lua_waf/

ngx_lua_waf 安装部署,设置反向代理访问构造的 SQL 注入点

WAF 测试

ngx_lua_waf 是基于 ngx_lua 的,我们先通过一个测试用例来了解它是如何获取参数的。

首先看一下官方 API 文档,获取一个 uri 有两个方法:ngx.req.get_uri_argsngx.req.get_post_args,二者主要的区别是参数来源有区别,ngx.req.get_uri_args 获取 uri 请求参数,ngx.req.get_post_args 获取来自 post 请求内容。

测试用例:

 `server {   listen    80;   server_name  localhost;   location /test {       content_by_lua_block {           local arg = ngx.req.get_uri_args()           for k,v in pairs(arg) do               ngx.say("[GET ] key:", k, " v:", v)           end           ngx.req.read_body()           local arg = ngx.req.get_post_args()           for k,v in pairs(arg) do               ngx.say("[POST] key:", k, " v:", v)           end       }   }}`

输出测试:

通过这个测试,我们可以发现:

1、当提交同一参数 id,根据接收参数的顺序进行排序

2、当参数 id,进行大小写变换,如变形为 Id、iD、ID,则会被当做不同的参数,大小写敏感。

我们知道,window下 IIS+ASP/ASPX 大小写是不敏感的,

提交参数为:

?id=1&Id=2&iD=3&ID=4,

输出结果为:

1, 2, 3, 4

那么,当 nginx 反向代理到 IIS 服务器的时候,这就存在一个参数获取的差异,结合 HPP 进行利用,可被用来进行 Bypass ngx_lua构建的 SQL注入防御。

绕过姿势一:参数大小写 + HPP

http://192.168.8.147/test/sql.aspx

?id=1 UNION/&ID=/SELECT null,name,null/&Id=/FROM master.dbo.sysdatabases

绕过姿势二:GPC

在 ASPX 中,有一个比较特殊的 HPP 特性,当 GET/POST/COOKIE 同时提交的参数 id,服务端接收参数 id 的顺序 GET,POST,COOKIE,中间通过逗号链接,于是就有了这个 idea。

UNION、SELECT、FROM 三个关键字分别放在 GET/POST/COOKIE 的位置,通过 ASPX 的这个特性连起来,堪称完美的一个姿势,压根不好防。

但姿势利用太过于局限: 使用 Request.Params["id"] 来获取参数,GPC 获取到参数拼接起来,仅仅作为 Bypass 分享一种思路而已。

绕过姿势三:uri 参数溢出

前面两种都是 MSSQL 的 Bypass,而且利用姿势还有一定的极限,有没有那么一种可以 Bypass Mysql,又可以 Bypass MSSQL,完全无视 SQL 注入防御,为所欲为的姿势呢?这就是接下来的终极大招了。

默认情况下,通过 ngx.req.get_uri_argsngx.req.get_post_args 获取 uri 参数,只能获取前 100 个参数,当提交第 101 个参数时,uri 参数溢出,无法正确获取第 100 以后的参数值,基于 ngx_lua 开发的安全防护,无法对攻击者提交的第 100 个以后的参数进行有效安全检测,从而绕过安全防御。具体分析详见我写的另一篇文章:《打破基于 OpenResty 的 WEB 安全防护(CVE-2018-9230)》

Mysql Bypass 实例:

Mssql Bypass 实例:

END

这三种姿势主要利用 HPP,结合参数获取的特性和差异,从而绕过 ngx_lua_waf 的 SQL 注入防御。

不同语言、中间件、数据库,所对应的特性是有差异的,而这些差异在某些特定的场景下,是可以利用的。

关于我:一个网络安全爱好者,对技术有着偏执狂一样的追求,致力于分享原创高质量干货,我的个人微信公众号:Bypass--,欢迎前来探讨、交流。

本文分享自微信公众号 - 信安之路(xazlsec),作者:Bypass

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2018-05-06

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • PC微信逆向:发送与接收消息的分析与代码实现

    与接收消息函数最直接相关的东西肯定是消息本身,所以消息本身的内容就是我们的切入点。我们可以首先找到存放消息内容的地址,然后对地址下断,通过栈回溯最终定位到接收消...

    信安之路
  • 对oracle数据库的安全测试

    Oracle Database,又名Oracle RDBMS,或简称Oracle。是甲骨文公司的一款关系数据库管理系统。它是在数据库领域一直处于领先地位的产品。...

    信安之路
  • RFID 低频卡安全分析

    低频非接触卡主要用于门禁丶考勤等等在日常生活中使用非常的广泛,但他也具有比较大的安全隐患,他没有一些密钥安全认证这类安全机制,所有我们只要对低频卡有所研究就可以...

    信安之路
  • Bypass ngx_lua_waf SQL注入防御(多姿势)

    ngx_lua_waf是一款基于ngx_lua的web应用防火墙,使用简单,高性能、轻量级。默认防御规则在wafconf目录中,摘录几条核心的SQL注入防御规...

    Bypass
  • ES6学习笔记

    本文作者:IMWeb coolriver 原文出处:IMWeb社区 未经同意,禁止转载 本文为初步阅读ECMAScript6入门后的一些记录与感想。 ...

    IMWeb前端团队
  • 一日一技:在 Python 中实现延迟调用

    熟悉 Golang 的同学都知道,Golang 里面有一个关键词叫做defer,它可以实现延迟调用。

    青南
  • 纵览全局垂直打击的组织模式(下)

    本文详细记录了如何在Hexo博客中实现用图组织内容的方法,但是,请注意:以下内容并非操作教程,仅表明相信思路以供参考,或许您可以实现出更好的版本,但仅依照下文内...

    ZONGLYN
  • Openresty最佳案例 | 第4篇:OpenResty常见的api

    获取请求参数 vim /usr/example/example.conf location /lua_var { default_type ...

    方志朋
  • 知识点:对象内存分配与回收

    1、大多数情况下,对象在新生代Eden区中分配。当Eden区没有足够空间进行分配时,虚拟机将发起一次Minor GC。虚拟机提供-XX:+PrintGCDeta...

    架构技术专栏
  • Linux进程调度策略的发展和演变--Linux进程的管理与调度(十六)

    调度器面对的情形就是这样, 其任务是在程序之间共享CPU时间, 创造并行执行的错觉, 该任务分为两个不同的部分, 其中一个涉及调度策略, 另外一个涉及上下文切换...

    233333

扫码关注云+社区

领取腾讯云代金券