因为浏览器发现你请求了某个资源后,会自动把你未过期的 Cookies 加入到请求头里。也就是说,即使是在其他网站里,发送了添加管理员的请求,会自动把你登陆后的 Cookies 加入到请求里,服务端会认为是你本人触发的(因为 Cookies 校验成功)
至于为什么这里 Cors 没有起到作用,是因为这种方式,请求后是拿不到任何返回信息的,所以 Cors 并不会拦截。如果你使用 Ajax来请求,是肯定会被拦截掉,因为 Ajax 请求是可以拿到返回信息,所有会被 Cors 拦截掉。
那除了 form 标签,还有什么方法可以进行攻击呢?在 w3c cors 规范中,有这么一句话:
A simple cross-origin request has been defined as congruent with those which may be generated by currently deployed user agents that do not conform to this specification. Simple cross-origin requests generated outside this specification (such as cross-origin form submissions using GET or POST or cross-origin GET requests resulting from script elements) typically include user credentials, so resources conforming to this specification must always be prepared to expect simple cross-origin requests with credentials.
Web安全概览
前言
介绍一下
Web
端相关的攻击手法及原理,包括但不限于前端
后端
运维
本文后端语言将使用
PHP
,因为经过对比,PHP
作为后端代码演示,是最显而易见的。以及本文介绍的所有攻击手法都将提供
Docker
靶场,方便后续大家自行研究、测试。此篇文章是由我之前写的安全文章进行了部分汇总、优化及添加。如果大家比较感兴趣,可以去Freebuf Black-Hole看我之前写的文章。
前端
XSS
XSS
本质就是在别人的浏览器里执行你的JavaScript
代码,其他都是一种辅助手段。DOM XSS
利用JavaScript操作DOM的特性,来做到攻击
经常出现的情况:前后端分离架构
很多开发者,都知道不到万不得已不要使用
eval
函数,不使用的原因其中一点就是不安全,但是难道不使用eval
就不会有安全问题么?答案是否定的。见下面的代码:
为了更好的说明,我这里简单的把作用说明一下:
是不是觉得这段代码没什么问题。毕竟有
new URL()
这种浏览器内置函数帮我们做了过滤。OK,那我们就要去攻破这个函数的判断。下图为
URL
接口规范中的列表:我们可以看到
hello:world
是符合规范的。而且hello:
正好又是JavaScript
里的标记
,类似于C语言中的goto
。那我们更改url为:http://baidu.com/#javascript:alert(1)
。则会成功触发漏洞。Docker 靶场
后端
反射XSS
因为前/后端没有做好相对应的过滤,导致的问题
经常出现的情况:MVC架构
因为像
MVC
这种架构,其实是在后端语言中编写前端代码,在访问url的时候,会先由后端根据请求去构造前端页面,再返回前端源码到浏览器端,而这个过程中,如果出现了XSS漏洞,又因为后端参与其中,所以我们一般认为这是反射型XSS
。见下面的 PHP 代码:
可以看到,这段代码将会获取url参数中的
bg
来获取背景颜色。乍一看,好像没什么问题。但是要知道其中$bg
是可控的。那我们只需要把里面的标签闭合掉就行。见下面:http://127.0.0.1:8082/?bg=123' onclick='alert(1)
上面的代码放在
bg
参数里,那代码就变成了\<div style='width: 120px; height: 120px; background-color:#
123' onclick='alert(1)
'>我是一只小方块\<\/div>Docker 靶场
存储型XSS
在反射XSS的基础上,做了一步 入库的操作
见下面的代码:
这段代码看起来是没有任何问题的,因为我们已经对
content
参数做了进一步的编码过滤。那即使我们写入了HTML标签等代码,也会被转码,假如我们提交的内容为
<script>alert(1)</script>
那在数据库的里表现就会变成:<script>alert(1)</script>
那难道没有办法绕过去么?答案当然是可以。
可以看到,这段代码不止把内容入库了,还把用户的IP也入库了。那问题就出现了,
CLIENT-IP
、X_FORWARDED_FOR
是用户可控的。只需要安装 ModHeader 这个浏览器插件即可如图:修改后,再去重新提交一次,就会发现已经成功入库了,如图:
Docker 靶场
CSRF
CSRF可以理解为是一种借刀杀人的手法,一般出现在表单提交里。最常见的是出现的开源项目里,比如各类CMS。
见上面代码,此代码存在于管理员后台里。用于添加管理员账号。并且
addAdminUser.php
里是有对当前用户的Cookies
做了校验,非管理员账户不能添加。但是这个表单里没有
验证码
、Token
,以及addAdminUser.php
里没有做referer
来源校验。就会出现
CSRF
漏洞。因为浏览器发现你请求了某个资源后,会自动把你未过期的
Cookies
加入到请求头里。也就是说,即使是在其他网站里,发送了添加管理员的请求,会自动把你登陆后的Cookies
加入到请求里,服务端会认为是你本人触发的(因为Cookies
校验成功)至于为什么这里
Cors
没有起到作用,是因为这种方式,请求后是拿不到任何返回信息的,所以Cors
并不会拦截。如果你使用Ajax
来请求,是肯定会被拦截掉,因为Ajax
请求是可以拿到返回信息,所有会被Cors
拦截掉。那除了
form
标签,还有什么方法可以进行攻击呢?在w3c cors
规范中,有这么一句话:这里没有说的特别细,我补充了一下,大致意思是说,使用
GET
或POST
进行表单提交时,亦或者使用一些HTML
标签引起的GET
请求,如:a
、img
等,基本上都会携带用户凭据(Cookies)Docker 靶场
SSRF
SSRF
本质其实和CSRF
相差不大。只是CSRF
面向的是客户端的用户,而SSRF
面向的是服务端本身。这种漏洞一般出现于:会访问并返回用户可控的资源的功能上。
例如:
在线查看网站源码
、获取用户发链接的title
、在线翻译网页
等可以看到,这里没有对用户的输入做任何的过滤,导致用户可以直接输入
http://192.168.1.2
等url,来访问内网资源,因为访问资源的是服务端本身,而服务端本身也是可以访问同局域网的资源的。Docker 靶场
JSON Hijacking
JSON Hijacking
其实本质和CSRF
原理一样这个攻击手法和
CSRF
最大的不同,就是JSON Hijacking
在CSRF
的基础上,又利用了JSONP
的特性如果有恶意攻击者,写了一个页面,并且也在网页里加入了
<script src="http://xxx/json.php?callback=getInfo"></script>
根据上文提到的
w3c cors
规范中,如果用户事先已经登陆过了,再打开恶意攻击者发的链接,那么攻击者就可以获取一些本不应该获取的敏感信息。Docker 靶场