XSS注入

XSS(Cross Site Scripting),由于与层叠样式表(Cascading Style Sheets,CSS)的缩写混淆。因此一般缩写为XSS。XSS攻击通常指的是通过利用网页开发时留下的漏洞,通过巧妙的方法注入恶意指令代码到网页,使用户加载并执行攻击者恶意制造的网页程序。

1. XSS原理

有以下一段HTML代码。

<inputtype='text' value='$var' name='username' />

其中value的参数$var是由用户输入,通过以下jsp代码获得并且显示在界面上。

<%
Stringname=request.getPrarmeter("username");
%>
<%=name%>

假设用户输入的$var参数为“<script>alert(/XSS/)</script>”,前端HTML代码为。

<inputtype='text' value='<script>alert(/XSS/)</script>' name='username'/>

后端显示变为。

<script>alert(/XSS/)</script>

这样JavaScript程序被执行。虽然这段JavaScript注入代码(PayLoad)非常简单,但是可以变为一段非常可怕的侵入代码,获取客户端包括操作系统内的所有信息。

2. XSS注入分类

XSS注入可以分为三类,“反射型XSS”“存储型XSS”和“DOM型XSS”。

1)反射型XSS(Non-Persistent XSS)

反射型XSS只是简单地把用户输入的数据反射给浏览器,黑客需要诱使用户点击链接。反射型XSS也叫“非持久型XSS” 上一节中的注入就属于反射型XSS。

2)存储型XSS(Persistent XSS)

存储型XSS把用户输入的数据“存储”在服务器或客户端。这种XSS具有很强的稳定性。比如博客产品将博文标题与内容存储在MySQL数据库中,然后通过jsp程序将其显示在网页上。

<%
Stringtitle = rs.getTitle();
Stringcontent = rs.getContent();
%>
<P>
文章标题:<%= title %><br/>
文章内容:<%= content %><br/>
</P>

如果title或者content包含XSS PayLoad,这个页面就存在威胁了。

3)DOM型 XSS

在讲解DOM型XSS前先简单介绍一下什么是DOM树。对于任何一个HTML网页都可以看作是从<html>标签到文本节点的一颗“树”,这颗“树”叫做DOM树。如图1是下面这段HTML代码的DOM树。

<html>
<head>
<title>文档标题</title>
</head>
<body>
<ahref="#">我的链接</a>
<h1>我的标题</h1>
</body>
</html>

图1 DOM树

DOM型 XSS注入在原有的HTML对应的DOM树中插入一个节点,然后在这个节点上注入XSS的PayLoad。请看如下代码。

<script>
functiontest(){
    var str=document.getElementById("text").value;
   document.getElementById("t").innerHTML ="<ahref='"+str+"'>testlink</a>"
}
<body>
<divid="t"></div>
<inputtype="text" id="text" value="" />
<inputtype="button" id="s" value="write"onclick="test()"/><br>
<textareaname="input" rows="10"cols="40">'onclick=alert(/XSS/) //
或者输入:' ><img src=# onerror=alert(/XSS/) /><'
</textarea>
</form>
</body>

JavaScript代码在id="t"的位置插入一个标签为<a>的DOM节点,标签<a>节点的href属性来源于id="text"的< input >属性的值。如果用户输入“'onclick=alert(/XSS/) //”,标签变为。

<a href=''onclick=alert(/XSS/)//'>testlink</a>

当点击testlink这个超链接,XSS PayLoad就被触发。或者如果用户输入“<a href=''><img src=# onerror=alert(/XSS/)/><''>testlink</a>”,标签变为。

<ahref=''><img src=# onerror=alert(/XSS/) /><''>testlink</a>

这个时候,不用点击testlink这个超链接,XSS PayLoad就被触发。

3. XSS会话挟持

如果将上面XSS PayLoad的alert(/XSS/)改为alert(document.cookie),看看会发现什么样的情况。代码如下。

…
<%
response.addHeader("Set-Cookie","username=jerry;Expires=Thu,01-Jan-203000:00:01 GMT;path=/");
response.addHeader("Set-Cookie","password=123456;Expires=Thu,01-Jan-203000:00:01 GMT;path=/");
%>
…
window.onload=functionload(){
window.location.href="login11.jsp"}
…

在login11.jsp有如下代码。

<inputtype="button" value="显示Cookies"onclick="javascript:alert(document.cookie)">

当点击【显示Cookies】的按钮后就会把“username=jerry;password=123456”给显示出来。程序通常会在Cookie中设置一些用户隐私信息,这些信息一旦被泄露,就会产生一定的威胁。那么有什么办法可以不让用户获得Cookie信息呢?这个时候“HTTPOnly”武器就出场了。cookie中加入HttpOnly属性最初是由Microsoft Internet Explorer开发人员于2002年在Internet Explorer 6 SP1的版本中实现。HttpOnly是Set-Cookie HTTP响应头中包含的附加标志。生成cookie时使用HttpOnly标志有助于降低客户端脚本访问受保护cookie的风险(如果浏览器支持它)。把上面代码修改一下。

…
<%
response.addHeader("Set-Cookie","username=jerry;Expires=Thu,01-Jan-203000:00:01 GMT;path=/;HttpOnly");
response.addHeader("Set-Cookie","password=123456;Expires=Thu,01-Jan-203000:00:01 GMT;path=/;HttpOnly");
%>
…
window.onload=functionload(){
window.location.href="login11.jsp"}
…
<inputtype="button" value="显示Cookies"onclick="javascript:alert(document.cookie)">

