实验目的
- 1.掌握XSS的原理及其利用方法
- 2.了解XSS的修复方法
实验内容
漏洞介绍
攻击者可以构造JS语句,通过XSS漏洞使管理员中招,获取管理员Cookie
影响范围
全版本
漏洞危害
- 上传脚本文件盗取各类用户帐号,如机器登录帐号、用户网银帐号、各类管理员帐号;
- 利用xss漏洞上传脚本文件获得企业网站一定权限控制企业数据,包括读取、篡改、添加、删除企业敏感数据的能力;
- 盗窃企业重要的具有商业价值的资料;
- 控制受害者机器向其它网站发起攻击。
XSS跨站攻击
XSS跨站攻击是指入侵者在远程WEB页面的HTML代码中插入具有恶意目的的数据,用户认为该页面是可信赖的,但是当浏览器下载该页面,嵌入其中的脚本将被解释执行。”由于HTML语言允许使用脚本进行简单交互,入侵者便通过技术手段在某个页面里插入一个恶意HTML代码,例如记录论坛保存的用户信息(Cookie),由于Cookie保存了完整的用户名和密码资料,用户就会遭受安全损失。如这句简单的Javascript脚本就能轻易获取用户信息:alert([removed]),它会弹出一个包含用户信息的消息框。入侵者运用脚本就能把用户信息发送到他们自己的记录页面中,稍做分析便获取了用户的敏感信息。
本次实验将对XSS攻击中GETSHELL的原理及方法进行详细分析。
XSS跨站攻击的分类
XSS漏洞类型主要分为持久型和非持久型两种:
- 非持久型XSS漏洞一般存在于URL参数中,需要访问黑客构造好的特定URL才能触发漏洞。
- 持久型XSS漏洞一般存在于富文本等交互功能,如发帖留言等,黑客使用的XSS内容经正常功能进入数据库持久保存。
DOM XSS漏洞,也分为持久和非持久型两种,多是通过javascript DOM接口获取地址栏、referer或编码指定HTML标签内容造成。
FLASH,PDF等其他第三方文件所造成的特殊XSS漏洞,同样按应用功能也分为持久和非持久型。
持久型XSS
持久型XSS又叫存储型XSS,存储型XSS攻击就是把攻击数据存进数据库,攻击行为就伴随着攻击数据一直存在.恶意攻击者往Web页面里插入恶意Script代码,网站系统未经过滤就将数据保存到了数据库中,当用户浏览该页的时候,嵌入其中Web里面的Script代码会被执行,从而达到恶意攻击用户的特殊目的。
反射型XSS
当请求数据在响应中呈现为未编码和未筛选时,就会发生反映型XSS。有了社会工程的帮助,攻击者可以诱骗用户访问创建这样一个请求的页面,即允许攻击者在目标用户上下文中执行JavaScript。这种变化可以做什么取决于漏洞的性质,但是XSS 一般被利用来劫持会话、窃取凭据或者执行未经授权的操作。
实验步骤
步骤1:了解漏洞原理
本次试验我们利用Payload追踪分析漏洞成因。
首先在评论处提交Payload:
[email=2"onmouseover="alert(2)]2[/email]
服务器对引号等敏感符号有过滤,因此提交后,查看源代码,就会发现引号已经被实体编码
普通用户提交的评论,管理员有权限对其进行修改编辑,当管理对用户的评论点击管理时,前端JS代码就开始处理,弹出一个编辑框供管理或版主操作。在JS代码处理的过程中,首先获取用户评论的内容,代码位于当前页面中:
而 $()
函数原型位于 /static/js/common.js 中:
使用了原生的 document.getElementById()
函数来获取页面中的对应对象,此处获取的是标有id=”e_textarea”
的对象,其对应的值为用户评论的内容。
而由于JS原生函数的原因,被服务器后端转义的引号会被重新是渲染回引号:
获取到id=”e_textarea”
对象后,代码对浏览器进行了判断,并将结果赋值给变量 var wysiwyg
。
在页面上另一处JS代码判断了变量wysiwyg
的值,然后开始渲染编辑框:
这里使用了Firfox浏览器进行测试,在前面wysiwyg变量的值为1,所以会执行如下代码
newEditor(1, bbcode2html(textobj.value))
其中textobj.value的值为:[email=2"onmouseover="alert(2)]2[/email]
(经过document.getElementById()获取的对象解析了实体编码)
在进行newEditor()
时,会对传入的内容使用函数bbcode2html()进行编码过滤,其函数原型位于/static/js/bbcode.js,下面是Discuz对程序所支持的shortcode进行处理的部分代码。
程序匹配其支持的shortcode然后正则替换为相应的前端格式代码,因此次测试的payload为[email=2”onmouseover=”alert(2)]2[/email]
,因此图中红色标注的代码会得到执行。
str = str.replace(/\[email=(.[^\[]*)\](.*?)\[\/email\]/ig, '$2');
经过正则匹配替换后,str的值会变为:[2](mailto:2)
最终bbcode2html()函数会返回经过转换后的textobj.value,值为:[2](mailto:2)
然后调用newEditor()函数进编辑框的渲染,其函数原型位于/static/js/editor.js
从函数原型可以看到,代码再次判断浏览器类型然后开始渲染,由于wysiwyq变量的值为1,最终会执行
writeEditorContents(isUndefined(initialtext) ? textobj.value: initialtext);
而调用newEditor()函数时,传递了initialtext参数,其值就为经过bbcode2html()函数处理后的textobj.value的值。
前端JS最终使用writeEditorContents()函数对页面进行渲染,其过程中会将initialtext变量的值直接写入到页面中,最终形成XSS。
下面进行漏洞操作利用:
步骤2:利用漏洞
首先登录目标网站http://127.0.0.1/discuz
,使用账号密码为:admin、admin来登录。
接下来发帖,点击默认模块-快速发帖,将payload填入内容框,点击发表帖子:
这时,我们点击编辑:
当鼠标停留在数字 2
上时,就会触发成功。
实验结果分析与总结
通过上述实验,我们发现该网站存在xss漏洞,并利用此漏洞上传了脚本,然后诱使管理员打开了文件,使脚本被执行,成功获得网站权限。必要条件有:网站存在xss漏洞,管理员打开了脚本文件。任何一个环节出现问题,都无法拿到webshell。
XSS跨站脚本攻击作为Web应用安全领域中最大威胁之一,不仅仅危害Web应用业务的正常运营,对访问Web应用业务的客户端环境和用户也带来了直接安全影响。虽然XSS跨站脚本攻击在复杂的Web应用环境中利用方式千变万化,但是网络安全人员通过对Web应用的各种环境进行详细分析和处理,完全阻断XSS跨站脚本攻击是可以实现的:
- 1:利用HttpOnly HttpOnly最初是由微软提出的,目前已经被多款流行浏览器厂商所采用。HttpOnly的作用不是过滤XSS跨站脚本攻击,而是浏览器将禁止页面的Javascript访问带有HttpOnly属性的Cookie,解决XSS跨站脚本攻击后的Cookie会话劫持行为。
- 2:完善的输入和输出检查 由于三种XSS跨站脚本攻击类型的漏洞成因可不相同,针对输入输出的检查一部分适用于反射型XSS与存储型XSS。输入检查在大多数的时候都是对可信字符的检查或输入数据格式的检查,如用户输入的注册账号信息中只允许包括字母、数字、下划线和汉字等,对于输入的一切非白名单内的字符均认为是非法输入。数据格式如输入的IP地址、电话号码、邮件地址、日期等数据都具有一定的格式规范,只有符合数据规范的输入信息才允许通过检查。
- 3:使用随机数改写文件名和文件路径 文件上传如果要执行代码,则需要用户能够访问到这个文件。在某些环境中,用户能上传,但不能访问。如果应用使用随机函数改写了文件名和路径,将极大增加攻击成本。与此同时,像
1.php.rar.rar
、或者1.xml
这种文件,都因为文件名被改写而无法成功实施攻击
思考
1、思考如何才能彻底的杜绝防御XSS攻击
2、XSS跨站攻击除了在本文提到的,还有哪些写法,语句如何构成
第1题:下列说法正确的是
XSS攻击的目标是目标网站的服务器
XSS攻击的目标是目标网站的目标用户
XSS可以不受同源策略约束
上面说法都不正确
B
第2题:<img ?/>下面哪个选项填写到问号处时会引发XSS?
id=”alert(/xss/)”
Width=”alert(/xss/)”
Onmouseover=“javascript:alert(/xss/);”
Class=”alert(/xss/)”
C
第3题:发表什么内容可以编辑的时候弹窗?
[script]alert(1)[/script]
[align="οnmοuseοver="alert(a)]aaaa
[align="οnmοuseοver="alert(1)]aaaaaa
D