Pikachu靶场——SSRF 服务端请求伪造

文章目录

  • 1 SSRF 服务端请求伪造
    • 1.1 SSRF(curl)
      • 1.1.1 漏洞防御
    • 1.2 SSRF(file_get_content)
      • 1.2.1 漏洞防御
      • 1.2.3 SSRF 防御

1 SSRF 服务端请求伪造

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

其形成的原因大都是由于服务端提供了从其他服务器应用获取数据的功能,但又没有对目标地址做严格过滤与限制,从而导致攻击者可以传入任意的地址来让后端服务器对其发起请求,并返回对该目标地址请求的数据。

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

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

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

file_get_contents()
fsockopen()
curl_exec()

如果一定要通过后台服务器远程去对用户指定(“或者预埋在前端的请求”)的地址进行资源请求,则请做好目标地址的过滤

1.1 SSRF(curl)

cURL用法:PHP: cURL - Manual。

点击链接,查看页面变化

http://192.168.188.183/pikachu/vul/ssrf/ssrf_curl.php

Pikachu靶场——SSRF 服务端请求伪造_第1张图片

发现页面的URL中多了一个url参数。

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

Pikachu靶场——SSRF 服务端请求伪造_第2张图片

因为curl支持很多协议,就可以做以下尝试:

通过网址访问

比如说修改url为:url=http://www.baidu.com,访问百度页面:

Pikachu靶场——SSRF 服务端请求伪造_第3张图片

利用file协议查看本地文件

file协议:file://是一种在本地文件系统中读取或写入文件的协议。通过file://协议,可以使用Curl直接读取本地文件或将数据写入到本地文件。

修改url为:url=file:///c:/test/wuhu.txt,查看文件的内容:

Pikachu靶场——SSRF 服务端请求伪造_第4张图片

dict协议扫描内网主机开放端口

dict协议:dict://是一种用于在Curl命令中传递字典参数的协议。该协议通常用于向服务器发送包含键值对的数据。

使用dict协议可以获取内网主机开放端口相应服务的指纹信息,修改url为:url=dict://192.168.188.183:80

Pikachu靶场——SSRF 服务端请求伪造_第5张图片

1.1.1 漏洞防御

修改代码前,可以看到代码中没有做任何的过滤操作

Pikachu靶场——SSRF 服务端请求伪造_第6张图片

对代码做一些改动

echo $URL."
"
; $octet = explode(".",$URL); echo $octet[1]."
"
; if($octet[1]!="php"){ die("黑客!!!"); }

代码解析:

  • die:等同于 exit(),终止程序的执行。

  • explode: 使用一个字符串分割另一个字符串。

    explode(string $separator, string $string, int $limit = PHP_INT_MAX): array
    
    • 此函数返回由字符串组成的数组,每个元素都是 string 的一个子串,它们被字符串 separator 作为边界点分割出来。

Pikachu靶场——SSRF 服务端请求伪造_第7张图片

这样我们就可以让页面访问的时候只能去访问info1.php和info2.php文件,这里以点作为分割,所以如果后缀名不为php的话那么就不允许通过。

页面访问

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

Pikachu靶场——SSRF 服务端请求伪造_第8张图片

如果访问其他的路径,例如访问本地文件

http://127.0.0.1/pikachu/vul/ssrf/ssrf_curl.php?url=file:///c:/test/wuhu.txt

Pikachu靶场——SSRF 服务端请求伪造_第9张图片

访问其他网站

127.0.0.1/pikachu/vul/ssrf/ssrf_curl.php?url=http://www.baidu.com

Pikachu靶场——SSRF 服务端请求伪造_第10张图片

1.2 SSRF(file_get_content)

点击链接,查看页面变化

Pikachu靶场——SSRF 服务端请求伪造_第11张图片

发现路径中的参数从url变成了file

Pikachu靶场——SSRF 服务端请求伪造_第12张图片

file_get_content使用方法。

file读取本地文件

修改file为:file=file:///../../../../../../../../windows/system32/drivers/etc/hosts

查看页面效果:

Pikachu靶场——SSRF 服务端请求伪造_第13张图片

http协议请求内网资源

为了演示效果,开启一台kali主机,并且开启一个http服务

python3 -m http.server 8888

image-20230909174834552

修改file为:file=http://192.168.188.185:8888

查看页面效果:

Pikachu靶场——SSRF 服务端请求伪造_第14张图片

1.2.1 漏洞防御

修改之前的代码

Pikachu靶场——SSRF 服务端请求伪造_第15张图片

修改后的代码

echo $filename."
"
; $octet = explode(".",$filename); echo $octet[1]."
"
; if($octet[1]!="php"){ die("黑客!!!"); }

Pikachu靶场——SSRF 服务端请求伪造_第16张图片

页面访问,读取本地文件

http://127.0.0.1/pikachu/vul/ssrf/ssrf_fgc.php?file=file://../../../../../../../../windows/system32/drivers/etc/hosts

Pikachu靶场——SSRF 服务端请求伪造_第17张图片

1.2.3 SSRF 防御

参看我写的另一篇博客:服务端请求伪造(SSRF)及漏洞复现

你可能感兴趣的:(Pikachu,网络安全,系统安全,pikachu,靶场,SSRF,跨站请求伪造)