什么是XSS跨站点脚本攻击
攻击者在被攻击的web服务器网页中嵌入恶意脚本,通常使用js编写的恶意代码,当用户使用浏览器访问被嵌入恶意代码的网页时,恶意代码将会在用户的浏览器上执行。XSS其实也是注入的一种,前端注入。(用户输入的传参会被当作前端代码执行)
前端代码:HTML+CSS+JS
XSS属于针对客户端的攻击,受害者最终是用户。
网站管理人员也属于用户之一,攻击者可以通过XSS假冒管理员身份对网站实施攻击。
如果我们想要进入管理员后台
- 通过后台地址,输入正确的账号。
- 通过cookie(获得了管理员用户的权限)不用管理员账号密码进入后台。(这就是利用了XSS)
XSS攻击的危害
盗取用户cookie
修改网页内容
网站挂马
利用网站重定向
XSS蠕虫
怎么检测是否存在XSS
一般是让浏览器弹窗的经典语句<script>alert(1)</script>
xss触发原理
原理:
- 请求网站
- 网站返回前端代码
- 浏览器根据前端代码执行解析
- 渲染出好看的前端代码
用户输入的传参会被当作前端代码执行(被浏览器执行),什么情况你西的东西会被当作JS执行?
- 标签触发:
<script>alert(1)</script>
,弹窗是用来证明XSS是否存在的关键。 - 通过伪协议触发:
<a href=javascript:alert(1)>test</a>
伪协议不同于因特网上所真实存在的协议,如http://,https://.ftp://
,伪协议需要点击触发。伪协议只有关联应用能够用 比如php:// tencent://(关联QQ) javascript:伪协议实际上声明了url的主体是任意的javascript代码。 - 事件触发:例如:
<img src='#' onerror=alert(1) />
在加载文档或图像时发生错误。该句的意思就是在加载文档或图像时发生错误执行alert(1) 常用的事件触发还有onload(加载成功时触发)
,oninput(输入框输入时触发)
XSS攻击分类
反射型XSS特点
反射性XSS也被称为非持久性XSS,这种攻击方式无法将恶意代码保存到网站中,而只对当前URL链接生效,因此它需要用户自行去触发。
反射性XSS通常出现在网站的搜索栏、用户登入口等地方。
存储型XSS特点
存储型XSS攻击是直接将XSS语句插入到网站的正常页面中(通常都是留言板),用户只要访问了这些页面,就会自动执行其中的XSS语句。(你的传参会进入数据库)
DOM型XSS特点
DOM型属于反射型的XSS的一种,DOM—XSS是通过URL传入参数去控制触发的,反射性XSS实际上是包括了DOM-XSS,但关键点是通过URL控制了页面的输出,(DOM—XSS也类似,只是因为输出地点不同而导致了结果不一样)
在网站页面中有许多页面的元素,当页面到达浏览器时浏览器会为页面创建一个顶级的Document object文档对象,接着生成各个子文档对象,每个页面元素对应一个文档对象,每个文档对象包含属性、方法和事件。可以通过JS脚本对文档对象进行编辑从而修改页面的元素。也就是说,客户端的脚本程序可以通过DOM来动态修改页面内容,从客户端获取DOM中的数据并在本地执行。基于这个特性,就可以利用JS脚本来实现XSS漏洞的利用。
窃取Cookie:
窃取Cookie的XSS代码很复杂。我们一般是去XSS平台生成插入。
KeepSession:Cookie是有时效性的。
XSS的过滤方法
进行转义实体编码输出,加标签,正则匹配替换
存储型XSS
存储型XSS可能存在于任何可以插入数据库的地方。比如:用户注册的页面,留言板,上传文件的文件名,(管理员可见的)报错信息。
除此之外还可能存在日志等不与数据库交互的地方。
见框就插是一种方法,但是不是唯一方法。
用户的输入一般控制得很严格,系统的获取一般控制得不严格。(系统得获取包括有收到邮件,获得xx信息)
Dom Based XSS
DOM-based XSS漏洞是基于文档对象模型(Document Object Model,DOM)的一种漏洞。DOM是一个与平台、编程语言无关的接口,它允许程序或脚本动态地访问和更新文档内容、结构和样式,处理后的结果能够成为显示页面的一部分。Dom 中有许多对象,其中一些是用户可以操作的,如url,loacation,referter等。客户端的脚本程序可以通过DOM动态地检查和修改页面内容,它不依赖于提交数据到服务器端,而从客户端获得dom中的数据在本地执行,如果DOM中的数据没有经过严格确认,就会产生DOM-based xss漏洞。
DOM就是一个树状的模型,你可以编写js代码根据dom一层一层的节点,去遍历/获取/修改对应的节点,对象,值。(通过JS去对网页进行修改,变化执行)
每个载入浏览器的html对象,都能被当作document对象。Documemt对象使我们可以从脚本中对HTML页面中的所有元素进行访问。
Document访问方法
- body:提供对
<body>
元素的直接访问,对于定义了框架集的文档,该属性引用最外层的<frameset>
。 - cookie:设置或返回了与当前文档有关的所有cookie
- domain:返回当前文档的域名
- Lastmodified:返回文档被最后修改的日期和时间。
- referrer:返回载入当前文档的文档url
- title:返回当前文档的标题
- URL:返回当前文档的URL。
在后端不处理的情况下,因为JS触发的XSS就是Dom型XSS。
Document对象方法:
Document.write() 输出内容
innerHTML()改变内容
eval()内容执行
- close():关闭用document.open()方法打开的输出流,并显示选定的数据。
- getElementByid():返回对拥有指定id的第一个对象的引用。
- getElemeentsByname():返回带有指定对象名称的对象集合。
- getElementsByTagName():返回带有指定标签名的对象集合。
- open():打开一个流,以收集来自人恶化document.write()或document.writeln()方法的输出。
- write():向文档写html表达式或者JS代码
- writeln():等同于write()方法,不同的是在每个表达式之后写一个换行符。
tips:document.write() 可以接受native编码值。