首页 > 其他分享 >代码审计——XSS详解

代码审计——XSS详解

时间:2023-06-25 18:01:40浏览次数:42  
标签:审计 XSS 脚本 输出 用户 详解 数据 页面


01 漏洞描述

跨站脚本入侵(Cross Site Script)是一种将恶意JavaScript代码插入到其他Web用户页面里执行以达到入侵目的的漏洞。

代码审计——XSS详解_html

入侵者利用应用程序的动态展示数据功能,在html页面里嵌入恶意代码。当用户浏览该页之时,这些嵌入在html中的恶意代码会被执行,用户浏览器被入侵者控制,从而达到入侵者的特殊目的。

跨站脚本入侵有以下入侵形式:

1、反射型跨站脚本入侵

入侵者利用社会工程学等手段,发送一个URL链接给用户打开,在用户打开页面的同时,浏览器会执行页面中嵌入的恶意脚本。

2、存储型跨站脚本入侵

入侵者利用应用程序提供的录入或修改数据的功能,将数据存储到服务器或用户cookie中,当其他用户浏览展示该数据的页面时,浏览器会执行页面中嵌入的恶意脚本,所有浏览者都会受到入侵。

3、DOM跨站脚本入侵

由于HTML页面中,定义了一段JS,根据用户的输入,显示一段HTML代码,入侵者可以在输入时,插入一段恶意脚本,最终展示时,会执行恶意脚本。

DOM跨站脚本入侵和以上两个跨站脚本入侵的区别是,DOM跨站是纯页面脚本的输出,只有规范使用JavaScript,才可以防御。

02 审计要点

XSS漏洞发生的根本原因是"用户可控的"、”未经净化“的数据直接在HTML页面上展示。

“用户可控数据”可能来源于http请求、数据库、Http Header或cookie等,当明确用户可控数据,可以输出至前端页面时,判断代码中是否存在以下防护逻辑,若均不符合,则存在问题的风险递增。

1、前端是否有XSS防护框架,如Angularjs、Recat、vue.js等,一般这种防护框架在项目设计初期就要考虑到了,不然上线后再进行改动,耗时耗力,不切合实际情况。

2、用户输入数据时是否存在全局参数过滤器?过滤规则是否符合要求?是否存在需过滤和不需过滤两种输出,页面是否控制恰当?

3、输出内容在前端时是否进行恰当的编码(HTML、JS等)?

03 漏洞特征

一、缺陷代码示例(反射型XSS)

Java

<%out.print(request.getParameter("param")); %>

在上面的代码中,直接将从请求参数中获取到的param参数值在页面中输出,可导致反射型XSS漏洞。

PHP

if($_ GET ["openid"]) echo $_ GET ["oauth_ signature"] ;

在上面的代码中,参数入口为用户提交的http get型请求数据,为用户可控,且经过echo输出函数在页面中输出,导致反射型XSS。

.Net

Default.aspx.cs:
public partial class _Default : System.Web.UI.Page
{
    public string commonXSS;
    protected void Page_Load(object sender, EventArgs e)
    {
        string commonXSS = Request.QueryString["UserInputData"];
        //假设用户输入:UserInputData="<script>alert(123)</script>";
        
    }
}

Default.aspx:
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
    <%:commonXSS %>
    <input type="text" value="Default" />
    </div>
    </form>
</body>
</html>

以上代码中,假设用户输入:UserInputData="";,由于代码层面无任何过滤或防护措施,UserInputData参数值在页面中输出,导致反射型XSS。


二、缺陷代码示例(存储型XSS)

Java

while(rs.next()){
%>
<tr>
<td><%=rs.getInt("id") %></td>
<td><%=rs.getString("pname")%></td>
<td><%=rs.getString("pdesc")%></td>
<td><%=rs.getString("ptype")%></td>
</tr>
<%
}

代码中均为从数据库中读取到的数据,该数据被直接输出到了页面中,没有做任何安全过滤,若从数据库中获取到的数据中包含JS/VBS脚本,就可能导致用户浏览器把JS/VBS脚本执行,从而造成XSS入侵。

04 漏洞案例

代码审计——XSS详解_HTML_02

某某平台存在XSS漏洞,用户提交的数据,直接被输出到客户端页面,且存储在服务端数据库中,为存储型XSS。

代码审计——XSS详解_html_03

)

代码审计——XSS详解_HTML_04

搭建环境,验证存储型XSS漏洞真实存在,如下图所示:

代码审计——XSS详解_数据_05


05 修复方案

对用户提交的数据在输出返回浏览器前进行转义,对特殊字符如;尖括号,括号,单引号,双引号,反斜线等进行HTML字符实体转义。

