文章目录
XSS简介
跨站脚本攻击(Cross Site Scripting),为了不和层叠样式表(Cascading Style Sheets )的缩写混淆, 故将跨站脚本攻击缩写为XSS。XSS如果想要深入使用需要有一定前端JS的基础,XSS的原理就是想HTML代码中插入恶意脚本。XSS攻击在很多时候目的是为了获取用户的cookie信息。cookie是web服务器保存在用户本地的一些信息,这些信息内可能包含用户的账户信息,相当于一张通行证,获取到cookie后可以进行会话劫持。
测试环境
本地测试环境需要用到DVWA
,他的配置我在SQL注入的时候就已经提到过,这里就不做赘述,其中的XSS做测试,我们开始可以先把难度调到简单。
还有一个在线XSS环境
XSS工具步骤与分类
XSS用到的一些HTML和JS
使用XSS工具之前最少需要对HTML和JS有简单的了解,至少知道一下的一些内容。
HTML表单文本框介绍
XSS最简单和直接的方法就是从HTML页面中的表带文本框注入,我们需要了解一些HTML的特性。
<input type='text' name='' value=''>
这是最简单的一段文本框input属性众多,想要详细了解可以去菜鸟教程input标签讲解。这里就对一些XSS攻击会用到的的一些属性进行讲解。
<script></script>
脚本标签,其中可以运行JavaScript脚本。如果我们想要JavaScript脚本能正常运行,那么就需要让其能在这个标签之中。
想要运行JavaScript脚本还有一种方法,就是将其放在javascript:
后,这是javascript伪脚本,这种写法只能用于一些链接具体用法之后会提到。(我当前对JavaScript也并不是很了解,如果这里出现了一些错误可以对我进行一些反馈,我会及时改正)
XSS测试使用的JS | 作用 |
---|---|
alert() | 用于显示带有一条指定消息和一个确认按钮的警告框。(真是攻击一般都会静默进行,这里使用此方法目的是为了演示效果。) |
location.host | host 属性是一个可读可写的字符串,可设置或返回当前 URL 的主机名称和端口号。 |
location.href | href 属性是一个可读可写的字符串,可设置或返回当前显示的文档的完整 URL。 |
location.search | 获取url中的参数。(url中 问号? 后面的内容) |
location.replace(newURL) | 可以是一个新的url来代替此url(类型与a标签进行页面跳转) |
document.documentURI | 获取URL地址 |
document.cookie | 返回当前cookie |
document.domain | 返回当前域名 |
document.write() | 向文档写 HTML 表达式 或 JavaScript 代码。 |
document在XSS攻击时候会经常用到,可以在菜鸟教程HTML DOM Document 对象上具体了解一下 下图为XSS演示,下方会详细讲解如何进行XSS攻击,还有如何绕过一些简单的XSS攻击的防御措施
上图所示JavaScript代码
<script>
document.addEventListener("mouseover", 移入);
document.addEventListener("click", 点击);
document.addEventListener("mouseout", 移出);
function 移入() {
document.getElementsByTagName("p")[0].innerHTML += "鼠标移入!<br>"
}
function 点击() {
document.getElementsByTagName("p")[0].innerHTML += "鼠标点击了!<br>"
}
function 移出() {
document.getElementsByTagName("p")[0].innerHTML += "鼠标移出!<br>"
}
</script>
探测xss
这里我们使用DVWA做为演示(环境并不影响,在线也同样)首先我们先找页面中是否有输入框,如果存在输入框,那么我们就可以尝试随机输入一些内容,然后观察输入框是否会有一些输入限制,然后观察我们输入的内容会出现在哪里。然后可以根据不同的出现位置,做一些不同的处理。
反射型XSS
反射型XSS又称非持久性XSS,这种攻击往往具有一次性
攻击者通过邮件等形式将包含XSS代码的链接发送给正常用户,当用户点击时,服务器接受该用 户的请求并进行处理,然后把带有XSS的代码发送给用户。用户浏览器解析执行代码,触发XSS漏洞
这种攻击在服务器端很难察觉,但攻击实施难度较大,很多时候都需要利用社会工程学之类的操作诱导用户进行一些指定的点击才能实施。
针对一些毫无XSS防御措施的网站在输入框中直接输入用<script></script>
标签包含的js语句即可进行注入。比如说<script>alert(document.domain)</script>
。
常用的反射型XSS攻击方法
下列测试使用XSS在线测试攻击网站进行测试攻击。
闭合标签
有时候我们输入的内容会出现了input标签的type属性中,如在线测试网站的第二题Stage #2。
这时候我们就需要想办法让标签提前闭合,让我们的XSS攻击出现在标签以外自成标签
经过控制台我们可以很容易的分析出闭合标签只需要在其中添加">
即可,让其变成"><script>alert(document.domain)</script>
使用下拉菜单
如果没有找到输入框,或者发现输入框做了很强的防御,这时候我们可以找找下拉菜单对下拉菜单进行攻击。使用三题
首先还是需要在控制台中找到下拉菜单标签,然后将下拉菜单中输入的内容在控制台中修改。
Japan</option><script>alert(document.domain)</script>
这种方法成功攻击了第三题,但是第四题却无效,
使用隐藏输入框
我们研究一下第四题发现输入框和下拉菜单使用我们之前的方法攻击都无效,然后在检查一遍源码发现了其中有一个隐藏的输入框,我们将其隐藏属性type="hidden"
修改成文本输入type="text"
然后发现了一个新的输入框,这里输入了一下"><script>alert(document.domain)</script>
解除输入框限制
有些时候我们会发现输入框对输入的字数是有一定的限制的,比如在<input>标签中使用了maxlength="15"
属性进行了限制,比如说第五题,这时候处理方法也很简单,只需要修改限制,或是删除限制属性即可,接触限制之后我们就可以愉快的使用"><script>alert(document.domain)</script>
进行攻击了。
使用HTML事件启动攻击
常用的HTML事件有onclick
(鼠标点击事件)onmouseover
(鼠标悬停指定地方时)onmouseout
(鼠标移出指定区域时),更多的事件可以去菜鸟教程HTML事件 上观看
先来常规攻击,发现我们的输入会经过一些转义,无法形成新的标签,那么我们可以让通过一些事件执行我们制定的js
这时候我们就可以尝试使用事件触发js,比如" onmouseover= "alert(document.domain)
,当鼠标移入输入框就会触发js命令
有时候前端也会写一些逻辑来扰乱XSS攻击,比如第七题测试输入的时候我们会发现,我们在输入框中的空格会被做一些处理,空格之后的会被当成一个属性,这时候我们只需要在适当地地方加入一个空格,就可以添加我们所需的HTML事件123 onmouseover=alert(document.domain)
JavaScript伪代码
我们除了使用<script></script>
让JS代码执行以外还有一种伪代码的方式也可以出发JS代码javascript:JS代码
,不过这种伪代码需要在URL中才能被触发。比如第八题中,我们输入的内容就会变成一个连接。javascript:alert(document.domain)
XSS攻击防御手段绕过
在线XSS攻击网站的跳题方法,做了这么多题我们发现只要触发了alert(document.domain)
,我们就能获得下一题的入门,那么我们只要找一个标签中添加onmouseover="alert(document.domain)"
,然后把鼠标移动上去,那就可以触发下一题了。(这个方法也就是这个XSS攻击测试网站中有效)
将这个跳题的方法原因是,第九题牵扯到的utf-7基本没地方用,十二题是ie8的双引号漏洞,十三题用到了ie的一个css的漏洞,十四题用到了ie的css出发js的一个漏洞…ie安全漏洞太多了,这里就不演示了,这种老古董也没人用了,最后几题都是ie的漏洞,这里都不会说了
双写绕过
第十题我们发现会过滤domain
这个单词,我们可以尝试双写domain
来绕过此过滤比如"><script>alert(document.dodomainmain)</script>
编码绕过
最常用的编码== tab制表符html十进制编码(实体编号)==,特别是出行一些单词过滤(黑名单策略)时候可以在被过滤的单词中添加	
来绕过过滤,但只有在URL中才会变成制表符,所以我们需要配合javascript来想法让他出现了URL中,比如第十一题可以用此方法来绕过"><a href="javasc	ript:alert(document.domain)">xss</a>
HTML字符实体绕过
HTML字符实体
有时候黑名单过滤会过来尖括号,引号,冒号等特殊符号<>"":
等,这时候我们可以采用实体编码,虽然实体编号只有URL中才能正确转义,但实体编码大部分地方都可以正确转码,比如说可以用"><script>alert(document.domain)</script>
,这个我就是提一下,测试攻击目标里没这样的题
双斜杠+16进制绕过
javascript的十六进制需要使用\x
作为开头,如果发现\x
失效了,那么可能是\起到了转义字符的作用,可以尝试\\x
作为十六进制的开头。如第十五题,如何转为为16进制,比如>的ASCII码的十六进制为3E,那么>就可以写成\x3E
ASCII十六进制对照网站<script>alert(document.domain)</script>
写成十六进制可以为\\x3cscript\\x3ealert(document.domain);\\x3c/script\\x3e
Unicode绕过
常用的Unicode字符集,Unicode需要用\u
作为开头,同样为了防止转义可以用\\u
开头将<script>alert(document.domain)</script>
几个符号转成
>
的Unicode为U+003C
,U+在js里需要改成\u开头,所以在js里就成了\u003c
Unicode为\\u003cscript\\u003ealert(document.domain);\\u003c/script\\u003e
如十六题
利用IE特性
IE浏览器已经被放弃多年,安全漏洞重点,但已经很少有人在使用了,ie5之后有一些漏洞可以利用css,ie8有个漏洞是会把``(键盘左上角ESC下面那个键打出来了,不是单引号)当成一个双引号"使用。IEtester是一个模仿各个版本IE浏览器的工具,如果有需要可以执行下载使用。Windows10系统中自带的IE为IE11,相较于之前的版本已经修复了大量安全漏洞,但极不建议大家日常使用IE浏览器。
存储型XSS
存储型XSS又称持久型XSS,攻击脚本存储在目标服务器的数据库中,相较于反射型XSS,存储型XSS更容易在服务端被发现,但对于普通用户来说具有比反射型XSS更强的隐蔽性。
攻击者在论坛、博客、留言板中,发帖的过程中嵌入XSS攻击代码,帖子被目标服务器存储在数 据库中。当用户进行正常访问时,触发XSS代码。
简单攻击
在这种可以留言的地方一旦注入XSS攻击,那么我们每次访问都会触发此攻击,攻击者大可以去做一些隐蔽的攻击,比如让你的cookie自动发给攻击者指定的地址中。<script>alert(document.domain)</script>
模拟社区进行攻击
个人搭建的模拟攻击网站个人搭建的供萌新测试XSS攻击测试的社区,请不要恶意破坏。咱就是个一核两兆的服务器,经不起大表哥们折腾的。这是网上找的一个大佬写的开源社区的源码,XSS防护等级还是蛮高的,在发评论的地方如果很难找到XSS攻击入口,我们可以尝试在其他地方寻找,比如说私信等地方。
"><details open ontoggle=eval("\x6a\x61\x76\x61\x73\x63\x72\x69\x70\x74\x3aalert('xss')")><"
DOM型XSS
DOM型XSS全称Document Object Model,使用DOM动态访问更新文档的内容、结构及样式
服务器响应不会处理攻击者脚本,而是用户浏览器处理这个响应时,DOM对象就会处理XSS代 码,触发XSS漏洞
手动寻找漏洞较为繁琐,有一个自动化的XSS漏洞寻找攻击叫beef
,是kali内置的一个工具,有需要的可以尝试使用