簡介
最近在逛碼云時候發現permeat靶場系統,感覺界面和業務場景設計的還不錯.所以過來分享一下.
同時也是分享一下我平時挖掘漏洞的一些思路吧,這篇文章里雖然只簡單介紹其中三種漏洞類型,但也是想是一個拋轉引玉吧,給web安全新手提供一些挖掘思路.
下載地址:
代碼語言:JavaScript代碼運行次數:0運行復制
gitHub地址: https://github.com/78778443/permeate國內地址: https://gitee.com/songboy/permeate
這篇文章里主要介紹其中的,sql注入挖掘,xss跨站挖掘,以及csrf漏洞把
在挖掘一網站的漏洞時候,我們腦海里要知道什么漏洞在什么場景下容易出現,那些漏洞出現的比較頻繁,我腦海里的web安全漏洞有三種類型吧:
編碼型漏洞業務邏輯漏洞運行環境漏洞
筆者之前給別人做代碼審計有一個習慣,通常希望給的源碼能夠正常運行,還不是光從代碼來分析問題.為什么這么做呢,因為覺得如果代碼不能運行其實很多漏洞是無法光從代碼層面發現問題的.而代碼能運行起來,其實不僅能驗證問題,也可以從系統的業務功能來找出更多問題.
比如說很多網站提供站內搜索功能,在搜索的時候通常會把用戶搜索的關鍵詞返回在頁面當中,比如”你搜搜的關鍵詞’關鍵詞’結果如下”,那在這里就很有可能存在反射型xss漏洞.
另外很多網站都存在用戶體系,而在修改個人資料的時候很有可能存在越權問題,比如修改的個人資料的時候查看是否又提交uid參數,如果有,修改uid值,看是不是把別人的資料給修改了,這些其實都需要運行之后才能發現問題所在.
筆者在windows系統中是由wampser搭建還比較簡單,這里先簡單介紹安裝方法:
用git把代碼拉下來配置單獨的虛擬主機目錄(不要放到二級目錄,貌似有問題)新建了一個數據庫導入sql文件,文件位置 /doc/bbs_cate.sql修改一下/config/dbconfig.php文件中的數據庫賬號密碼信息
通過上面的安裝步驟之后,應該可以看到如下面的界面了.有一個默認板塊和一個默認分區,就說明連接數據庫成功了.

現在我們開始去挖掘里面的漏洞,在項目介紹中看到有SQL注入和XSS以及csrf問題,但是沒有告知存在漏洞的位置,所以我們需要先分析每個漏洞的對應場景.
先來說說SQL注入挖掘吧.
一. SQL注入挖掘
懂點SQL注入知識應該都可以想到sql注入是因為攻擊者可以控制sql語句中的參數所造成的,那么我們就先找一個需要傳參的地址,在剛才的首頁中可以看到有一個默認板塊,那么就點擊默認板塊好了,點擊之后上面的URL地址變成了
代碼語言:javascript代碼運行次數:0運行復制
http://permeate.localhost/home/index.php?m=tiezi&a=index&bk=5
在URL中可以看到,有三個參數,但根據經驗來說,前面兩個參數m和a有點像是路由,所以這兩個先暫時用排除法排除,最后一個參數bk是一個數字,感覺應該是板塊的ID,所以可以重點關注一下,我們先記住未測試之前的頁面是什么樣子

現在先用手動測試快速測試一下,怎么測試呢? 可以在bk=5后面加一個單引號,或者加一個%27,得到URL地址如下
代碼語言:javascript代碼運行次數:0運行復制
http://permeate.localhost/home/index.php?m=tiezi&a=index&bk=5'
這個時候看一下頁面的運行效果如何,發現帖子列表中帖子已經不存在了.

這個時候我們可以初步的得出結論,這個地方可能存在SQL注入問題,但是還不能肯定,要肯定這個地方是否存在注入問題,我們這樣深入去驗證一下,可以使用參數值 5′ or ‘1’=’1 來進行驗證,得到URL地址如下
代碼語言:javascript代碼運行次數:0運行復制
http://permeate.localhost/home/index.php?m=tiezi&a=index&bk=5' or '1'='1
訪問之后,發現頁面又發生了一次變化,這個時候我們就可以肯定這個地方存在了SQL注入問題,如下圖

我們可以使用sqlmap來看看數據庫存在哪些數據庫信息,sqlmap命令如下:
代碼語言:javascript代碼運行次數:0運行復制
sqlmap -u "http://permeate.localhost/home/index.php?m=tiezi&a=index&bk=5" --dbs

通過sqlmap的反饋結果可以看出,這個地方確實存在了注入問題.
下面我們接著找一下XSS漏洞漏洞
二. XSS跨站
造成xss的主要成因我們知道是參數會被在頁面輸出,所以在找XSS漏洞的時候,我們先看看站點有什么功能;
在首頁的圖片和帖子列表頁中可以大致看出有搜索功能,和發帖,回復帖子等功能,這些地方都會把接收的參數作為內容展示出來,所以我們可以挨個去測試.
先來一個最簡單的搜索頁吧,在導航欄有一個搜索框,我首先在搜索框中輸入test吧,得到URL地址如下
代碼語言:javascript代碼運行次數:0運行復制
http://permeate.localhost/home/search.php?keywords=test
從URL地址可以看出搜索的關鍵詞會通過keywords來傳遞,傳遞之后也會顯示在頁面內容當中,如下圖

