1. 程式人生 > >23. Bypass ngx_lua_waf SQL註入防禦(多姿勢)

23. Bypass ngx_lua_waf SQL註入防禦(多姿勢)

test 如何 onf nbsp 實例 TE 特殊 img 摘錄

0x00 前言

ngx_lua_waf是一款基於ngx_lua的web應用防火墻,使用簡單,高性能、輕量級。默認防禦規則在wafconf目錄中,摘錄幾條核心的SQL註入防禦規則:

select.+(from|limit)
(?:(union(.*?)select))
(?:from\W+information_schema\W)

這邊主要分享三種另類思路,Bypass ngx_lua_waf SQL註入防禦。

0x01 環境搭建

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

ngx_lua_waf安裝部署,設置反向代理訪問構造的SQL註入點

0x02 WAF測試

ngx_lua_waf是基於ngx_lua的,我們先通過一個測試用例來了解它是如何獲取參數的。

首先看一下官方 API 文檔,獲取一個 uri 有兩個方法:ngx.req.get_uri_args、ngx.req.get_post_args,二者主要的區別是參數來源有區別,ngx.req.get_uri_args獲取 uri 請求參數,ngx.req.get_post_args獲取來自 post 請求內容。

測試用例:

技術分享圖片

輸出測試:

技術分享圖片

通過這個測試,我們可以發現:

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_args、ngx.req.get_post_args獲取uri參數,只能獲取前100個參數,當提交第101個參數時,uri參數溢出,無法正確獲取第100以後的參數值,基於ngx_lua開發的安全防護,無法對攻擊者提交的第100個以後的參數進行有效安全檢測,從而繞過安全防禦。具體分析詳見我寫的另一篇文章:《打破基於OpenResty的WEB安全防護(CVE-2018-9230)》

Mysql Bypass實例:

技術分享圖片

Mssql Bypass實例:

技術分享圖片

0x03 END

這三種姿勢主要利用HPP,結合參數獲取的特性和差異,從而繞過ngx_lua_waf的SQL註入防禦。

不同語言、中間件、數據庫,所對應的特性是有差異的,而這些差異在某些特定的場景下,是可以利用的。

23. Bypass ngx_lua_waf SQL註入防禦(多姿勢)