总体修复方式:验证所有输入数据,有效检测入侵;对所有输出数据进行适当的编码,以防止任何已成功注入的脚本在浏览器端运行。具体如下 :

(1)输入验证:某个数据被接受为可被显示或存储之前,使用标准输入验证机制,验证所有输入数据的长度、类型、语法以及业务规则。

(2)输出编码:数据输出前,确保用户提交的数据已被正确进行entity编码,建议对所有字符进行编码而不仅局限于某个子集。

(3)明确指定输出的编码方式:不要允许入侵者为你的用户选择编码方式(如ISO 8859-1或 UTF 8)。

(4)注意黑名单验证方式的局限性:仅仅查找或替换一些字符(如"<" ">"或类似"script"的关键字),很容易被XSS变种入侵绕过验证机制。

标签:审计,XSS,脚本,输出,用户,详解,数据,页面
From: https://blog.51cto.com/u_16170213/6547628

相关文章

  • 代码审计——硬编码口令/弱口令详解
    01漏洞描述根据网站所使用的第三方组件,寻找特定的弱口令或默认口令进行登录。或在代码层面寻找写死的账号口令,尝试进行登录。02审计要点对前端源代码以及系统后台代码进行全文关键字检索,如key、pass、pwd、password,查看是否存在明文显示的账号密码。03漏洞案例源码中某前端js......
  • 关于Java中ArrayList类的toArray方法详解
    先上源码:publicObject[]toArray(){returnArrays.copyOf(elementData,size);}可以看到ArrayList类的toArray()方法调用了Arrays.copyOf(elementData,size)(其中的elementData是ArrayList类中用来存储对象的数组,size是数组大小),接下来进入其内部:publicsta......
  • Crontab 命令详解
    一. Crontab介绍      crontab命令的功能是在一定的时间间隔调度一些命令的执行。1.1/etc/crontab文件      在/etc目录下有一个crontab文件,这里存放有系统运行的一些调度程序。每个用户可以建立自己的调度crontab。      如:[root@dave~]#cat/etc/cro......
  • IPv4地址详解
    ip地址格式:<网络号,主机号>IPv4地址分类:A类:网络号8位,高位0B类:网络号16位,高位10C类:网络号24位,高位110D类:多播地址,高位1110E类:保留使用,高位1111特殊地址:主机号全0:表示网络本身0.0.0.0:表示本网络上的本主机主机号全1:表示本网络的广播地址255.255.255.255:表示整个网络的......
  • Linux usb 4. Device 详解【转】
    转自:https://blog.csdn.net/pwl999/article/details/120997525文章目录1.简介2.PlatformLayer2.1PlatformDevice2.2PlatformDriver3.UDC/GadgetLayer3.1GadgetBus3.2GadgetDevice3.2.1EndpointAlloc3.2.2EndPointAccess3.2.3UDCControl3.3GadgetDriver(Con......
  • Linux mem 2.8 Kfence 详解【转】
    转自:https://pwl999.blog.csdn.net/article/details/1244949581.原理介绍Kfence(KernelElectricFence)是Linux内核引入的一种低开销的内存错误检测机制,因为是低开销的所以它可以在运行的生产环境中开启,同样由于是低开销所以它的功能相比较KASAN会偏弱。Kfence的基本原......
  • 09-操作符详解
    @目录一.算数操作符二.移位操作符三.位操作符四.赋值操作符五.单目操作符一.算数操作符1.算数操作符分类:+-*/%除了%操作符之外,其他的几个操作符可以作用于整数和浮点数。对于/操作符如果两个操作数都为整数,执行整数除法。而只要有浮点数执行的就是......
  • spring-boot-maven-plugin插件详解
    一、为什么SpringBoot项目自带这个插件当我们在SpringBoot官方下载一个脚手架时,会发现pom.xml会自带spring-boot-maven-plugin插件<?xmlversion="1.0"encoding="UTF-8"?><projectxmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2......
  • 详解 HTTPS 概念
    我们都知道HTTPS能够加密信息,以免敏感信息被第三方获取。所以很多银行网站或电子邮箱等等安全级别较高的服务都会采用HTTPS协议。HTTPS简介HTTPS其实是有两部分组成:HTTPSSL/TLS,也就是在HTTP上又加了一层处理加密信息的模块。服务端和客户端的信息传输都会通过TLS进行加密,所以传......
  • XSSFClientAnchor 设置偏移无效 setDx setDy
    一、XSSFClientAnchor设置偏移无效setDxsetDy 原因是因为setDx,setDy所需要的x值y值并不是sheet.getColumnWidth(colNo)的值和row.getHeight()的值,而是需要进行一些转换。由于转换系数比较大,所以一般设个几百上千做测试基本是没反应,看起来就像没设置一样。这里先提供一下思......