pikachu靶场练习——SSRF详解
Posted BBillkinpp
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了pikachu靶场练习——SSRF详解相关的知识,希望对你有一定的参考价值。
SSRF(服务器端请求伪造Server-Side Request Forgery)
1、SSRF漏洞介绍:
SSRF漏洞(服务器端请求伪造):是一种由攻击者构造形成由服务端发起请求的一个安全漏洞。一般情况下,SSRF攻击的目标是从外网无法访问的内部系统。(正是因为它是由服务端发起的,所以它能够请求到与它相连而与外网隔离的内部系统)。
2、SSRF漏洞原理:
SSRF形成的原因大都是由于服务端提供了从其他服务器应用获取数据的功能且没有对目标地址做过滤与限制。比如从指定URL地址获取网页文本内容,加载指定地址的图片,下载等等。利用的是服务端的请求伪造。SSRF是利用存在缺陷的web应用作为代理攻击远程和本地的服务器。
各个协议调用探针:http,file,dict,ftp,gopher等。
3、SSRF漏洞利用手段:
(1)可以对外网、内网、本地进行端口扫描,某些情况下端口的Banner会回显出来(比如3306的);
(2)攻击运行在内网或本地的有漏洞程序(比如溢出);
(3)可以对内网Web应用进行指纹识别,原理是通过请求默认的文件得到特定的指纹;
(4)攻击内网或外网有漏洞的Web应用;
(5)使用file:///协议读取本地文件(或其他协议)
4、SSRF漏洞绕过方法:
(1)@ http://abc.com@127.0.0.1
(2)添加端口号 http://127.0.0.1:8080
(3)短地址 https://0x9.me/cuGfD
(4)可以指向任意ip的域名 xip.io
(5)ip地址转换成进制来访问 192.168.0.1=3232235521(十进制)
(6)非HTTP协议
(7)DNS Rebinding
一、SSRF(curl)
我们先看下curl的用法:https://www.runoob.com/php/php-ref-curl.html
php支持的由Daniel Stenberg创建的libcurl库允许你与各种的服务器使用各种类型的协议进行连接和通讯。
libcurl目前支持http、https、ftp、gopher、telnet、dict、file和ldap协议。libcurl同时也支持HTTPS认证、HTTP POST、HTTP PUT、 FTP 上传(这个也能通过PHP的FTP扩展完成)、HTTP基于表单的上传、代理、cookies和用户名+密码的认证。
我们依次点击,发现这里出现了一个url地址http://127.0.0.1/pikachu/vul/ssrf/ssrf_curl.php?url=http://127.0.0.1/pikachu/vul/ssrf/ssrf_info/info1.php
因为curl支持很多协议,我们就可以做以下尝试:
1、通过网址访问链接
比如说修改url为:url=http://www.baidu.com
,访问百度页面:
2、利用file协议查看本地文件
修改url为:url=file:///d:/test.txt
,查看文件的内容:
3、dict协议扫描内网主机开放端口
使用dict协议可以获取内网主机开放端口相应服务的指纹信息,比如说内网主机开了http端口的话,
可以修改url为:url=dict://192.168.198.1:21
:
代码:
二、SSRF(file_get_content)
跟上关类似,url变成了file
我们先看下file_get_content()的用法:https://www.runoob.com/php/func-filesystem-file-get-contents.html
file_get_contents() 把整个文件读入一个字符串中。
语法:file_get_contents(path,include_path,context,start,max_length)
1、file读取本地文件
修改file为:file=file:///D:/test.txt
,查看文件的内容:
2、http协议请求内网资源
修改file为:file=http://127.0.0.1/pikachu/vul/sqli/1.php
,查看文件的内容:
pikachu靶场——SSRF(服务器端请求伪造)
概述
SSRF(Server-Side Request Forgery:服务器端请求伪造)
其形成的原因大都是由于服务端提供了从其他服务器应用获取数据的功能,但又没有对目标地址做严格过滤与限制,导致攻击者可以传入任意的地址来让后端服务器对其发起请求,并返回对该目标地址请求的数据。
数据流:攻击者----->服务器---->目标地址
根据后台使用的函数的不同,对应的影响和利用方法又有不一样
PHP中下面函数的使用不当会导致SSRF:
file_get_contents()
fsockopen()
curl_exec()
如果一定要通过后台服务器远程去对用户指定("或者预埋在前端的请求")的地址进行资源请求,则请做好目标地址的过滤。
SSRF(curl)
在pikachu靶场中,点击蓝色的a标签后,可以看到浏览器URL中它传了一个url参数
打开后端源代码,可以看到它是从前端获取了url请求,curl_init函数会对它进行初始化,然后curl_exec函数会去执行请求,最终又将请求结果返回到前端。
我们可以通过传入一个其他的地址来演示。
在URL中传入百度的地址(www.baidu.com),可以看到页面显示出了百度的数据库 (它的流程和分析的源代码流程是一样的,前端传入参数,后端通过curl_exec去请求百度,最后把请求返回的百度数据返回到前端)
为了演示,我在pikachu的test文件夹中新建了一个txt文件,内容如图片所示
接下来把这个2.txt文件的地址输入到pikachu中
http://127.0.0.1/pikachu/test/2.txt
提交这个url后,pikachu页面显示出了2.txt文件中保存的内容
这样也就意味着我们可以通过SSRF这个漏洞,对后端服务器同一个网络的其他服务器进行相关的扫描、探测,获取更多的资源,然后更进一步的进行攻击。
SSRF(file_get_content)
打开pikachu靶场,点击蓝色标签,可以看到和前面是一样的,都是通过URL上传参数到后台获取信息的
查看后端代码,它和前面的逻辑是一样的,不同的是它这里使用file_get_contents函数进行文件的读取执行,而file_get_contents函数可以对本地文件进行读取,也可以对远程文件进行读取。
我们可以像前面测试的一样,在URL中去输入百度的地址。它一样也会通过http协议去获取百度的资源
我们也可以像前面一样,去访问我们之前在pikachu保存的txt文件
接下来,比如我们想知道它后台的PHP是怎么写的,可以通过构造一个payload去获取后台的PHP源码
php://filter/read=convert.base64-encode/resource=ssrf.php
提交payload后,可以看到页面显示出了转换后的php的base64编码
然后我们可以复制获取的base64编码到相关的解码网站进行解码从而得到PHP的源码
以上是关于pikachu靶场练习——SSRF详解的主要内容,如果未能解决你的问题,请参考以下文章