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

PHP中下面函数的使用不当会导致SSRF:

1
2
3
file_get_contents()
fsockopen()
curl_exec()
  1. file_get_contents() 将整个文件读入一个字符串
  2. fsockopen() 打开 Internet 或者 Unix 套接字连接
  3. curl_exec() 执行 cURL 会话

SSRF(curl)

curl 可以接收很多内容,不论是一个链接,还是一个文件路径。如果是一个链接,curl 就直接访问那个链接,如果是一个文件路径就直接访问那个文件。

我们发现超链接是

1
http://192.168.17.129:8000/vul/ssrf/ssrf_curl.php?url=http://127.0.0.1/vul/vul/ssrf/ssrf_info/info1.php

不过我们的端口是 8000 ,我们再设置一下,还是不行,我试了一下,必须是外部的 IP(不管是局域网 IP 还是公网 IP 也好,不能是本地回环地址)

1
http://192.168.17.129:8000/vul/ssrf/ssrf_curl.php?url=http://192.168.17.129:8000/vul/ssrf/ssrf_info/info1.php

所以很容易可以调用其他的 PHP 代码,是吧。

我们又会用到 pikachu RCE exec”eval”的页面 php 代码了。

1
192.168.17.129:8000/vul/ssrf/ssrf_curl.php?url=http://192.168.17.129:8000/vul/rce/rce_eval.php

页面有点错乱,没关系。不过,测了半天发现没用。

不过我们可以用这个干很多事情了。

源码分析

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
if(isset($_GET['url']) && $_GET['url'] != null){

//接收前端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;

}

SSRF(file_get_content)

一样的,只不过是文件而已

file://文件路径

这个是服务器的本地文件路径

http://文件路径

是基于网站根目录的路径