「作者简介」:CSDN top100、阿里云博客专家、华为云享专家、网络安全领域优质创作者
「推荐专栏」:对网络安全感兴趣的小伙伴可以关注专栏《网络安全入门到精通》

最近突然出现好多自学黑客(网络安全)的文章,粉丝看到后就问我,自学应该从何入手?

我只能说,这玩意看天赋、看你喜不喜欢,与其收藏一大堆知识文章在收藏夹吃灰,不如先来学学相对基础的XSS,看看自己是不是这块“料”。

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通常会包含以下特征:

  1. 标签
  2. 标签的一些事件,比如:onclick、ondbclick、onload、onchange、onmouseover、onerror、onblur等。
  3. 标签的超链接属性,比如:href、src。

七、XSS的危害

XSS控制浏览器进行操作,受限于浏览器的权限,主要通过JS代码来发挥作用,常见的危害有以下几种:

  1. 获取cookie,比如获取管理员Cookie,进行越权。
  2. 钓鱼网站,比如写一个假的登录页面,获取用户的登录信息,再跳转到真实的网站。
  3. DDOS,比如在网站植入JS代码,向指定网站发送请求,当用户数量大了以后,就能实现DDOS。
  4. 网页挂马、挖矿等
  5. 删除、修改文章等数据
  6. 劫持用户Web行为,渗透内网
  7. Web2.0蠕虫
  8. 蠕虫式DDOS
  9. 蠕虫式挂马、刷广告、刷流量

八、XSS的防御

XSS的防御手段主要有两种:实体转换和字符过滤

1、实体转换

使用htmlspecialchars()函数把内容中的预定义字符转换成HTML实体,转换后的字符会被当做转译字符输出在页面,而不是被当成代码执行。

预定义的字符有5个: ><'"&

我们修改一下文章开头的代码,打印之前先转译内容,会发现页面不再弹窗,<> 被转换了 <>

2、字符过滤

转换成HTML实体后,还是存在绕过的可能性。

htmlspecialchars() 默认只过滤双引号,可以用单引号绕过。

即使过滤了单引号, htmlspecialchars() 也只能过滤 ><'"& 这5个预定义字符,JavaScript:alert(1) 这种伪协议仍然可以绕过,因此,转换内容后,还要配合正则表达式过滤更多的字符。