手工sql注入&&繞過waf &&一個實例分析

來自專欄網安實驗室7 人贊了文章

原創: K 合天智匯

這篇文章,將教大家基本的手工sql注入和繞過waf的知識;分享一個實例,為了效果建議讀者自己去搭建環境,因為真實環境都不怎麼理想。

1. sql注入的基礎2. sql注入繞過waf3. sql注入一個繞過實例

手工sql注入的基礎基礎注入,盲注注入(時間和bool),報錯注入,聯合注入(union)

推薦sql-labs資源這個練習平臺,推薦《mysql注入天書pdf》1.base(基礎的語句注入)我們利用該表可以進行一次完整的注入。以下為一般的流程。1)猜資料庫

2)猜某庫的數據表

3)猜某表的所有列

4)獲取某列的內容

2.union注入union注入和基礎的注入相差不大,只需將前面的數據置0,即沒有那個指定欄位即可;當然先要確定欄位,下面的文章有分析3. 時間注入主要用到一些截斷字元對資料庫的字元進行判斷

1)先試資料庫的長度,當數字為6時發生了延時,說明資料庫名共五個字元。

2)開始猜資料庫的字(當發生延時,說明當前資料庫第一個字母為m):

3)其他的數據只需修改查詢語句即可

4. bool注入是根據回顯,對的查詢是一種回顯,錯的查詢又是一種回顯也是字元截斷函數來操作的if(length(database())>8,1,sleep)其他的不多說了

5. 報錯注入

是通過報錯函數來進行操作的cnblogs.com/wocalieshen 十種報錯注入作者常嘗試的是這三個報錯函數updatexml,exp,floor

sql注入繞過wafok,這是本篇的重點作者就不填寫那些網上普遍有的,給出幾個記得到並且常用的,但是有些簡單的還是要簡單試下1. 大小寫混寫2. 編碼試下 作者常用url編碼;拿到資料庫名和表名常用16進位替換他們的名字

3. 替換

and &&or ||相同函數的替換(這個先要過前面的引號閉合,字元過濾;前面的如果過不了,一般作者都考慮不到這,真要用到時才換)4. 注釋繞過1)內聯/*!50000*/,一般是被殺了的2)/*!50000union/*!50000/*!(select*/~1,2,3) (過安全狗寫法,親測可用,下面實際操作我們將這樣操作)3)句末注釋://, -- , /**/, #, --+,-- -, ;--a作者常用 -- -,屢試不爽(一般+是被過濾了的)實際運用

手工操作一波,我的測試過程:

單引號走起

這種情況gpc一般是打開了雙引號,同樣如此:

ok,其實我們首先應該確定是字元型參數還是數字型

當id=2

id=1+1

這裡+是被過濾了的,所以我們用-來做個運算

一切正常

ok,說明是數字型的參數,那麼就不用引號閉合,可以進行接下來的注入(這裡給大家補充一點小知識:cms審計時,這種id之類的都是inval函數處理的;其他的cms地方sql注入漏洞很有一些是因為數字型參數不需要引號閉合進行操作的)如果是字元型的怎麼辦,字元型的gpc情況確實不好辦,作者遇到的基本是編碼繞過:這裡的編碼是gbk的編碼,sprint函數這類的編碼漏洞繞過;編碼漏洞情況同樣適合xss漏洞,都是繞過waf。這裡,作者是先進行常規注入,id=2 order by 2

id=2 order by 1 正常

說明只能顯示一列數據了OK,我們進行union測試

發現了什麼,union不見了不急,我們有姿勢雙寫union(作者還真看到過只過濾一次關鍵詞的代碼)

嗯,看來是過濾那個單詞大小寫(雖然過時了,現在匹配函數都直接大小通殺,不妨礙隨手試下)

看到UNIon被ban了OK,不要著急,我們試下其他的方法用過狗方法,這裡就這樣過了(普通內聯試過無法)

但美中不足的是網站的資料庫系統配置出了問題,出現下面這個錯誤作者這樣嘗試

不指定庫也是查找當前庫;再嘗試用limit0,1限制,效果也是如此

Illegal mix of collations for operation UNION遇到了這個問題,是資料庫的編碼不一樣原因參考:cnblogs.com/google4y/p/ok,我們繼續,作者直接or來取資料庫

被ban了|| 代替orand呢(這比較有意思了,也是經常遇到了情況,waf特定情況才ban字元串,繞過本來就是經驗和猜)

我們看到,沒有語法錯誤,是正確的,那我們取下資料庫呢

按照mysql的語法,作者原先以為沒有錯(其實是錯的語法)

本地測試了下

錯誤,再多語句,分號試了下,是對的

想當然的給網址來了下分號(sqlmap中根據資料庫的不同也有多語句測試)

當然是錯誤的時間注入嘛,測試成功(突破口哦)

作者一開始這樣測試

嗯,忘記單引號被過濾用mysql的其他函數來解決

附上測試代碼(sql時間盲注的代碼除了sql的語句不同,其他的類似;bool盲注,就是修改返回判斷條件,if 「aaa」 in res.content:,bool就沒有去測試了,有興趣自己試一下吧)

報錯注入試下:

這麼多報錯函數,就沒有一一去測試總結本篇文章較基礎,但對於作者來說,較全面了手工注入知識就這些,更高級的就是各種姿勢了大體也是這個流程,這也是作者的所有乾貨了文章僅用於普及網路安全知識,提高小夥伴的安全意識的同時介紹常見漏洞的特徵等,若讀者因此做出危害網路安全的行為後果自負,與合天智匯以及原作者無關,特此聲明!
推薦閱讀:
查看原文 >>
相關文章