TSRC挑戰賽 WAF之SQL注入繞過挑戰實錄

2021-12-29 22:01:20 字數 2308 閱讀 9056

博文作者:lol [tsrc 白帽子]

第二作者:conqu3r、花開若相惜

來自團隊:[pax.mac team]  

應邀參加tsrc waf防禦繞過挑戰賽,由於之前曾經和team小夥伴一起參加過安全寶waf挑戰,而且自己平時接觸waf的機會也比較多,對於waf繞過的方法還是有一定積累的。  

比賽規則就是繞過四台被tencent waf保護的測試伺服器(分別為:apache get、apache post、nginx get、nginx post)。用一種方法繞過其中一台即可,如果可以執行任意sql語句即為通用繞過,視為高危,若有其他利用條件限制則視為中低危。  

比賽之前,首先要熟悉tencent waf的部署環境,是在網路層,還是在應用層,如果在應用層是在到達apache(或nginx)之前還是之後。不同的部署環境決定了不同的繞過方法。通過在tsrc上檢視《主流waf架構分析與探索》一文了解了tencent waf 實現於伺服器的安全模組內,這樣的話,類似於十進位制ip位址繞過網路層waf防護、gzip等一系列編碼繞過也就無從談起。  

首先想到通過畸形http包來繞過,嘗試lol /sql.php?id=1 and 1=1http/1.1等,發現基本都被伺服器過濾了,說明tencent waf 在開發時還是吸取了不少經驗的。經過不斷嘗試發現畸形資料報,引數汙染等方法均告失敗。只能把主要精力放在mysql一些語法特性上了,下面的幾種思路基本都是利用了mysql 自身語法特性來實現的。  

首先介紹一下pax.mac team猥瑣牛花開、若相惜的一種繞過思路——採用%a0繞過。id=-1 union%a0select 1,2。伺服器檢測了union和select之間是否含有空格,如果union select同時存在且還有空格則視為一次sql注入攻擊行為。但是有許多方法可以進行繞過例如union/**/select、union%0dselect等,這裡基本上都被過濾了,但是不知道是開發人員粗心還是故意放水,唯獨留下了union%a0select 這個沒有過濾。  

除了union%a0select似乎已經沒有其他可以繞過檢測的了,fuzz了一遍這次應該是真的了,但是功夫不負有心人,一種神奇的方法出現了——union/*%aa*/select。咦?這個不是屬於/*****/應該是被防護了的怎麼還可以呢?這是中文字元的特性利用,中文字元配合注釋符bypass 所有規則。利用%e4等只要是中文字元開頭的,就可以完成繞過檢測!%a0之類的,已經補了。測試發現。union select可以共存,只要讓檢測不要認識是union 空格select就行。所以這裡這樣構造出乙個特別的字串。我們通過union+「特殊字元」+select拼出乙個新字串,讓正則認為這是個類似unionxxooselect這種,而不是union select 。 這樣就能bypass檢測。但是,要讓資料庫識別這個,就要想辦法乾掉這個多餘的字元。服務在檢測的時候,並不把/**/作為攻擊特徵,當然,這本身也不是特徵,但是如果我們利用這個符號把這個多餘的字元乾掉,就可以讓語句正常執行了。因為,這裡就是利用union/*中文字元*/select,完全bypass。當然,還要保證這種中文字元不能構造乙個漢字。這種方法來自於pax.macteam團隊的conqu3r。  

以上兩種方法均可以繞過union select,以及select from進行隨心所欲的注入,後面介紹的這幾種就比較雞肋了,僅僅能繞過mysql函式限制進行loadfile,或者獲取一些環境資訊。  

由於waf對敏感函式進行了檢測,導致我們的version(),load_file()等函式無法使用,但是由於是正則匹配,我們可以使用% 0b進行輕鬆繞過。例如:version()% 0b(%和0b之間的空格是編輯顯示需要,實際並不存在),其他的特殊字元均被過濾了,% 0b在這裡成為了漏網之魚。  

同樣的繞過函式的思路,我們可以使用`version`()的方法再次避免waf的正則匹配,由於mysql 語法特性`函式名`()等價於函式名()再一次完美bypass。繞過了函式名我們如何select呢?這裡我們需要用到十六進製制盲注:

id=1 and(select `load_file`(0x2f6574632f706173737764) is not null) 

首先判斷伺服器某檔案是否存在,例如這裡我們用/etc/passwd檔案。0x2f6574632f706173737764是/etc/passwd的十六進製制格式。在判斷確實存在該檔案之後,我們可以通過:

id=1 and(select `load_file`(0x2f6574632f706173737764)>0x726f66)

根據頁面返回修改大於號之後的十六進製制值,從而獲取到該檔案的十六進製制內容。  

最後一種思路是獲取伺服器的配置資訊,通過id=instr(@@global.version,1)來獲取global變數。@@global包含很多敏感資訊,過濾了ascii,substr函式,仍可用instr來盲注。  

hihocoder挑戰賽20小記

2016.11.4 晚上六點點開了一場看上去通過人數比較多的hihoround 20 virtual participate了一下。感覺這場還是比較友好的,和我以前做的hihoround只能做一題,或者爆零不一樣。在兩個小時裡寫了3個題 a,b,c d看上去像是個經典問題,但從來沒寫過 幾何基本等於...

hihoCoder挑戰賽31 題解

時間限制 8000ms 單點時限 1000ms 記憶體限制 256mb 描述 給定n個整數常數c 1 c 2 c n 和乙個整數k。現在需要給2k個整數變數x 1 x 2 x k y 1 y 2 y k 賦值,滿足 1 對於所有1 i k,都有x i y i 2 對於所有1 i n,都存在至少乙個j...

Wannafly挑戰賽A 概率DP

給你乙個長 n 的序列,m 次查詢 每次查詢給乙個 x,然後 從序列的最左端 1 開始,每次隨機的選擇乙個右端點 r,如果兩個端點間的區間和不超過 x 就進行一次分割,然後把左端點變成 r 1,否則一直隨機下去。問這樣分割出來的期望段數 第一行兩個數 n,m 之後一行 n 個數表示這個序列 之後m行...