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>

XSS-漏洞分析



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的编码方式可以使用JavascriptEncodeJavascriptEncodeHtmlEncode的编码方式不同,它需要使用“\”对特殊字符进行转义。在对抗XSS时,还要求输出的变量必须在引号内部,以避免造成安全问题;除了HtmlEncodeJavascriptEncode外,还有很多用于各种情况的编码函数,比如XMLEncodeJSONEncode等。


httponly:如果一个cookie值设置了这个属性,那么浏览器将禁止页面的JS访问这个cookie,阻碍跨站行为偷取当前用户的Cookie信息,并没有从根本上解决XSS的问题。

HTML编码:实体化编码,编码前&,编码后&amp;

主要是告诉浏览器哪些字符只能作为文本显示,不能当作代码执行,实体化编码的意义在于严格限定了数据就是数据,避免数据被当成代码进行执行

JavaScript编码:转义,转义前\,转义后\\;




















以上是关于XSS-漏洞分析的主要内容,如果未能解决你的问题,请参考以下文章

漏洞赏金 XSS 漏洞网站负载

XSS-漏洞分析

2016-02-03 xss漏洞

XSS漏洞基础入门

开源 Web 应用最常见漏洞是 XSS 和 SQLI 漏洞

教你如何玩转XSS漏洞