xss原理
什么是xss?
个人理解:xss全称跨站脚本攻击,也是一种注入,可以叫HTML注入,而注入的本质是什么,就是用户输入的数据可以被当作代码来执行。
与SQL注入一样,xss的条件也是两个:
第一,参数可控
第二,输入的参数可以被拼接到源代码中执行
那么,xss需要我偶们拼接什么呢?
SQL注入拼接的是操作数据库的SQL语句。XSS拼接的是网页的HTML代码,一般而言我们是可以拼接出合适的HTML代码去执行恶意的JS语句(总结:xss就是拼接恶意的HTML代码)
xss作用
xss能做什么?
第一,可以盗取Cookie(用的最频繁的)
第二,可以获取内网ip
第三,可以获取浏览器保存的明文密码
第四,截取网页屏幕
第五,网页上的键盘记录
xss平台
因为达到各种各样的效果需要比较复杂的代码,所以XSS平台应运而生:
xsspt.com(开放注册)
xss9.com(需要邀请码)
(XSS平台大大方便了XSS攻击,只需要引入一个平台外部链接就可以了实现功能了)
此处引入概念--->短链接
xss分类
个人理解,原则上xss应该之分为两大类
存储型xss:提交的数据成功的实现了XSS,存入了数据库,别人访问这个页面的时候就会自动触发
反射型xss:提交的数据成功的实现了XSS,但是仅仅是对你这次访问产生了影响,是非持久型攻击
还有一种类别交dom型xss,这种xss基于dom树实现,有反射型的,有存储型的,怎么理解看个人
怎么检测是否存在XSS?
一般是想办法让浏览器弹窗(alert) 最经典的弹窗语句:<script>alert(1)</script>
其他弹窗方式:
javascript:alert(1) (经典代码<a href=javascript:alert(1)>test</a>) Javascript实际上是一个伪协议
伪协议不同于因特网上所真实存在的协议,如http://,https://,ftp://,
伪协议只有关联应用能够用,比如 php:// tencent://(关联QQ)
javascript:伪协议实际上声明了URL的主体是任意的javascript代码
事件也是可以执行JS的:
例如: οnerrοr=alert(1) 在加载文档或图像时发生错误。
该句的意思就是在加载文档或图像时发生错误然后会执行alert(1)
类似的事件有很多
常用的有 onerror、onload(成功加载执行)oninput (有输入框,输入的时候触发)
存储型XSS
概念
提交的数据成功的实现了XSS,存入了数据库,别人访问这个页面的时候就会自动触发
xss实现
此靶场使用掌控安全学院公开课靶场,需要的可以去腾讯课堂搜索掌控安全,报名课程
测试浏览器建议不要使用谷歌,此处我用的是火狐。打开漏洞所在url,进行测试,发现页面是一个留言板,如下图
由于不确定什么位置存在xss,我们可以再所有框框里面全部插叙相关语句,payload:<script>alert('test')</script>,成功弹窗,如下图
打开xss平台:https://xss9.com
创建新项目,项目名称为test,选择默认模块设置如下
点击生成,上面的部分数据js代码,链接和payload在下方
使用payload进行留言,如下图
过一段时间,去xss平台查看项目,看看是否打到管理员cookie,如下图
尝试通过cookie进入后台,打开后台页面,如下
F12修改cookie值,成功登录
反射型XSS
概念
提交的数据成功的实现了XSS,但是仅仅是对你这次访问产生了影响,是非持久型攻击
xss实现
反射型xss就很多了,随便从网上找一个即可,在这里选择了一个事件型作为演示,如下图
看到注入框,尝试搜索111",观察页面变化,发现双引号消失,打开源码,发现双引号被代入源码执行,如下
直接尝试,onclick事件型弹窗,111"οnclick=alert(1)///,成功执行如下图
关于反射型,XSS反射型攻击,恶意代码并没有保存在目标网站,通过引诱用户点击一个链接到目标网站的恶意链接来实施攻击的。
一般需要与其他漏洞组合才能形成危害
DOM型XSS
什么是DOM型xss?
DOM—based XSS漏洞是基于文档对象模型Document Object Model,DOM)的一种漏洞。DOM是一个与平台、编程语言无关的接口,它允许程序或脚本动态地访问和更新文档内容、结构和样式,处理后的结果能够成为显示页面的一部分。DOM中有很多对象,其中一些是用户可以操纵的,如uRI ,location,refelTer等。客户端的脚本程序可以通过DOM动态地检查和修改页面内容,它不依赖于提交数据到服务器端,而从客户端获得DOM中的数据在本地执行,如果DOM中的数据没有经过严格确认,就会产生DOM—based XSS漏洞。
什么是DOM?
dom就是一个树状的模型,你可以编写Javascript代码根据dom一层一层的节点,去遍历/获取/修改对应的节点,对象值。
每个载入浏览器的 HTML 文档都会成为 Document 对象
Document 对象使我们可以从脚本中对 HTML 页面中的所有元素进行访问
document.write() 他可以接受native编码值
xss实现
在存在dom型xss的位置我们可以使用native编码来绕过waf防护,打开靶场
经过测试发现,这个站还接受get传参,如下图
尝试xss,发现被狗拦截,如下
于是乎,打开源码,看看接受传参方式,发现了document.write() 函数
打开站长工具对xss代码进行编码,
成功弹窗,如下图
扩展
绕过简单的xss防护
针对事件型漏洞,一般网站可能会对双引号进行实体化编码,这个时候如果没有dom型,或者单引号不能使用的情况下,还是真的不好绕过
针对于黑名单过滤,总是过滤不全的,比如过滤了img,还有input,还有div等等
过滤了onclik、onmouseover,可以尝试比较冷梦的事件触发onmouseenter
过滤了小括号,可以尝试单引号,过滤了单引号可以尝试反引号
过滤了alert,可以尝试confirm和prompt
有过一次测试,网站在输入的双引号前面加了反斜杠,但并没有被转义的情况
还有就是大小写、双写绕过之类的
引入知识
如果网站设置了浏览器禁止获取cookie怎么办?
针对通过xss大cookie的情况,越来越多的网站开启了防护
了解httponly属性
Cookie都是通过document对象获取的,我们如果能让cookie在浏览器中不可见就可以了,那HttpOnly就是在设置cookie时接受这样一个参数,一旦被设置,在浏览器的document对象中就看不到cookie了。而浏览器在浏览网页的时候不受任何影响,因为Cookie会被放在浏览器头中发送出去(包括Ajax的时候),应用程序也一般不会在JS里操作这些敏感Cookie的,对于一些敏感的Cookie我们采用HttpOnly,对于一些需要在应用程序中用JS操作的cookie我们就不予设置,这样就保障了Cookie信息的安全也保证了应用。
如何绕过?
利用html5的CORS特性绕过httponly限制,但是能不能打到cookie,好像是不能,只能实现会话劫持
参考文章:http://www.th7.cn/web/html-css/201703/219374.shtml
参考文章:https://www.oschina.net/translate/xss-gaining-access-to-httponly-cookie