Reference
CSRF
定义
CSRF(Cross-site Request Forgery,跨站请求伪造)是一种针对网站的恶意利用。
CSRF攻击可以利用用户已经登陆或已经授权的状态,伪造合法用户发出请求给受信任的网点,从而实现在未授权的情况下执行一些特权操作。
攻击流程
- 用户登录网站,产生
cookie
- 用户未登录出网站,访问攻击者构建的恶意网站,攻击者获取
cookie
- 攻击者利用
cookie
获得授权
利用条件
- 用户成功登录相关的网站系统,同时能够执行相应的授权功能。
- 诱导目标用户访问了攻击者构建的恶意URL。
- 新的请求提交无需重新验证身份。
危害
CSRF攻击的危害主要来自攻击者以受害者的名义发送邮件、信息、盗取账号密码、购买物品等造成受害者的个人隐私泄露、重要资料泄露等,一句话概述就是CSRF的危害取决于受害者,受害者能够做的内容,那么攻击者同样也可以做,但是攻击者是以受害者的身份去做。
分类
GET型
get型主要是通过URL恶意链接诱导用户点击,当用户处于访问网站的过程中,同时用户又点击了这个链接,那么就会触发修改。
比如当用户正在修改密码,比如修改的URL:/user.php?id=1&password=11111,意思就是用户把密码修改为1111,若攻击者把URL修改为URL:/user.php?id=1&password=123456789,然后通过社工手段进行诱导点击我们修改后的链接,那么当用户访问这个链接后就会把密码修改为123456789。
POST型
同样是修改密码但是这次在URL中不会显示密码,而且是在post中,那么当攻击者对该网站进行抓包分析整个数据包的构造,然后把相关的内容修改为其他用户的相关参数,然后同样是诱导用户去点击我们精心准备的WEB界面,那么当点击的时候就会自动进行提交,使其密码再次修改。
防御
验证HTTP Referer 字段
在http中存在referer字段,它是用来记录http请求的来源地址,通常情况下访问一个网站请求是来自同一个网站的,但是如果攻击者想要实施CSRF攻击,那么攻击者只能在他自己的网站构建请求,当用户访问的时候访问的referer是指向黑客自己的网站地址。
所以若想要防范CSRF攻击,网站只需要对每一次的操作都进行referer验证,若以bank.example 开头的域名,说明是自己的请求,若是其他的域名则可以判断可能存在CSRF攻击。
在请求地址中添加token
并验证
CSRF 攻击之所以能够成功,是因为黑客可以完全伪造用户的请求,该请求中所有的用户验证信息都是存在于 cookie 中,因此黑客可以在不知道这些验证信息的情况下直接利用用户自己的 cookie 来通过安全验证。
要抵御 CSRF,关键在于在请求中放入黑客所不能伪造的信息,并且该信息不存在于 cookie 之中。可以在 HTTP 请求中以参数的形式加入一个随机产生的 token,并在服务器端建立一个拦截器来验证这个 token,如果请求中没有 token 或者 token 内容不正确,则认为可能是 CSRF 攻击而拒绝该请求。
在HTTP头中自定义属性并验证
这种方法也是使用 token 并进行验证,和上一种方法不同的是,这里并不是把 token 以参数的形式置于 HTTP 请求之中,而是把它放到 HTTP 头中自定义的属性里。通过 XMLHttpRequest 这个类,可以一次性给所有该类请求加上 csrftoken 这个 HTTP 头属性,并把 token 值放入其中。
这样解决了上种方法在请求中加入 token 的不便,同时,通过 XMLHttpRequest 请求的地址不会被记录到浏览器的地址栏,也不用担心 token 会透过 Referer 泄露到其他网站中去。
然而这种方法的局限性非常大。XMLHttpRequest 请求通常用于 Ajax 方法中对于页面局部的异步刷新,并非所有的请求都适合用这个类来发起,而且通过该类请求得到的页面不能被浏览器所记录下,从而进行前进,后退,刷新,收藏等操作,给用户带来不便。
另外,对于没有进行 CSRF 防护的遗留系统来说,要采用这种方法来进行防护,要把所有请求都改为 XMLHttpRequest 请求,这样几乎是要重写整个网站,这代价无疑是不能接受的。
漏洞挖掘
1)最简单的方法就是抓取一个正常请求的数据包,如果没有Referer字段和token,那么极有可能存在CSRF漏洞
2)如果有Referer字段,但是去掉Referer字段后再重新提交,如果该提交还有效,那么基本上可以确定存在CSRF漏洞。
3)随着对CSRF漏洞研究的不断深入,不断涌现出一些专门针对CSRF漏洞进行检测的工具,如CSRFTester,CSRF Request Builder等
SSRF
定义
SSRF(Server-Side Request Forgery:服务器端请求伪造) 是一种由攻击者构造形成由服务端发起请求的一个安全漏洞。
并且SSRF攻击的目标是外网无法访问到的内部系统,同时请求都是又服务端发起的,所以服务端能够请求到与其自身相连接的与外网隔离的内部系统。类似于当作跳板进行攻击。
攻击流程
- 攻击者与服务器构建请求
- 服务器想客户端发送构建的请求
- 客户端响应服务器发送的请求
- 服务器向攻击者返回客户端的请求
危害
1)可以对外网、服务器所在内网、本地进行端口扫描,获取一些服务的banner信息。
2)攻击运行在内网或本地的应用程序(比如溢出)。
3)对内网web应用进行指纹识别,通过访问默认文件实现。
4)攻击内外网的web应用,主要是使用get参数就可以实现的攻击(比如struts2,sqli等)。
5)利用file协议读取本地文件等。
利用条件
web挖掘
1)分享:通过url地址分享网页内容。
2)转码服务:通过URL地址把原地址的网页内容调优使其适合手机屏幕浏览。
3)在线翻译:通过URL地址翻译对应文本的内容。
4)图片的下载与加载:通过URL地址加载或下载图片,图片加载远程图片地址此功能。
5)图片、文章收藏功能:通过URL记录图片的地址,或者通过收藏文章的地址。
6)未公开的API实现及调用URL的功能:有些网站通过api获取远程地址xml文件来加载内容。
url关键字
share、wap、url、link、src、source、target、u、display、sourceURl、imageURL、domain
伪协议
file:/// 从文件系统中获取文件内容,如,file:///etc/passwd
dict:// 字典服务器协议,访问字典资源,如,dict:///ip:6739/info:
sftp:// SSH文件传输协议或安全文件传输协议
ldap:// 轻量级目录访问协议
tftp:// 简单文件传输协议
gopher:// 分布式文档传递服务,可使用gopherus生成payload
…etc
eg.
http://baidu.com/?url=file:///etc/passwd
常见绕过
- 限制域名时添加@进行绕过。
如:http://baidu.com/?url=http://baidue.com@google.com/
- 添加端口绕过。
如:http://baidu.com/?url=http://google.com:443
- 利用[::]绕过。
如:http://baidu.com/?url=http://[::192.168.10.150]
- 利用句号绕过。
如:http://baidu.com/?url=http://192。168。10。150
- 编码绕过。
如:十六进制http://baidu.com/?url=http://c0.a8.6d.96
防御
1)限制请求的端口,并且只允许访问http和https的请求。
2)过滤返回的信息,并验证返回的消息是否符合标准,若不是标准的信息,那么直接进行过滤。
3)从服务器限制访问的端口,禁用不需要的端口。
4)限制内网访问的ip,一些没必要交互的服务器之间禁止访问。
5)禁止不必要的协议,例如FTP不要随便设置匿名访问。