10.XSS攻防与绕过
一.XSS获取cookie
# JS获取当前页面cookie
<button onclick="alert(document.cookie)">点我有惊喜</button>
二.XSS的攻击方式
1.获取cookie,实现越权,如果是获取网站管理员的cookie,也可以叫越权(尽快注销账号,让cookie失效)。
2.钓鱼网站,模拟真实网站,获取用户信息(用户名密码),再跳转真实网站。
3.执行JS代码,用于DDOS攻击别的目标站点。
4.恶意链接,或者直接将网页植入到站点的<iframe>标签中。
三.XSS的防御手段
1.使用函数 htmlspecialchars() 把括号内的特殊字符转换成实体编码
$content = htmlspecialchars($_GET['content']);
2.正则表达式或字符串判断
实体字符编码如果输出在事件属性中,还是有可能存在绕过的可能性。比如在a标签中,<a href=javascript:alert(1)>,
这种形式,没有尖括号也没有引号,就有可能被绕过。如果存在类似这种的情况,需要在链接属性中加上http://或
https://的正则表达式来限制。
四.XSS的绕过方式
1.绕过过滤
(1)前端限制,直接用F12开发者选项修改JS即可,或者用burpsulte绕过。
(2)字符过滤,双写,大小写绕过,通过注释符绕过,也可以通过换行符绕过。
(3)HTML实体转换:
字符实体是用一个编号写入HTML代码中来代替一个字符,在使用浏览器访问网页时会将这个编号解析还原为字符以供阅读。
javascript:alert("Hello")编号为:
十六进制:
2.绕过编码
明确浏览器解析的机制,明白机制后,选择对应的编码
3.其他技巧
(1)输出标签间的情况:测试<>是否被过滤或转义,若无则直接<img src=1 onerror=alert(1)>
(2)输出在script标签内:我们需要在保证内部JS语法正确的前提下,去插入我们的paylod。
如果我们的输出在字符串内部,测试字符串能否被闭合。如果我们无法闭合包裹字符串的引号,
这个点就很难利用了。可能的解决方案:可以控制两处输入且\可用,存在宽字节