news 2026/4/20 8:08:56

pikachu靶场ssrf通关学习(含基础防护)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
pikachu靶场ssrf通关学习(含基础防护)

重点是理解CURL函数和file_get_contents函数引发的漏洞

使用的php版本是5.6.9

(一)、查看页面信息

一、CURL

curl不是单独的函数,是基于libcurl库的一套请求工具集,所以支持的协议比较多

二、file_get_content

php中内置的简单文件/资源读取函数,重点是轻量级

  1. 查看后发现都存在用户可控的请求传入到服务器,那就是存在ssrf的最基础前提了
  2. 那这里就详细尝试包含(http访问文件,file读取文件,dict扫描其他主机)

(二)、CURL关卡

一、代码审计

通过查看后端源码分析

if(isset($_GET['url'])&&$_GET['url']!=null){//直接获取GET请求传入的URL值$URL=$_GET['url'];$CH=curl_init($URL);curl_setopt($CH,CURLOPT_HEADER,FALSE//只返回响应体curl_setopt($CH,CURLOPT_SSL_VERIFYPEER,FALSE//禁用SSL证书校验$RES=curl_exec($CH);//发送请求curl_close($CH);echo$RES;//直接将请求结果返回}
  1. 直接获取请求中的URL值,未作任何过滤操作操作
  2. CURl函数默认支持多种协议,包括http/httpsfiledict,**gopher**等多种协议
二、协议访问

壹、http

  • 直接访问网站下的其他文件和百度网站,都可以访问成功(重点是没有过滤)

贰、file

访问windows的早期配置文件

叄、其他的协议只要修改协议名和遵循格式就行

三、防护

防护手段:

  1. 过滤协议,只允许http和https协议
  2. 控制访问的文件(使用文件映射比较好)
  3. 验证访问的ip地址
if(isset($_GET['url'])&&$_GET['url']!=null){//接收前端URL没问题,但是要做好过滤,如果不做过滤,就会导致SSRF$URL=$_GET['url'];$CH=curl_init($URL);//协议判断$url_info=parse_url(strtolower($URL));if(!in_array($url_info['scheme'],array('http','https'))){//scheme: 协议类型 die('出错了1');}// 定义访问白名单$list=['info1.php'];// 访问文件判断$filename=basename($url_info['path']);if(!in_array($filename,$list)){die('出错了2');//还存在/../等绕过方式}// 服务器判断$system_ip=['127.0.0.1','192.168.1.1'];//访问白名单 // 要实现还是验证具体的ip地址,这只是验证的是字符串$host=$url_info['host'];if(!in_array($host,$system_ip)){die('出错了3');}

这样可以初步过滤和防护ssrf漏洞,但还是有问题哦

(三)、file_get_content关卡

一、代码审计
if(isset($_GET['file'])&&$_GET['file']!=null){$filename=$_GET['file'];$str=file_get_contents($filename);echo$str;}
  1. 可以看到非常的简单,直接获取GET请求中的file值后使用file_get_contents函数发送请求,无任何过滤防护手段
  2. 需要注意的是函数只能接受GET请求的参数
  3. file_get_contents()支持的协议比较少,包括http/httpsfileftp协议
二、协议访问

壹、连接外部的资源

贰、访问文件

叄、伪协议访问后端源码

  • 可以看出后端会直接返回输出的信息,那就输入不存在的文件导致报错,看看后端路径

  • 通过php的伪协议输出了后端源码

肆、其他的协议也是类似的操作

三、防护手段
if(isset($_GET['file'])&&$_GET['file']!=null){$filename=$_GET['file'];$url_info=parse_url(strtolower($filename));// 协议判断if(!in_array($url_info[scheme],array('http','https'))){//scheme: 协议类型die('出错了1');}// 定义访问白名单$list=['info2.php'];// 访问文件判断$file=basename($url_info['path']);if(!in_array($file,$list)){die('出错了2');//还存在/../等绕过方式}// 服务器判断$system_ip=['127.0.0.1','192.168.1.1'];//访问白名单$host=$url_info['host'];if(!in_array($host,$system_ip)){die('出错了3');}//要实现还是验证具体的ip地址,这只是验证的是字符串$str=file_get_contents($filename);echo$str;}
  • 这是最简单的过滤防止ssrf漏洞,但还是有问题哦

四、配置防护

  1. php.ini中关闭allow_url_fopen/allow_url_include,限制open_basedir,禁用危险函数
  2. web服务器的危险请求拦截
  3. 设置防护防火墙,警用特殊IP地址
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/17 14:41:25

GitHub镜像下载加速:一键获取GLM-TTS完整模型与依赖包

GitHub镜像下载加速:一键获取GLM-TTS完整模型与依赖包 在AI语音生成技术飞速发展的今天,越来越多的内容创作者、研究团队和硬件厂商开始尝试将高质量的文本到语音(TTS)系统集成进自己的产品线。然而,一个普遍存在的现实…

作者头像 李华
网站建设 2026/4/20 2:48:20

从功能测试转测试开发:面试官最想听的3个项目故事

在软件测试领域,功能测试工程师转向测试开发是一个常见职业跃迁路径。面试官在评估候选人时,最看重的是实际项目经验——那些能展示技术深度、问题解决能力和创新思维的故事。作为一名从业者,我曾成功转型,并在多个项目中积累宝贵…

作者头像 李华
网站建设 2026/4/18 6:30:37

Python脚本封装:将GLM-TTS功能模块化便于调用

Python脚本封装:将GLM-TTS功能模块化便于调用 在语音合成技术快速演进的今天,个性化、高自然度的声音生成已不再是科研实验室里的概念,而是正逐步走进智能客服、有声书平台、虚拟主播乃至无障碍辅助系统等实际应用场景。其中,GLM-…

作者头像 李华
网站建设 2026/4/17 18:19:23

云服务商对接:在主流平台上线GLM-TTS镜像市场

云服务商对接:在主流平台上线GLM-TTS镜像市场 如今,语音合成已不再是实验室里的前沿探索,而是正在快速渗透进教育、客服、内容创作等真实场景中的基础设施。无论是为有声书生成自然流畅的朗读音频,还是为虚拟主播赋予个性化音色与…

作者头像 李华
网站建设 2026/4/18 1:11:21

中文文献精准查找指南

示例代码实现以下是一个 Python 代码示例,用于实现一个简单的计算器功能,支持加、减、乘、除运算:def calculator():print("欢迎使用简单计算器")num1 float(input("请输入第一个数字: "))operator input("请输入…

作者头像 李华