xss的攻击于防御
攻击的利用方式
1)获取cookie,实现越权,如果是获取到网站管理员的cookie,也可以叫提权。注意尽量尽快退出账号,删除session,让session失效
2)钓鱼网站,模拟真实的网站,获取用户信息(用户名密码等),先告诉账号密码不正确,再跳转到真实网站
3)执行js代码,用于DDOS攻击别的目标站点,在站点A植入xss代码,向站点b发起请求,当用户量大的时候,实现DDOS攻击
4)恶意链接让用户点击,或者直接将网页植入到站点的标签中
将上述代码以短链接(短网址)的方式发送(这也是隐藏链接的方式)
5)当用户点击并访问到恶意站点:,
<a href=“http://xxx/xss.html”>,在xss.html的网页中,可以执行js代码
一方面提供正常的网站功能,另一方面隐藏着DOS或挖矿代码让用户浏览器执行
2、测试方法(攻击方式)
1)反射型xss测试的时候,可以使用扫描器,或者burp进行fuzz
2)存储型xss测试的时候,可以直接把字典中的payload都塞进去,根据弹窗的编号,就知道时哪个。
但是这个容易发现,所有可以试探一下特殊字符是否被过滤。(会被存到数据库)
3)DOM型xss测试,主要以阅读js代码为主。在页面中找输入点的相关dom节点,
在开发者选项中搜索一下根据搜索结果去看是否被相关的js操作,
如果有js操作,就去看我们的输入操作后输出在哪个地方,就按照常规的xss思路进行构建。
<input type="submit" value="<img src=1 οnerrοr=alert(1)"/>
或<input type="botton" value="" οnclick=alert()"/>
扫描器,要么直接对一个URL地址进行xss的payload攻击上存在xss,
另一个思路是对整个网站使用爬虫手段爬取url地址,让后再批量扫描(扫描的核心就是字典)
3、防御手段
1)做实体字符编码,htmlspecialchars(),函数功能就是把特殊符号,比如尖括号,引号转换成实体编码,
这样就不会在输入的地方去干扰页面源码。经过实体字符编码后,用户输入的特殊符号在源代码中就变成编码,
但是在页面输出的时候,还是会显示成原来的样子。当输出的位置在元素内容里面,并且被实体编码后,基本上就没有XSS的可能了。
$content = htmlspecialchars($_GET['content']);
2)正则表达式或字符串判断
实体字符编码如果输出在事件属性中,还是有可能存在绕过的可能性,比如在a标签中,
没有尖括号也没有引号,就有可能被绕过,
如果存在类似这种的情况,需要在链接属性中加上http://或https://的正则表达式来限制。
XSS的绕过方式
1.绕过过滤
1)前端限制,直接用F12开发者选项修改js或html代码即可,或者用burpsuite绕过。
2)字符过滤,双写,大小写绕过,通过注释符绕过,也可以通过换行符绕过。
3)HTML实体转换;
字符实体是用一个编号写入HTML代码中来代替一个字符,在使用浏览器网页时会将这个编号解析还原为字符以供阅读。
javascript:alert("hello")编码为:(使用burp中的docode继续转换)
2、绕过编码
明确浏览器解析的机制,明白机制后,选择对应的编码。
3、其他技巧
1)输入标签间的情况:测试<>是否被过滤或转义,若无则直接
2)输出在script标签内,我们需要在保证内部js语法正确的前提下,去插入我们的payload。
如果我们在输出在字符串内部,测试字符串能否被闭合。如果我们无法闭合包裹字符串的引号,
这个就很难利用了,可能的解决方案:可以控制两处输入且\可用、存在宽字节。
3)输入在HTML属性内:查看属性是否有双引号包裹、没有则直接添加新的事件属性;
有双引号包裹则测试双引号是否可用,可用则闭合属性之后添加新的属性里以HTML实体编码的方式引入任意字符,
从而方便我们在事件属性里以JS的方式构造payload。