Kate Li (Taiwan)的部落格

首頁

分享你的科技,為安全加點溫度.

作者 iacona 時間 2020-03-16
all

簡介

最近在逛碼雲時候發現permeat靶場系統,感覺介面和業務場景設計的還不錯.看到freebuf還沒有相關文章介紹,所以過來分享一下.

同時也是分享一下我平時挖掘漏洞的一些思路吧,這篇文章裏雖然只簡單介紹其中三種漏洞類型,但也是想是一個拋轉引玉吧,給web安全新手提供一些挖掘思路.

下載地址:

GitHub地址: https://github.com/78778443/permeate 国内地址: https://gitee.com/songboy/permeate

這篇文章裏主要介紹其中的,SQL注入挖掘,xss跨站挖掘,以及csrf漏洞把

在挖掘一網站的漏洞時候,我們腦海裏要知道什麼漏洞在什麼場景下容易出現,那些漏洞出現的比較頻繁,我腦海裏的web安全性漏洞有三種類型吧:

筆者之前給別人做程式碼稽核有一個習慣,通常希望給的源碼能够正常運行,還不是光從程式碼來分析問題.為什麼這麼做呢,因為覺得如果程式碼不能運行其實很多漏洞是無法光從程式碼層面發現問題的.而程式碼能運行起來,其實不僅能驗證問題,也可以從系統的業務功能來找出更多問題.

比如說很多網站提供站內搜索功能,在蒐索的時候通常會把用戶蒐索的關鍵字返回在頁面當中,比如“你搜搜的關鍵字'關鍵字'結果如下”,那在這裡就很有可能存在反射型XSS漏洞.

另外很多網站都存在用戶體系,而在修改個人資料的時候很有可能存在越權問題,比如修改的個人資料的時候查看是否又提交uid參數,如果有,修改uid值,看是不是把別人的資料給修改了,這些其實都需要運行之後才能發現問題所在.

筆者在windows系統中石油wampser搭建還比較簡單,這裡先簡單介紹安裝方法:

通過上面的安裝步驟之後,應該可以看到如下麵的介面了.有一個默認板塊和一個默認分區,就說明連接資料庫成功了.

現在我們開始去挖掘裡面的漏洞,在項目介紹中看到有SQL注入和XSS以及CSRF問題,但是沒有告知存在漏洞的位置,所以我們需要先分析每個漏洞的對應場景.

先來說說SQL注入挖掘吧.

一. SQL注入挖掘

懂點SQL注入知識應該都可以想到sql注入是因為攻擊者可以控制sql語句中的參數所造成的,那麼我們就先找一個需要傳參的地址,在剛才的首頁中可以看到有一個默認板塊,那麼就點擊默認板塊好了,點擊之後上面的URL地址變成了

http://permeate.localhost/home/index.php?m=tiezi&a=index&bk=5

在URL中可以看到,有三個參數,但根據經驗來說,前面兩個參數m和a有點像是路由,所以這兩個先暫時用排除法排除,最後一個參數bk是一個數位,感覺應該是板塊的ID,所以可以重點關注一下,我們先記住未測試之前的頁面是什麼樣子

現在先用手動測試快速測試一下,怎麼測試呢?可以在bk=5後面加一個單引號,或者加一個%27,得到URL地址如下

http://permeate.localhost/home/index.php?m=tiezi&a=index&bk=5'

這個時候看一下頁面的運行效果如何,發現帖子列表中帖子已經不存在了.

這個時候我們可以初步的得出結論,這個地方可能存在SQL注入問題,但是還不能肯定,要肯定這個地方是否存在注入問題,我們這樣深入去驗證一下,可以使用參數值5' or '1'='1來進行驗證,得到URL地址如下

http://permeate.localhost/home/index.php?m=tiezi&a=index&bk=5' or '1'='1 sqlmap -u "http://permeate.localhost/home/index.php?m=tiezi&a=index&bk=5"  --dbs

通過sqlmap的迴響結果可以看出,這個地方確實存在了注入問題.

下麵我們接著找一下XSS漏洞漏洞

二. XSS跨站

造成xss的主要成因我們知道是參數會被在頁面輸出,所以在找XSS漏洞的時候,我們先看看網站有什麼功能;

在首頁的圖片和帖子列表頁中可以大致看出有搜索功能,和發帖,回復帖子等功能,這些地方都會把接收的參數作為內容展示出來,所以我們可以挨個去測試.

先來一個最簡單的蒐索頁吧,在巡覽列有一個蒐索框,我首先在蒐索框中輸入test吧,得到URL地址如下

