Nginx Lua WAF 通用绕过方法

  • Nginx Lua WAF 通用绕过方法已关闭评论
  • A+
所属分类:网络安全文章

Nginx Lua WAF 通用绕过方法

1.前言

Nginx Lua获取参数时,默认获取前100个参数值,其余的将被丢弃。

所以,用了Nginx Lua的WAF默认都会被Bypass。

2. 原理

Note that a maximum of 100 request arguments are parsed by default (including those with the same name) and that additional request arguments are silently discarded to guard against potential denial of service attacks.
默认情况下最多可解析100个请求参数(包括具有相同名称的请求参数),并且会自动丢弃其他请求参数以防止潜在的拒绝服务攻击。

搜索100 ,大致有下面的方法存在同样的问题。

ngx.req.get_uri_args 获取get的请求参数
ngx.req.get_post_args 获取post的请求参数
ngx.req.get_headers 获取request头
ngx.decode_args 对参数进行URL解码
ngx.resp.get_headers 获取response头
在lua-nginx-module源码里,我们可以看到源代码设置了默认的最多请求参数和头都为100

  1. #ifndef NGX_HTTP_LUA_MAX_ARGS
  2. #define NGX_HTTP_LUA_MAX_ARGS 100
  3. #endif
  4. #ifndef NGX_HTTP_LUA_MAX_HEADERS
  5. #define NGX_HTTP_LUA_MAX_HEADERS 100
  6. #endif

不过官方提供了方法,可修改该默认值,比如ngx.req.get_uri_args(200)就能获取前200个请求参数。

3. 测试

  1. location = /test {
  2.     content_by_lua_block {
  3.         local args = ngx.req.get_uri_args()
  4.         for key, val in pairs(args) do
  5.             if type(val) == "table" then
  6.                 ngx.say(key, ": ", table.concat(val, ", "))
  7.             else
  8.                 ngx.say(key, ": ", val)
  9.                 if val ==  'joychou' then
  10.                     ngx.say("I got u,joychou")
  11.                     return
  12.                 end
  13.             end
  14.         end
  15.     }
  16. }

当请求参数为101个时,此时获取不到最后一个请求参数。

  1. curl -v 'http://test.cesafe.com/test?a1=1&a2=2&a3=3&a4=4&a5=5&a6=6&a7=7&a8=8&a9=9&a10=10&a11=11&a12=12&a13=13&a14=14&a15=15&a16=16&a17=17&a18=18&a19=19&a20=20&a21=21&a22=22&a23=23&a24=24&a25=25&a26=26&a27=27&a28=28&a29=29&a30=30&a31=31&a32=32&a33=33&a34=34&a35=35&a36=36&a37=37&a38=38&a39=39&a40=40&a41=41&a42=42&a43=43&a44=44&a45=45&a46=46&a47=47&a48=48&a49=49&a50=50&a51=51&a52=52&a53=53&a54=54&a55=55&a56=56&a57=57&a58=58&a59=59&a60=60&a61=61&a62=62&a63=63&a64=64&a65=65&a66=66&a67=67&a68=68&a69=69&a70=70&a71=71&a72=72&a73=73&a74=74&a75=75&a76=76&a77=77&a78=78&a79=79&a80=80&a81=81&a82=82&a83=83&a84=84&a85=85&a86=86&a87=87&a88=88&a89=89&a90=90&a91=91&a92=92&a93=93&a94=94&a95=95&a96=96&a97=97&a98=98&a99=99&a100=100&a=joychou'

减少一个请求参数,当请求参数刚好为100个时,能获取到最后一个请求参数。

  1. a77: 77
  2. a9: 9
  3. a43: 43
  4. a24: 24
  5. a52: 52
  6. a61: 61
  7. a35: 35
  8. a70: 70
  9. a78: 78
  10. a42: 42
  11. a53: 53
  12. a49: 49
  13. a87: 87
  14. a60: 60
  15. a58: 58
  16. a96: 96
  17. a14: 14
  18. a27: 27
  19. a15: 15
  20. a85: 85
  21. a36: 36
  22. a26: 26
  23. a41: 41
  24. a94: 94
  25. a37: 37
  26. a50: 50
  27. a63: 63
  28. a48: 48
  29. a72: 72
  30. a12: 12
  31. a29: 29
  32. a59: 59
  33. a38: 38
  34. a62: 62
  35. a: joychou
  36. I got u, joychou
CE安全网