XSS-漏洞分析
Posted 佛系安全
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了XSS-漏洞分析相关的知识,希望对你有一定的参考价值。
简介:XSS也叫html注入,代码可以进行注入对用户造成影响。
产生原因:网站对用户的输入没有进行严格的限制,导致用户输入的数据可以修改当前页面或者插入一段脚本。
XSS种类:反射型、存储型和DOM型。
存储型:黑客构造XSS脚本内容,提交给后端WEB应用程序,WEB应用程序将留言保存在数据库中,管理员查看留言的时候触发XSS
攻击方式:在论坛、博客和留言板等地方进行发帖的过程中,将恶意脚本连同正常信息一起写入帖子中,当用户访问这个帖子的时候这个恶意脚本就会执行。
反射型:用户在浏览器中访问携带XSS脚本的链接,浏览器向后端应用程序发送请求,后端程序将URL中的XSS脚本数据写入到响应页面并返回给浏览器,浏览器发出响应页面并触发XSS
攻击方式:通过诱骗或加密的方式,将存在恶意代码的链接发给用户,当用户点击以后才能使攻击成功实施。
DOM型:用户在浏览器中访问携带XSS的链接,浏览器中JS从浏览器中提取XSS脚本的内容,并写入到DOM中触发XSS
攻击方式:用户请求一个经过黑客专门设计的URL,当用户的浏览器处理这个响应时,DOM对象就会处理XSS代码,导致存在XSS漏洞。
XSS攻击条件:
1、用户可以随意输入数据
2、输入信息可以在浏览器中显示
3、没有特殊字符的过滤和字符转义等防护措施。
4、浏览器将输入解析为脚本并执行。
漏洞挖掘思路:
1、寻找输入点
当前页面存在可被用户控制输入的参数显示点
位置:留言板、在线信箱、评论栏、用户、标题、内容等,养成见框就X的习惯
2、测试输出位置
填写测试代码以后可以查看源码,根据HTML进行编写有效的XSS代码。
有些输出点不直接显示在前台,需要管理员进行点击,就需要进行盲打
盲打位置:留言板、意见反馈点、私信功能、文件上传点中的信息输入框、在线提交等。
证明存在XSS漏洞:在输入中插入一段可以产生弹窗效果的javascript脚本,如果刷新页面产生弹窗,表明XSS攻击测试成功存在XSS漏洞。
技巧:URL中存在汉字或带百分号的URL编时一般就可能存在XSS注入
测试代码:
<script>alert(/xss/)</script>
<script>alert(1)</script>
<img src=x onerror==alert(1)>
<svg onload=alert(1)>
<a href=javascriptslert(1)>
</textarea><script>alert(/xss/)</script>
<ScriPt>alert(/xss/)</Script>
<scr<script>ipt>alert(/xss/)</script>
<iframe >
<img ></img>
<img src=1 onerror=alert(/xss/)>
" onerror=alert(1) "
" onerror=alert(1) x="
"><script>alert(1)</script>
'><script>alert(/X/)</script>
HTML输入:
这里给出一个HTml代码地示例:<img width=100 onerror=alert("载入图片错误!")>
<>是告诉浏览器这是一个Html标记
img是这个Html标记地名称
src是这个标记地第一个属性
=后面是这个属性地值
后面地width是第二个属性
onerror是标记地事件属性
只要你地输入处在Html标签内,产生了新地元素或者属性,就实现了跨站脚本攻击!
<script>这样地内容一旦出现,浏览器将认为产生一个脚本标记并且将其后面地内容当作javascrip来解释执行,直到出现</script>结束。我们可以看出浏览器地所有输出操作都是由这些<>标记控制地,他只是解释这些标记并且产生动作或者把结果返回给用户,其他地都当成普通字符显示。这样地话如果用户提交地内容是<script>alert("Test!")</script>并且没有任何过滤,然后又从数据库里取出来直接显示地话,就会在其他地来访者浏览器里执行代码了
区别:
存储型:攻击代码在数据库里输出在HTTP响应中(浏览器-服务器-数据库交互)
反射型:攻击代码在url里输出在HTTP响应中(浏览器-服务器)
DOM型: 攻击代码在url里输出在DOM节点中(浏览器-服务器)
绕过方式:
1、闭合标签测试
<textarea>444</textarea> ,内容在多行文本框<textarea></textarea>中进行输出,但是这个标签会把javascript当成文本进行输出,并不会执行JavaScript语句。
构造注入语句,必须先闭合<testarea>标签,使原来的标签失效,再构造JavaScript语句。
</textarea><script>alert(/xss/)</script>
<textarea></textarea><script>alert(/xss/)</script></textarea>
</textarea>成功闭合</textarea>,导致后面</textarea失效>
textarea 标签 -- 代表HTML表单多行输入域
textarea标签是成对出现的,以<textarea>开始,以</textarea>结束
属性:
Common -- 一般属性
cols -- 多行输入域的列数
rows -- 多行输入域的行数
accesskey -- 表单的快捷键访问方式
disabled -- 输入域无法获得焦点,无法选择,以灰色显示,在表单中不起任何作用
readonly -- 输入域可以选择,但是无法修改
tabindex -- 输入域,使用"tab"键的遍历顺序
使用方法:
设置文本框的行数为40,列数为10。名称为text。表达形式 <textarea cols=40 rows=10 name=text></textarea>
2、大小写混合测试
输入<script>alert(/xss/)</script>,查看源码发现只剩下alert(/xss),那么可能被安全防护设备过滤掉了<script>标签,可采用大小写混合方式进行测试
<sCriPt>alert(/xss/)</scRipt>
3、多重嵌套测试
输入<script>alert(/xss/)</script>,查看源码发现只剩下alert(/xss),无任大小写只要是<script>就进行过滤,那么就可以利用这个特性来进行构造语句。
<sc<script>ript>alert(/xss/)</script> ,<script>被过滤以后,剩下的就会组成一个注入代码。
4、绕过magic_quotes_gpc=ON
magic_quotes_gpc=ON是php中的安全设置,开启后会把一些特殊字符进行轮换
'转换为\' ,\转换为\\
<script>alert("xss");</script>转换为<script>alert(\"xss\");</script>,测试代码就失效了
通过javascript中的String.fromCharCode方法来绕过,String.fromCharCode用来把ASCII转换为字符串
<script type="text/javascript">
document.write(String.fromCharCode(72,69,76,76,79))
document.write("<br />")
document.write(String.fromCharCode(65,66,67))
</script>
代码输出为HELLO 和ABC
<script>alert(“xss”)</script>这个xss测试代码就为下面这样(使用hackbar)
<script>String.fromCharCode(97, 108, 101, 114, 116, 40, 34, 88, 83, 83, 34, 41, 59)</script>
5、使用空字符
<scr%00ipt>alert("XSS")</scri%00ip>
%00在URL编码中为空
6、HEX编码
<script>alert("xss");</script>
危害:
1、窃取cookie(可以直接进行登录)
2、截获客户端信息
3、挂载其他网站链接
4、网络钓鱼
修复方案:
1、使用HttpOnly有助于缓解XSS攻击,但是在部署时需要注意,如果业务复杂,则需要在所有Set-Cookie的地方,给关键Cookie都加上HttpOnly。漏掉了一个地方,都可能使得这个方案失效;
PHP下开启httponly:
找到php.ini,开启标签session.cookie_httponly = true 开启全局的Cookie的httponly属性
2、输入过滤:白名单,在服务器端对输入进行格式检查,如在网站注册时填写的用户名只能为字母、数字的组合,手机号应该是不长于16位的数字;检查输入中是否包含一些特殊字符,如<、>、'、"、/等,如果发现,则进行过滤或编码;对输入进行XSS特征的匹配,如查找数据中是否包含“<script>”、“javascript”等敏感字符;
3、输出过滤:HTML编码、JS转义:一般来说,除了富文本的输出外,在变量输出到HTML页面时,可以使用编码或转义的方式来防御XSS攻击。针对HTML代码的编码方式是HtmlEncode,在PHP中,有htmlentities()和htmlspecialchars()两个函数可以满足安全要求;相应的,JavaScript的编码方式可以使用JavascriptEncode,JavascriptEncode与HtmlEncode的编码方式不同,它需要使用“\”对特殊字符进行转义。在对抗XSS时,还要求输出的变量必须在引号内部,以避免造成安全问题;除了HtmlEncode、JavascriptEncode外,还有很多用于各种情况的编码函数,比如XMLEncode、JSONEncode等。
httponly:如果一个cookie值设置了这个属性,那么浏览器将禁止页面的JS访问这个cookie,阻碍跨站行为偷取当前用户的Cookie信息,并没有从根本上解决XSS的问题。
HTML编码:实体化编码,编码前&,编码后&
主要是告诉浏览器哪些字符只能作为文本显示,不能当作代码执行,实体化编码的意义在于严格限定了数据就是数据,避免数据被当成代码进行执行
JavaScript编码:转义,转义前\,转义后\\;
以上是关于XSS-漏洞分析的主要内容,如果未能解决你的问题,请参考以下文章