http://permeate.localhost/home/search.php?keywords=test

從URL地址可以看出蒐索的關鍵字會通過keywords來傳遞,傳遞之後也會顯示在頁面內容當中,如下圖

現在分析顯示html元素,在關鍵字test的父級節點,可以看到是div,div中寫入script標籤是會被執行的,所以可以直接使用下麵的payload

http://permeate.localhost/home/search.php?keywords=test<script>alert(123)</script>

進行測試,通過瀏覽器訪問此連接,可以看到已經彈出123確認框

不過xss不僅限於script標籤可以被執行,也可以用img標籤的onerror内容來執行,可以構造如下的payload

http://permeate.localhost/home/search.php?keywords=test<img src=x onerror=alert(456)>

依然訪問URL地址,可以看到456的確認框被彈出來了

上面的XSS都屬於反射型的,存儲型的項目也表明存在,這裡我們先略過吧,先看看CSRF的漏洞好了.

三. CSRF

CSRF漏洞主要成因是因為服務端接收表單請求時候沒有驗證是用戶發送的請求還是瀏覽器發送的請求,所以在挖掘此類表單的時候先去找表單的位置,在前面的截圖當中,可以看到有一個發帖的按鈕,可以進去點進去看看,點擊發帖,URL地址為

http://permeate.localhost/home/fatie.php?bk=5

在這個頁面中可以看到有一個發帖的表單,我們主要看一下表單有沒有token權杖,如果沒有的話,那就可能存在CSRF的漏洞問題,通過瀏覽器的審查元素截圖如下

在頁面中確實沒有存在token資訊,囙此我們可以初步得出結論,這個地方存在CSRF的可能,現在需要驗證一下,

在驗證的時候我們需要製定CSRF有GET型和POST型,get型利用起來相對簡單很多,而在這個地方表單提交雖然是通過POST,但並不排除GET提交也可以利用,所以我們先嘗試用GET型來提交數據,先通過抓包瀏覽器的網絡分析模塊來看,發帖會發送哪一些數據,如下圖

在圖中可以看到,post會傳遞三個參數過去,bk和title以及content三個參數,我們先用get表單構造出一個payload出來,得到URL地址如下:

http://permeate.localhost/home/_fatie.php?bk=5&zt=0&title=111&content=222

然後去瀏覽器打開這個地址,看看是否能提交表單成功,訪問後發現彈出了一個確認框,告訴我已經發帖成功了,如下圖

去清單確認一下,發現確實已經發帖成功,如下圖帖子列表

這個CSRF相對來說比較低級,很多情况下用get並不能提到post提交,囙此我們再來嘗試用post方法構造一個payload出來,代碼如下

<html> <head>test</head> <body>     <form action="http://permeate.localhost/home/_fatie.php?bk=5&zt=0" id="test" method="POST">         <input type="hidden" value="11111" name="title"><br>         <input type="hidden" value="22222" name="content">     </form> </body> <script>     var f=document.getElementById("test");     f.getElementsByTagName("input")[0].value="title";     f.getElementsByTagName("input")[1].value="content";     f.submit(); </script> </html>

在上面程式碼中可以看出,表單裡面的值已經事先做好了定義,當受害者打開之後,變回自動提交表單.

前面提到了這個系統中存在存儲型XSS,又存在CSRF漏洞,那麼我們是不是可以用來做一個XSS蠕蟲試驗呢?

四.蠕蟲XSS

滿足蠕蟲XSS需要兩個必要條件,存儲型XSS,和CSRF漏洞,這兩個這個系統都有,所以實現起來沒有問題,需要的是先找一下存儲型XSS

在前面發帖的位置會把參數存儲起來,並展示,囙此這個地方是一個比較好的試驗點,我們在發帖位置先來試驗一下吧.如下圖,表單中提交了xss驗證程式碼,當成功觸發的時候會被彈框123,如下圖

點擊發佈帖子按鈕,發佈帖子成功,下來來到帖子列表頁面,發現alert(123)已經被觸發成功了,如下圖

現在CSRF有了,存儲型XSS也有了,那麼接下來就是需要把它們結合起來使用了,但蠕蟲XSS利用程式碼相對alert(123)來說程式碼會比較長,所以我們需要先把利用程式碼放到一個檔案當中,然後再通過script引入進去,我們構造的代碼如下

var strrand = +new Date(); var str = 'http://premeate.localhost/home/_fatie.php?bk=5&zt=0&title=1111<script src%3D/a.js%3F'+strrand+'></script>&content=222'; var tag = document.createElement('img'); tag.src = str; document.body.append(tag.src);