現在分析顯示html元素,在關鍵詞test的父級節點,可以看到是div,div中寫入script標簽是會被執行的,所以可以直接使用下面的payload
代碼語言:javascript代碼運行次數:0運行復制
http://permeate.localhost/home/search.php?keywords=test<script>alert(123)</script>
進行測試,通過瀏覽器訪問此連接,可以看到已經彈出123確認框

不過xss不僅限于script標簽可以被執行,也可以用img標簽的onerror屬性來執行,可以構造如下的payload
代碼語言:javascript代碼運行次數:0運行復制
http://permeate.localhost/home/search.php?keywords=test@@##@@<p>上面的XSS都屬于反射型的,存儲型的項目也表明存在,這里我們先略過吧,先看看CSRF的漏洞好了.</p>三. CSRF<p>CSRF漏洞主要成因是因為服務端接收表單請求時候沒有驗證是用戶發送的請求還是瀏覽器發送的請求,所以在挖掘此類表單的時候先去找表單的位置,在前面的截圖當中,可以看到有一個發帖的按鈕,可以進去點進去看看,點擊發帖,URL地址為</p>代碼語言:javascript<i class="icon-code"></i>代碼運行次數:<!-- -->0<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewbox="0 0 16 16" fill="none"><path d="M6.66666 10.9999L10.6667 7.99992L6.66666 4.99992V10.9999ZM7.99999 1.33325C4.31999 1.33325 1.33333 4.31992 1.33333 7.99992C1.33333 11.6799 4.31999 14.6666 7.99999 14.6666C11.68 14.6666 14.6667 11.6799 14.6667 7.99992C14.6667 4.31992 11.68 1.33325 7.99999 1.33325ZM7.99999 13.3333C5.05999 13.3333 2.66666 10.9399 2.66666 7.99992C2.66666 5.05992 5.05999 2.66659 7.99999 2.66659C10.94 2.66659 13.3333 5.05992 13.3333 7.99992C13.3333 10.9399 10.94 13.3333 7.99999 13.3333Z" fill="currentcolor"></path></svg>運行<svg width="16" height="16" viewbox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" clip-rule="evenodd" d="M4.5 15.5V3.5H14.5V15.5H4.5ZM12.5 5.5H6.5V13.5H12.5V5.5ZM9.5 2.5H3.5V12.5H1.5V0.5H11.5V2.5H9.5Z" fill="currentcolor"></path></svg>復制<pre class="prism-Token token line-numbers javascript">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地址如下:
代碼語言:javascript代碼運行次數:0運行復制
http://permeate.localhost/home/_fatie.php?bk=5&zt=0&title=111&content=222
然后去瀏覽器打開這個地址,看看是否能提交表單成功,訪問后發現彈出了一個確認框,告訴我已經發帖成功了,如下圖

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

這個CSRF相對來說比較低級,很多情況下用get并不能提到post提交,因此我們再來嘗試用post方法構造一個payload出來,代碼如下
代碼語言:javascript代碼運行次數:0運行復制
test
<script> var f=document.getElementById("test"); f.getElementsByTagName("input")[0].value="title"; f.getElementsByTagName("input")[1].value="content"; f.submit();</script>
在上面代碼中可以看出,表單里面的值已經事先做好了定義,當受害者打開之后,變回自動提交表單.
前面提到了這個系統中存在存儲型XSS,又存在CSRF漏洞,那么我們是不是可以用來做一個XSS蠕蟲試驗呢?
四. 蠕蟲XSS
滿足蠕蟲XSS需要兩個必要條件,存儲型XSS,和CSRF漏洞,這兩個這個系統都有,所以實現起來沒有問題,需要的是先找一下存儲型XSS
在前面發帖的位置會把參數存儲起來,并展示,因此這個地方是一個比較好的試驗點,我們在發帖位置先來試驗一下吧. 如下圖,表單中提交了xss驗證代碼,當成功觸發的時候會被彈框123,如下圖

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

現在CSRF有了,存儲型XSS也有了,那么接下來就是需要把它們結合起來使用了,但蠕蟲XSS利用代碼相對alert(123)來說代碼會比較長,所以我們需要先把利用代碼放到一個文件當中,然后再通過script引入進去,我們構造的代碼如下
代碼語言:javascript代碼運行次數:0運行復制
var strrand = +new Date();var str = 'http://premeate.localhost/home/_fatie.php?bk=5&zt=0&title=1111<script src></script>&content=222';var tag = document.createElement('img');tag.src = str;document.body.append(tag.src);
在上面的代碼中,只要一被執行,頁面將會被插入一個img標簽,其中標簽的src屬性又會去請求表單,表單里面的內容又是一段xss代碼,這樣變回造成XSS蠕蟲攻擊者,每次請求都會是倍數增長.如下圖,瀏覽器刷新3次之后,已經有很多帖子了.

作者:湯青松微信:songboy8888