目錄
- 邏輯層
- 1、邏輯問題
- 2、性能問題
- 白名單
- 方式一:IP白名單
- 方式二:靜態資源
- 方式三:url白名單
- 方式四: 爬蟲白名單
sqlmap在測試漏洞的時候,選擇了no,它就不會去測試其它的了,我們一般選擇yes,為了保證正確性。因為我們也不知道它是否就真的就是那個注入點、數據庫類型,或者就是那個注入類型
在攻防實戰中,往往需要掌握一些特性,比如服務器、數據庫、應用層、WAF層等,以便我們更靈活地去構造Payload,從而可以和各種WAF進行對抗,甚至繞過安全防御措施進行漏洞利用
邏輯層
1、邏輯問題
(1)云waf防護,一般我們會嘗試通過查找站點的真實IP,從而繞過CDN防護
(2)當提交GET、POST同時請求時,進入POST邏輯,而忽略了GET請求的有害參數輸入,可嘗試Bypass
(3)HTTP和HTTPS同時開放服務,沒有做HTTP到HTTPS的強制跳轉,導致HTTPs有WAF防護,HTTP沒有防護,直接訪問HTTP站點繞過防護
(4)特殊符號%00,部分waf遇到%00截斷,只能獲取到前面的參數,無法獲取到后面的有害參數輸入,從而導致Bypass。比如: id=1%00and 1=2 union select1,2,column_name from information_schema.columns
2、性能問題
猜想1:在設計WAF系統時,考慮自身性能問題,當數據量達到一定層級,不檢測這部分數據。只要不斷的填充數據,當數據達到一定數目之后,惡意代碼就不會被檢測了。
猜想2:不少WAF是C語言寫的,而c語言自身沒有緩沖區保護機制,因此如果WAF在處理測試向量時超出了其緩沖區長度就會引發bug,從而實現統過。
例子1:
?id=1 and (select 1)=(Select0xA1000)+UnIoN+SeLeCT+1,2,version(),4,5,database(),user(),
8,9
ps:0xA1000指0xA后面"A"重復1000次,一般來說對應用軟件構成緩沖區溢出都需要較大的測試長度,這里1000只做參考也許在有些情況下可能不需要這么長也能溢出。
例子2:
?a0=0&a1=1&…&a100=100&id=1 union select 1,schema_name,3 from INFORMATTON_SCHEMA.schemata
備注:獲取請求參數,只獲取前100個參數,第101個參數并沒有獲取到,導致SQL注入繞過。
白名單
方式一:IP白名單
從網絡層獲取的ip,這種一般偽造不來,如果是獲取客戶端的IP,這樣就可能存在偽造IP繞過的情況。
測試方法:修改http的header來bypass waf
x-forwarded-for
x-remote-IP
x-orginating-IP
x-remote-addr
X-Real-ip
IP白名單在實戰中意義不是很大,因為它的條件實在是很多,很難去滿足;一個是獲取IP是不是通過腳本去獲取,如果是的話,可以去偽造IP,通過tcp/udp網絡層方式獲取的,那是沒有辦法偽造的
方式二:靜態資源
特定的靜態資源后綴請求,常見的靜態文件(.js .jpg .swf .css等等),類似白名單機制,waf為了檢測效率,不去檢測這樣一些靜態文件名后綴的請求
http://10.9.9.201/sql.php?id=1
http://10.9.9.201/sql.php/1.js?id=1
備注:Aspx/php只識別到前面的.aspx/.php 后面基本不識別
有些WAF過濾是基于腳本過濾的參數,是針對腳本去過濾,針對某些其它格式就不會去過濾,比如圖片格式、文本格式,因為圖片格式、文本格式一般不會帶參數,或者說圖片格式、文本格式造成不了危害,只有腳本里面有代碼,文本和圖片的代碼是沒有什么作用的
http://10.9.9.201/sql.php/x.txt?id=1
我們這樣去訪問之后,網站并不會受到結果上的影響,數據還能夠正常接收;waf認為注入的參數是建立在x.txt文件上面的,所以waf有可能放心這個注入,x.txt是一個很正常的文本文件,即使傳參數,也不會造成很大的影響。但是網站這樣子訪問,參數并不是給了x.txt,而是給了.php
以前老版本的WAF可以通過這個方式直接繞過,但是現在不行了,但是我們還是要對這個東西進行了解
方式三:url白名單
正常文件涉及到敏感的操作,那我們在訪問正常文件的時候,就會被攔截了,這個時候為了讓正常的攔截去訪問的話,它會對這個文件進行白名單設置
為了防止誤攔,部分waf內置默認的白名單列表,如admin/manager/system等管理后臺。只要url中存在白名單的字符串,就作為白名單不進行檢測。常見的url構造姿勢:
http://10.9.9.201/sql.php/admin.php?id=1
http://10.9.9.201/sgl.php?a=/manager/&b=…/etc/passwd
http://10.9.9.201/…/…/…/manager/…/sql.asp?id=2
waf通過/manage/進行比較,只要uri中存在/manage/就作為白名單不進行檢測,這樣我們可以通過/sql.php?a=/manage/&b=…/etc/passwd 繞過防御規則。
可以結合靜態資源展開攻擊,有的waf是不行的,但是我們還是要去學一下
方式四: 爬蟲白名單
部分waf有提供爬蟲白名單的功能,識別爬蟲的技術一般有兩種:
1、根據UserAgent 2、通過行為來判斷
UserAgent可以很容易欺騙,我們可以偽裝成爬蟲嘗試繞過。
User Agent Switcher (Firefox 附加組件),下載地址:https://addons.mozilla.org/en-US/firefox/addon/user-agent-switcher/
這個方式不是講注入繞過,他是講掃描繞過,這個方式我們經常用到
我們在服務器上創建自己網站之后,那么百度、google、搜狗等搜索引擎會對我們的網站頁面進行收錄,在搜索相關資料的時候會請求到我們的網站上來。
爬蟲白名單就是偽造搜索引擎,當我們對網站部署waf之后,我們會發現我們對網站訪問速度過快、請求過多的話,會攔截
搜索引擎會對我們的網站進行爬取,因為它的收錄就是對我們的網站采取爬蟲技術,而且速度很快,也是符合攔截規則的,但是WAF卻不會去攔截,因為WAF會去識別你這個是用戶訪問,還是搜索引擎爬取,所以我們可以通過數據包的偽造,偽造成搜索引擎,對目標的網站進行訪問,這個時候waf肯定會放行,因為它覺得這個是搜索引擎的訪問,是正常的、官方的一種收錄行為,不會是用戶的攻擊行為
我們對網站的后臺進行目錄爆破,我們發現爆出了很多結果,但是我們去驗證的時候,發現這些東西壓根都不存在,全部是誤報
這里有兩類問題,一個是請求速度過快,觸發了規則;一個是掃描結果是個錯誤
偽造成官方搜索引擎的爬蟲,去對網站進行掃描,就不會觸發它的規則,因為它是白名單
dirsearch 爆破后臺目錄的數據包的UA可以使用搜索引擎爬蟲的UA
我們學習的是繞過WAF的方法,不是學習某個工具,方法最重要
/*!50001 select * from test */
這里的50001表示,假如數據庫是5.00.01以上版本,該語句才會被推行,反之就不行
50001會干擾WAF的識別,但是在數據庫當中會被正常執行,這種繞過方式只針對mysql
%20union%20a11%23%0a%20select%201,2,3%23
寫與不寫all都會執行,不會影響任何結果,但是all能夠繞過匹配規則里面的union select的一個結合, 因為中間有個all
總之來說,繞過WAF的匹配就是防止他們匹配到,我們要學FUZZ的話,就需要去學寫腳本
我們在實際的工作當中,不可能全部用到手工注入,肯定是要借助檢測工具
sqlmap自帶繞過WAF的腳本,但是這些腳本肯定是不能夠繞過常見WAF的,是用來繞過CTF比賽的,因為是比賽,所以WAF不會寫的很死,肯定是存在問題的,就可以用這些腳本來繞過。
因為用自帶的腳本繞不了,我們只能自己去編寫,可以在sqlmap腳本的基礎上去改,把注釋刪掉便于查看。
只要在if payload這個地方換就可以了,把符合WAF匹配規則的給替換掉,例如
if payload:payload = payload.replace("union","%23a%oaunion")payload = payload.replace("select","/*!44575select*/")payload = payload.replace("%20","%23a%0a")payload = payload.replace(" ",%23a%0a")payload = payload.replace( "database()","database%23a%0a()")
return payload
我們所有的步驟都做對了,但是我們就是被攔截了,這個時候我們可以通過代理,把完整的數據包抓到BP上面去看一下,看一下數據包里面是不是有問題
WAF可以通過數據包的指紋,發現我們使用了sqlmap這個工具在搞事情,所以被攔截了,不是因為我們的繞過腳本沒搞好,才被攔截的
當我們在使用工具進行檢測的時候,我們首先要解決一個問題,那就是工具會不會被攔截的問題。因為每個作者在寫工具的時候,都有一個初衷,他在對網站進行掃描,會有一個數據包體系,這個數據包肯定會有他的特征,比如特定的指紋頭,其實就是我們常說的指紋庫,通過這個指紋庫,我們可以識別出他使用的工具,不同的瀏覽器對網站進行訪問是不一樣的,因為他們的內核不同,所以他可以通過這些判斷出你是人為的,還是工具掃描的,從而進行攔截
sqlmap的訪問量會觸發WAF的CC流量攔截,這個時候,就跟我們的注入沒有關系了,我們可以采取延遲、代理池,爬蟲白名單三種方式繞過
搜索引擎爬蟲 http 指紋頭——》獲取搜索引擎爬蟲 http 指紋頭——》sqlmap user-agent注入——》更改sqlmap的請求頭,用來繞過WAF或者使用–user-agent=""來自定義
隨機是模擬用戶的訪問,我們可以通過–user-agent來模擬搜索引擎的訪問
sqlmap只要是一直在跑,那他就是正常的,只要一旦停下來,那就遇到問題了
我們可以通過刷新網站來判斷我們是否被封堵
delay延遲,按照我們延遲的時間,隔一段時間,發送一個數據包。正常訪問網站的時候,就會速度過快,導致被封堵,隔一秒發一個。
代理池涉及到的東西比較復雜,我們現在也講不到,代理池就是隨機刷IP,我們需要學完python的安全開發,然后再去寫一個;或者我們用網上現成的工具和腳本改一下,結合sqlmap去跑一下。
只要涉及到流量檢測,基本上就會用到代理池。
我們要去學開發,我們要去學Python,因為python簡單容易上手,工具大都是python開發的,我們可以直接拿別人的工具二次開發,也可以直接用Python寫二次開發,現在的安全形式,如果你不懂代碼那是不行的
中轉腳本,本地寫個腳本(請求遠程地址數據包可以自定義編寫),這個腳本去請求遠程注入地址,sqlmap去注入本地的腳本地址
<?php
$url='http://xxxx/job_bystjb/yjs_byszjs.asp?id=';
$payload=base64_encode($_GET['x']);
echo $payload;
$urs=$ur1.$payload;
file_get _contents($urls);
echo $urls;
?>
php發送http請求的幾種方法
https://blog.csdn.net/qq_34827048/article/details/78892700
繞過waf不是單純的,除了技術上的,還可能是因為檢測工具的原因;出了問題要去抓包看看,不要一直在代碼上面找問題;分析是很重要的,那些繞過的方法,網上去找資料,多試幾遍,用fuzz就完了。