這篇文章,將教大家基本的手工sql注入和繞過waf的知識;分享一個實例,為了效果建議讀者自己去搭建環境,因為真實環境都不怎麼理想。
1. sql注入的基礎
2. sql注入繞過waf
3. 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. 報錯注入
是通過報錯函數來進行操作的
https://www.cnblogs.com/wocalieshenmegui/p/5917967.html 十種報錯注入
作者常嘗試的是這三個報錯函數updatexml,exp,floor
sql注入繞過waf
ok,這是本篇的重點
作者就不填寫那些網上普遍有的,給出幾個記得到並且常用的,但是有些簡單的還是要簡單試下
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'
遇到了這個問題,是數據庫的編碼不一樣
原因參考:
https://www.cnblogs.com/google4y/p/3687901.html
ok,我們繼續,作者直接or來取數據庫
被ban了
|| 代替or
and呢(這比較有意思了,也是經常遇到了情況,waf特定情況才ban字符串,繞過本來就是經驗和猜)
我們看到,沒有語法錯誤,是正確的,那我們取下數據庫呢
按照mysql的語法,作者原先以為沒有錯(其實是錯的語法)
本地測試了下
錯誤,再多語句,分號試了下,是對的
想當然的給網址來了下分號(sqlmap中根據數據庫的不同也有多語句測試)
當然是錯誤的
時間注入嘛,測試成功(突破口哦)
作者一開始這樣測試
嗯,忘記單引號被過濾
用mysql的其他函數來解決
附上測試代碼(sql時間盲注的代碼除了sql的語句不同,其他的類似;bool盲注,就是修改返回判斷條件,if “aaa” in res.content:,bool就沒有去測試了,有興趣自己試一下吧)
報錯注入試下:
這麼多報錯函數,就沒有一一去測試
總結
本篇文章較基礎,但對於作者來說,較全面了
手工注入知識就這些,更高級的就是各種姿勢了
大體也是這個流程,這也是作者的所有乾貨了
文章僅用於普及網絡安全知識,提高小夥伴的安全意識的同時介紹常見漏洞的特徵等,若讀者因此做出危害網絡安全的行為後果自負,與合天智匯以及原作者無關,特此聲明!
閱讀更多 合天網安實驗室 的文章