先来几个payload,我们要发现是否存在xss,首先就要输入payload,看浏览器是否执行了我们写入的js代码。一般都会有过滤,我们就需要做一些绕过姿势。
xss是跨站脚本攻击,攻击者在web页面或者服务器中插入恶意的脚本代码,当其他用户访问该页面时,服务器就会将含有恶意代码的页面响应给用户,用户在浏览器中触发恶意的脚本代码,造成攻击。
1. 盗取用户cookie,攻击者可以利用用户的cookie进行登录。
2. 获取用户浏览器中密码管理器中的密码
3. 执行弹窗广告。
4. xss和csrf组合拳:
当我们直接利用csrf做修改用户信息等操作时,网站会用一个csrf值来防御csrf,我们可以利用xss与csrf的组合拳,进行利用,首先在可以执行xss的位置,执行xss的代码,获取他的csrf值,之后再绕过csrf的防御进行攻击。
5. 执行用户可以执行的任何操作。
6. 读取用户可以访问的任何数据。
反射性:
通常攻击是一次性的,攻击者构造一个恶意链接,发送给用户,用户点击该链接,就被攻击了。如果是get请求的,直接可以将payload构造到url中。post请求的,我们需要将payload放到vps中,这个payload会获取用户的cookie,并返回给攻击者。攻击者将这个恶意链接发送给用户,用户点击之后,让用户访问我们的vps,从而造成攻击,这个和远程xxe差不多。
存储型:
我们构造的payload直接存储到了后台服务器,攻击者只需要等其他用户访问该页面,访问该页面的所有用户都会被攻击,危害范围广。
DOM型:
利用js脚本对文档对象进行编辑,修改页面dom树。
当大部分标签和属性被过滤后,我们就要通过爆破来确定哪些标签和属性没有被过滤,确定没有被过滤的标签和属性后,进行利用。
爆破时用xss备忘单做为爆破字典:https://portswigger.net/web-security/cross-site-scripting/cheat-sheet
爆破过程可以参考我写的另一个笔记:https://www.cnblogs.com/syroot/p/15884986.html
此注入会创建一个带有 ID 的自定义标签x,其中包含一个onfocus触发该alert函数的事件处理程序。URL 末尾的哈希会在页面加载后立即解析此元素,从而alert调用有效负载。
x
onfocus
alert
直接在测试点输入:#x'
我们可以爆破一下,看是否过滤了svg标签及其属性,如果没有过滤,我们就可以利用。
1)>
需要确定我们输入的内容到底在哪里,最简单的方法就是用burp抓包,发送到Repeater模块,重放攻击,查看输入字符存在位置。
我们可以尝试闭合,再构造我们的payload。
">
最常见的就是将尖括号<>进行了过滤或者编码,导致不能闭合,如果可以闭合前面的属性值,就尝试引入新的属性,来执行我们的代码。
如果是在input标签内:可以利用onmouseover属性:"onmouseover="alert(1)'Search the blog...' name=search value=""onmouseover="alert(1)">
利用伪协议:如果不能闭合原有的属性值,那就尝试利用伪协议。
"javascript:alert(document.domain)">
输出在script标签内,可以先闭合原有的script标签,再构造新的script标签,如果不闭合的话,我们构造的script标签执行不了。
(1). 直接闭合原来的值,输入我们构造的代码,
'alert(1)'
如果同时又对单引号进行了转义,那我们就构造exp时多加入一个反斜杠
\'alert(3)\'
1. 输出编码:
在html标签中,需要将特殊字符进行html实体编码
在javascript中,需要将特殊字符进行unicode转义
2. 输入验证:
验证是否是http或者https等安全协议,最好用白名单来验证,
3. 配置httponly ,限制攻击者窃取用户cookie 。
防御DOM型xss
1.避免客户端文档重写、重定向或其他敏感操作,同时避免使用客户端数据,这些操作尽量在服务端使用动态页面来实现。
2. 分析和强化客户端js代码,尤其是一些收到用户影响的DOM对象。