「作者简介」:CSDN top100、阿里云博客专家、华为云享专家、网络安全领域优质创作者
「推荐专栏」:对网络安全感兴趣的小伙伴可以关注专栏《网络安全入门到精通》
XSS漏洞
- 一、什么是XSS?
- 二、XSS概述
- 三、靶场练习
- 四、XSS使用步骤
- 五、XSS攻击类型
- 六、XSS流量特征
- 七、XSS的危害
- 八、XSS的防御
- 1、实体转换
- 2、字符过滤
一、什么是XSS?
首先,我们通过一个案例来认识一下XSS:
1)下面这几行PHP代码,功能很简单:获取「地址栏」的参数,然后打印出来。
2)我们访问这个页面,提交「value参数」,页面就会显示出我们提交的内容:
3)如果我们提交JS代码,页面就会执行我们提交的代码,比如下面这样「弹窗」,就是触发了XSS漏洞:
看到这里,你已经对XSS有了一个基本的了解,接下来,我们正式认识一下XSS漏洞。
二、XSS概述
XSS(Cross Site Scripting)也叫跨站脚本攻击。利用浏览器的「解析漏洞」,在前端页面执行JS代码。
原理:尖括号<>
是HTML标签的语法,网页中插入的包含尖括号<>
的内容都会被浏览器当做HTML标签来解析,如果插入的标签中包含JavaScript代码,浏览器也会执行它。
XSS的核心是「参数可控」,就是用户可以控制提交的参数内容,在提交的内容中构造出前端可以执行的JavaScript代码。
弹窗是XSS最基础的一种「触发形式」,常用来验证XSS漏洞是否存在。我们可以通过修改提交的代码,执行其他操作,比如获取cookie,记录键盘等。
由于XSS执行的是JS代码,所以它主要是作用在「前端浏览器」,受害的是网站用户而不是服务器本身。
三、靶场练习
接下来,我们通过XSS-Game靶场,来学习一下XSS的使用技巧和绕过技巧。
XSS使用的第一步是寻找「输入和输出点」,也就是用户从什么地方输入内容?输入的内容会输出到页面的什么位置?
以第一关为例,用户从地址栏输入名字,输入的名字会显示在欢迎用户的位置,那输入和输出点就是下图中标记的地方:
找到输入点以后,第二步就是查看「网页源代码」,分析输出点的代码有没有被「过滤」,如果内容被输出到属性当中,还要考虑怎么去「闭合」。
这里我输入了一个基础符号,从源代码可以看到,内容没有被过滤,而且是输出到标签里面,也不用考虑闭合。
这里要提示一点:右键检查并不能有效的查看过滤情况,一定要用网页源代码。
分析完输出点,第三步就可以提交JS代码来验证XSS是否存在,最常用的验证方式就是用 alert() 进行「弹窗测试」,如果页面弹窗,就证明存在XSS。
确定注入点存在后,第四步就是利用了,这里我们的目的是学习,就不给大家演示了。
XSS-Game 靶场的其他关卡可以看我的另一篇文章: XSS-Game靶场通关教程
初学者建议过前十关或前十三关,做完靶场后,我们总结一下XSS的使用步骤。
四、XSS使用步骤
XSS使用的关键在于「输入和输出」,输入是指用户可以提交代码的功能点,输出是用户提交的内容被输出到了页面的什么位置。
1)寻找输入点和输出位置
2)打开网页源代码,分析输出位置的代码,构造闭合脚本。
3)利用altet(1)
进行弹窗测试,确认XSS注入点是否存在.
4)利用注入点完成各种操作。
五、XSS攻击类型
根据XSS代码插入的位置,可以将XSS分为三种类型:反射型、存储型、DOM型。
1)「反射型XSS」通过url提交XSS代码,服务器响应回来的代码被插入到HTML页面的标签或属性中,这种类型通常是一次性的,也就是非持久型XSS。
反射型XSS参考练习靶场
2)「存储型XSS」会将XSS代码写入后台的数据库,服务器从数据库中查询数据再展示到页面中,这种类型可以一直触发,也叫持久型XSS。
存储型XSS参考练习靶场
3)「DOM型XSS」会将XSS代码插入到HTML页面的DOM树里面,通常不与服务器交互。
DOM型XSS参考练习靶场
提示:DOM树从网页的根节点开始,逐级向下表示网页的结构。根节点对应的是HTML文档的标签,下面是标签,然后是标签和标签,接着是一些标记,最后是文本节点。这些节点可以相互包含和嵌套,形成一个树状结构。
六、XSS流量特征
XSS的payload
通常会包含以下特征:
<script></script>
标签- 标签的一些事件,比如:onclick、ondbclick、onload、onchange、onmouseover、onerror、onblur等。
- 标签的超链接属性,比如:href、src。
七、XSS的危害
XSS控制浏览器进行操作,受限于浏览器的权限,主要通过JS代码来发挥作用,常见的危害有以下几种:
- 获取cookie,比如获取管理员Cookie,进行越权。
- 钓鱼网站,比如写一个假的登录页面,获取用户的登录信息,再跳转到真实的网站。
- DDOS,比如在网站植入JS代码,向指定网站发送请求,当用户数量大了以后,就能实现DDOS。
- 网页挂马、挖矿等
- 删除、修改文章等数据
- 劫持用户Web行为,渗透内网
- Web2.0蠕虫
- 蠕虫式DDOS
- 蠕虫式挂马、刷广告、刷流量
八、XSS的防御
XSS的防御手段主要有两种:实体转换和字符过滤
1、实体转换
使用htmlspecialchars()
函数把内容中的预定义字符转换成HTML实体,转换后的字符会被当做转译字符输出在页面,而不是被当成代码执行。
预定义的字符有5个: >
,<
,'
,"
,&
。
我们修改一下文章开头的代码,打印之前先转译内容,会发现页面不再弹窗,<
和 >
被转换了 <
和 >
。
2、字符过滤
转换成HTML实体后,还是存在绕过的可能性。
htmlspecialchars()
默认只过滤双引号,可以用单引号绕过。
即使过滤了单引号, htmlspecialchars()
也只能过滤 >
,<
,'
,"
,&
这5个预定义字符,JavaScript:alert(1)
这种伪协议仍然可以绕过,因此,转换内容后,还要配合正则表达式过滤更多的字符。