在login11.jsp代码不变。这个时候当点击【显示Cookies】按键的后,username和password的cookie信息都不将被显示出来。HttpOnly在JavaScript、PHP、ASP、JSP脚本以及JBOSS、Tomcat、Apatch等Web Service中均可以设置。比如在TomCat中的/conf/ 目录下context.xml修改<ContextuseHttpOnly="true">即可将所有的Cookies设置HttpOnly。

4. XSS蠕虫

XSS蠕虫是一种危害最大的XSS注入PayLoad,通过AJAX技术使成千上万的网民中招,曾经在百度等各大网站上都发生过。如图2所示。

图2 XSS蠕虫效应

下面来简单介绍一下XSS蠕虫。微博系统的URL如下:http://www.mydomain.com,其中。

•http://www.mydomain.com/Listen.php。

查看自己的微博。

•http://www.mydomain.com/forward.php?userid=7&articleid=23。

编号为123的微博转发个编号为7的用户,其中123为微博号,7为用户号。

•http://www.mydomain.com?userinfo.php。

查看自己的粉丝信息。来看一下蠕虫是如何“发作”的。

(1)发表一个正常微博文章,记录文章的articleID, 假设为23

(2)通过http://www.mydomain.com?userinfo.php获取所有userid,存在一个数组中。

(3)在博文中添加下面代码。

<script>
functionGetUserId(){
…//通过AJAX获得UserId
returnUserId;
}
functionGetForWardUrl(){
foreach user{
      var UserId = GetUserId();
      var ForWardUrl ="http://www.mydomain.com/forward.php?userid="+ UserId+"&articleid=23"
}}
functionListenUser(){
varlistenUrl = "http://www.mydomain.com/Listen.php;
…//通过AJAX或者其他方式查看
}
functionForWard(){
varforWardUrl = GetForWardUrl();
…//通过AJAX或者其他方式访问此URL转发微博
}
functionattack(){
ForWard();//把本文章转发给用户
ListenUser();        //查看自己的微博
}
attack();//蠕虫发作
</script>

(4)通过ListenUser()方法查看这篇博文,蠕虫发作。这五个函数调用图如图3所示。

图3 XSS蠕虫代码函数调用图

(5)攻击函数attack()先调用ForWard(),GetForWardUrl()遍历通过第(2)步存储的用户ID,产生一个把本微博发给每一个粉丝的超链接,并且让每一位粉丝访问这篇微博。然后调用方法ListenUser()查看此微博,从而触发整个蠕虫病毒的连环“传染”。

本文分享自微信公众号 - 软件测试培训(iTestTrain),作者:顾翔

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-05-29

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 软件安全性测试(连载3)

    XSS(Cross SiteScripting),由于与层叠样式表(CascadingStyle Sheets,CSS)的缩写混淆。因此一般缩写为XSS。XSS...

    小老鼠
  • 常见的Web安全漏洞及测试方法介绍

    Web应用一般是指B/S架构的通过HTTP/HTTPS协议提供服务的统称。随着互联网的发展,Web应用已经融入了我们的日常生活的各个方面。在目前的Web应用中...

    小老鼠
  • 测试大佬总结:Web安全漏洞及测试方法

    web应用一般是指B/S架构的通过HTTP/HTTPS协议提供服务的统称。在目前的Web应用中,大多数应用不都是静态的网页浏览,而是涉及到服务器的动态处理。如...

    小老鼠
  • 渗透实例 | 记录一次XSS渗透过程

    没什么技巧,见到框就X,功夫不负有心人,在目标网站编辑收货地址处发现了存在XSS的地方,没想到这种大公司还会存在XSS。

    TeamsSix
  • CTF实战9 XSS跨站脚本漏洞

    该培训中提及的技术只适用于合法CTF比赛和有合法授权的渗透测试,请勿用于其他非法用途,如用作其他非法用途与本文作者无关

    用户1631416
  • xss备忘录

    黑白天安全
  • 一篇文章带你从XSS入门到进阶(附Fuzzing+BypassWAF+Payloads)

    OWASP(开放式Web应用程序安全项目)的工具、文档、论坛和全球各地分会都是开放的,对所有致力于改进应用程序安全的人士开放,其最具权威的就是“10项最严重的W...

    陈殷
  • 软件安全性测试(连载3)

    XSS(Cross SiteScripting),由于与层叠样式表(CascadingStyle Sheets,CSS)的缩写混淆。因此一般缩写为XSS。XSS...

    小老鼠
  • 从零开始学web安全(1)

    一直对web安全很感兴趣,却一直只是略懂一点。决定从现在开始学起web安全的知识,更新起web安全系列的文章。文章内容为作者自己边学边写的,不对之处多谢各位大大...

    IMWeb前端团队
  • XSS防御指北

    XSS攻击,对于各位黑客大佬应该算是熟悉的不能再熟悉了,但是为了在座的各位吃瓜群众,小编我还是先简单的在此介绍下。XSS攻击全称为跨站脚本攻击,是...

    用户2202688

扫码关注云+社区

领取腾讯云代金券