关于SSRF与CSRF漏洞的解释
SSRF服务端请求伪造(外网访问内网)
SSRF(Server-Side Request Forgery:服务器端请求伪造) 是一种由攻击者构造形成由服务端发起请求的一个安全漏洞。一般情况下,SSRF是要目标网站的内部系统。(因为他是从内部系统访问的,所有可以通过它攻击外网无法访问的内部系统,也就是把目标网站当中间人)
其实也就相当于一个中间人攻击(主要目的就是:由外网攻击者利用SSRF漏洞攻击内网)
一般来说基本都是通过脚本去扫内网的ip、端口点到为止
1、SSRF形成原因
SSRF 形成的原因大都是由于服务端提供了从其他服务器应用获取数据的功能,且没有对目标地址做过滤与限制。比如从指定URL地址获取网页文本内容,加载指定地址的图片,文档,等等。
即也就是说服务器端的验证并没有对其请求如获取图片的参数(image=)做出严格的过滤以及限制,从而导致A网站可以从其他服务器的获取数据
(默认网站webserver192.168.1.5的参数指定访问内网中的某台机器的内部资源地址,如果没有对其指定地址严格限制,那么就可能造成由webserver192.168.1.5这太机器访问内部的任意一台机器的资源。)——>>如:www.xxx.com/xx.php?image=URL,一般像分享、在线翻译这些功能地址。
即我们要对目标网站的架构了解,脑子了要有一个架构图。比如 : A网站,是一个所有人都可以访问的外网网站,B网站是一个他们内部的OA网站,我们普通用户只可以访问a网站,不能访问b网站。但是我们可以同过a网站做中间人,访问b网站,从而达到攻击b网站需求。
主要标志就是:xx.php?url=.....
(也可以命令执行,需要条件。甚至脚本执行。。。。)
2、利用SSRF漏洞的目的
SSRF漏洞就是通过篡改获取资源的请求发送给服务器,但是服务器并没有检测这个请求是否合法的,然后服务器以他的身份来访问其他服务器的资源。
3、SSRF漏洞的用途
- 可以对外网服务器所指向的内网、服务器本地进行端口扫描,获取一些服务的banner信息
- 攻击运行在内网或服务器本地的应用程序(比如溢出)
- 对内网web应用进行指纹识别,通过访问默认文件实现
- 攻击内外网的web应用,主要是使用get参数就可以实现的攻击(比如struts2,sqli等
- 利用file协议读取本地文件等
4、SSRF漏洞的特性
SSRF的强大和成功几率由函数本身功能决定
即代码中是什么函数其功能有多强大,那么存在SSRF漏洞的话,漏洞利用的概率和影响力就有多大。比如下面的两个函数curl_init、file_get_contents:一个能达到执行脚本的地步,一个能达到读文件的地步。
实例
对于curl_init函数,利用这个远程包含的特性,使用端口扫描脚本http://192.168.18.62:86/bwapp/evil/ssrf-1.txt去扫描内网ip开放的端口
注意:这里为什么txt被执行了,因为这里有个包含漏洞才执行了
对于file_get_content函数:(不支持https,支持http,支持php://内置协议)
读文件需要base64编码(php://filter/read=convert.base64-encode/resource=xxx.php)
http://192.168.18.23/pikachu/vul/ssrf/ssrf_fgc.php?file=php://filter/read=convert.base64-encode/resource=../../index.php
这里我得总结一下,上面为什么我需要用文件包含去实现我SSRF的目的?,而且为什么要用内置函数去读文件?,如果是这样我直接用文件包含不就行了么,简直跟我文件包含没有任何区别嘛。
其实这里文件包含是文件包含,SSRF是SSRF,二者之间是本质的不同,一个主要目的是包含文件,一个主要目的是通过中间服务器探测内网信息,这里只是借助了文件包含的能力举得例子,实际的例子多得很并不都涉及到文件包含,并不能混淆。就好比文件上传利用文件包含开启一句话一样。
以上只是对两个实例的说明。
其本质是:文件包含了站点web服务器上的东西,而ssrf的目的是打进内网,搞内网的东西。
不懂可以去wooyun看例子,ssrf是借助站点web服务器进入内网进行信息搜集。
5、如何挖掘SSRF漏洞
- 分享:通过URL地址分享网页内容
- 转码服务
- 在线翻译
- 图片加载与下载:通过URL地址加载或下载图片
- 图片、文章收藏功能
- 未公开的api实现以及其他调用URL的功能
- 从URL关键字中寻找
share
wap
url
link
src
source
target
u
3g
display
sourceURl
imageURL
domain
...
6、常用SSRF去做什么事
- 利用执行脚本进行端口探测
- 任意地址访问
- 内网访问
- 任意文件读取
- 内网攻击
7、绕过方法(绕开一般ssrf的防护)
1、更改IP地址写法
一些开发者会通过对传过来的URL参数进行正则匹配的方式来过滤掉内网IP,如采用如下正则表达式:
^10(\.([2][0-4]\d|[2][5][0-5]|[01]?\d?\d)){3}$
^172\.([1][6-9]|[2]\d|3[01])(\.([2][0-4]\d|[2][5][0-5]|[01]?\d?\d)){2}$
^192\.168(\.([2][0-4]\d|[2][5][0-5]|[01]?\d?\d)){2}$
对于这种过滤我们可以采用改编IP的写法的方式进行绕过,例如192.168.0.1这个IP地址我们可以改写成:
(1)、8进制格式:0300.0250.0.1
(2)、16进制格式:0xC0.0xA8.0.1
(3)、10进制整数格式:3232235521
(4)、16进制整数格式:0xC0A80001
还有一种特殊的省略模式,例如10.0.0.1这个IP可以写成10.1
2、利用解析URL所出现的问题
在某些情况下,后端程序可能会对访问的URL进行解析,对解析出来的host地址进行过滤。这时候可能会出现对URL参数解析不当,导致可以绕过过滤。
http://www.Jeromeyoung.com@192.168.0.1/
当后端程序通过不正确的正则表达式(比如将http之后到com为止的字符内容,也就是www.Jeromeyoung.com,认为是访问请求的host地址时)对上述URL的内容进行解析的时候,很有可能会认为访问URL的host为www.Jeromeyoung.com,而实际上这个URL所请求的内容都是192.168.0.1上的内容。
8、防护SSRF措施
(1)(黑名单)过滤10.0.0.0/8 、172.16.0.0/12、192.168.0.0/16、localhost私有地址、IPv6地址
(2)(黑名单)过滤file:///、dict://、gopher://、ftp:// 危险schema
(3)使用地址白名单
(4)内网服务开启鉴权(Memcached, Redis, Elasticsearch and MongoDB)
(5)对回显内容进行识别,采取限制措施
(6)需要使用互联网资源(比如贴吧使用网络图片)而无法使用白名单的情况:首先禁用 CURLOPT_FOLLOWLOCATION;然后通过域名获取目标ip,并过滤内部ip;最后识别返回的内容是否与假定内容一致
CSRF跨站请求伪造(也叫点击攻击)
Cross-site request forgery 简称为“CSRF”,在CSRF的攻击场景中攻击者会伪造一个请求(这个请求一般是一个链接),然后欺骗目标用户进行点击,用户一旦点击了这个请求,整个攻击就完成了。所以CSRF攻击也成为"one click"攻击。 很多人搞不清楚CSRF的概念,甚至有时候会将其和XSS混淆,更有甚者会将其和越权问题混为一谈,这都是对原理没搞清楚导致的。
1、CSRF攻击原理
程序员开发的时候,未对相关页面进行token和referer判断,造成攻击者可构造自己的URL地址欺骗目标用户进行点击。(点击后因为未对相关页面进行token和referer判断,即链接中没得带token或者数据包中没得referer这类的操作,所以链接地址没得校验操作直接执行了)其实也就是像下面的重要页面的防范措施没有做到位
以例子进行说明:
当我们打开网站或者登陆某个网站后,就会产生一个会话(这里指用户登陆后),这个会话可能是SESSION,Cookie控制,但是这是无关紧要的。唯一的重点是浏览器与服务器之间是在会话之中,在这个会话没有结束时候,你可以利用你的权限对网站进行操作,如进行发表文章,发邮件,删除文章等操作。当这个会话结束后,你在进行某些操作时候Web应用程序通常会来提醒你,您的会话已过期,或者是请重新登陆等提示。
这非常好理解,就像我们登陆网上银行后,Web浏览器已经跟可信的站点建立了一个经认证的会话。之后,只要是通过该Web浏览器这个认证的会话所发送的请求,都被视为可信的动作,例如转账,汇款等操作。当我们在一段时间内不进行操作后,在来重新做转账,或者汇款操作,那么这个站点可能会提示你:您的身份已过期,请重新登陆或者会话结束等消息。
而CSRF攻击则是建立会话之上的攻击。比如当你登陆了网上银行,正在进行转账业务,这时你的某个QQ好友(攻击者)发来一条消息(URL),这条消息是攻击者精心构造的转账业务代码。而且与你所登录的网站是同一个银行,你可能认为这个网站是安全的,并不是什么钓鱼网站之类的,然后打开了这条URL,那么你的账户的钱可能就在你的这一次小小点击上全部丢失。
怎么可能这么神奇呢?其实这并不神奇。主要是因为你的浏览器正处于与此网站的会话之中,那么一些操作都是合法的,而入侵者构造的这段代码只不过是正常的转账操作代码而已。比如说你想给用户spisec转账1000元,那么点击提交按钮之后,可能会发送以下请求:
http://www.taobao.com/pay.jsp?user=spisec&money=1000
而攻击者仅仅是改变一下user参数与money参数即可完成一次“合法”的攻击,如:
http://www.taobao.com/pay.jsp?user=hack&money=10000
当你访问了这条URL之后,就会自动向hack这个账户里面转入10000元。而这是你亲手造成的,并没因为有人去破解你的密码或者是Web服务器被入侵所导致的你的金钱丢失。下面以CSRF攻击原理图给大家形象总结:
用户C打开浏览器,访问受信任网站A,输入用户名和密码请求登录网站A;
在用户信息通过验证后,网站A产生Cookie信息并返回给浏览器,此时用户登录网站A成功,可以正常发送请求到网站A;
用户未退出网站A之前,在同一浏览器中,打开一个TAB页访问网站B;
网站B接收到用户请求后,返回一些攻击性代码,并发出一个请求要求访问第三方站点A;
浏览器在接收到这些攻击性代码后,根据网站B的请求,在用户不知情的情况下携带Cookie信息,向网站A发出请求。网站A并不知道该请求其实是由B发起的,所以会根据用户C的Cookie信息以C的权限处理该请求,导致来自网站B的恶意代码被执行。
2、达成CSRF攻击的条件
- 攻击建立在浏览器与Web服务器的会话之中
- 会话期间需要受害者进行访问或者说是点击
如果以上任意一个不满足都不能达成跨站请求伪造攻击。即目标必须处于会话状态,且需要点击
说白了,CSRF攻击也就是所谓的钓鱼攻击。
3、CSRF分类
- 站内
- 站外
4、检测方法
- 手工
检测CSRF漏洞是一项比较繁琐的工作,最简单的方法就是抓取一个正常请求的数据包,去掉Referer字段后再重新提交,如果该提交还有效,那么基本上可以确定存在CSRF漏洞。
- 工具
burp
CSRF Request Builder
CSRFTester
工具检测的原理:
以CSRFTester工具为例,CSRF漏洞检测工具的测试原理如下:使用CSRFTester进行测试时,首先需要抓取我们在浏览器中访问过的所有链接以及所有的表单等信息,然后通过在CSRFTester中修改相应的表单等信息,重新提交,这相当于一次伪造客户端请求。如果修改后的测试请求成功被网站服务器接受,则说明存在CSRF漏洞,当然此款工具也可以被用来进行CSRF攻击。
5、如何挖掘CSRF漏洞
- 扫描器(注意并不是每个页面爆没有token漏洞都是对的,因为前端的进行CSRF有毛用,主要就是对后台管理那一层的,所以不要盲目认为。),
- 修改密码的地方
- 添加用户的地方
- 数据库备份的地方
- 数据交易、支付等
- 其他一些对话框的钓鱼页面
- CSRF一般与XSS结合使用
- 注意页面是否带token或者包中有没得Referer,Referer在包中删除是否依然可以访问url目标等。光靠一个Referer来说也没用,Referer也能伪造
注意可能有预测的token,即有规律的token,如果是随机的就放弃吧。
6、常用攻击手段实例
一般的攻击思路:(首先,开源的web源码,攻击者了解网站的框架,搭建环境构造攻击url,例如数据备份的,下面实验中有过程。
去目标网站创建普通用户,发帖插入url等待目标管理会话在线状态浏览帖子,中招,攻击者访问备份下来的数据库,脱裤,完事。
)
1)、dz网站数据库备份(快速脱库)
两个ip:192.168.18.56:82攻击者自己的ip、192.168.18.62:86管理员的ip
整体思路:
实验步骤:攻击者自己搭建环境,以管理员身份登录,创建普通账户,以管理员身份进行数据备份,抓包,修改包的post数据,构造url为自己要求的。(这里url的IP地址为目标的IP地址)
复制好url,前往目标网站,注册,以普通用户身份登录发帖带入url(试一下直接在文本中插入,按道理来说需要自动运行地址而不是文本内容),等待管理员登录且为会话状态点击查看攻击者发帖的内容,达成指定备份。
攻击者访问构造的url,脱库。
攻击者环境配置url(创建账号忽略,直接上关键步骤):
原本应该这是样的:
当攻击者重构备份的文件夹名称和文件名的时候:
注意:这里构造是抓到包的时候抓了改,再放包,不是重发器里发一次。
找到攻击url,构造成目标的地址:
http://192.168.18.62:86/dz/upload/uc_server/admin.php?m=db&a=operate&t=export&appid=0&backupdir=Jerome%26backupfilename%3Dtest
在目标网站上创建用户、发帖。
发帖成功:
现在当管理员登录之后查看帖子,会发现是正常的帖子:
当管理员在线且点击了这篇帖子,结果就是数据库已经达成了备份,且能被攻击者访问。
这里得说明一下这个路径,在上面攻击者搭建的环境中,一定会去模拟攻击才知道最后的结果在哪个路径下,上面省却了这个步骤,这里直接在目标机器上看结果。
2)、修改密码
修改密码的前提是:利用CSRF漏洞
以dvwa的低级为例,直接抓包:
上面把referer删除了,可以改密码,说明csrf可用。
构造对目标构造如下url,存在CSRF漏洞的情况下,一旦在线点击访问就能改密码:
http://192.168.18.62:86/dvwa/vulnerabilities/csrf/?password_new=password&password_conf=password&Change=Change
说一下中级的:
中级的发现无法直接执行再改密码,先看源码:
但通过观察数据包发现,其没有referer信息,那么对其进行了一个伪造Referer:
Referer:http://192.168.18.62:86/dvwa/vulnerabilities/csrf/
加入数据包中,发现密码被修改了。
(改密码也就是说:没得任何验证如没有验证码、没得token、没得Referer、没得原密码校验等,很容易就造成通杀直接,受害者回话状态点击插入了url的地址,直接被修改密码。)
3)、添加账号
下面利用一个网站进行添加账号操作:
首先,利用自建网站进行添加账号操作,抓包将包生成为poc,建立test.html,废掉此包。
目前仍为管理登录状态,在这个状态下点击了攻击者的test.html。看下效果:
攻击者的效果成功达成。
4)、自解压缩包
配置方式如下:
一旦解压就会打开百度,自行尝试吧。
7、防范方法
- 验证HTTP Referer字段
- 在请求地址中添加token并验证
- 在HTTP头中自定义属性并验证
- 在服务端严格区分好POST和GET的数据请求
- 使用验证码或者密码确认方式进行
- 白名单