news 2026/3/12 0:45:51

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/3/4 3:47:13

电机齿轮拉马

拉马太贵了,想自己做一个,这是别人做的:没有机床做不出,画个设计图先:difference(){ cube([24,20,24]);translate([2,-1,2]) cube([20,22,20]);translate([10,-1,-1]) cube([4,12,4]); }translate([12,10,5]) differen…

作者头像 李华
网站建设 2026/3/11 11:51:45

效果对比demo:提供原始语音与合成语音试听选择

效果对比demo:提供原始语音与合成语音试听选择 在语音合成技术飞速发展的今天,我们早已不再满足于“能说话”的机器。真正打动用户的,是那些听起来像真人、有情感、自然流畅的语音输出。尤其是在虚拟主播、有声书生成、个性化助手等场景中&a…

作者头像 李华
网站建设 2026/3/11 16:12:20

Sublime Text配置:自定义快捷键触发语音合成

Sublime Text 集成 GLM-TTS:打造“写完即听”的语音创作工作流 在内容创作日益依赖 AI 的今天,我们不再满足于“写完再读”,而是追求更即时的反馈——比如,刚敲下一段文字,就能立刻听到它被朗读出来的声音。这种“所写…

作者头像 李华
网站建设 2026/3/9 2:42:06

WebUI二次开发揭秘:科哥版GLM-TTS在本地GPU环境中的部署全流程

WebUI二次开发揭秘:科哥版GLM-TTS在本地GPU环境中的部署全流程 如今,只需一段几秒钟的语音片段,就能让AI“完美复刻”你的声音——这已不再是科幻电影中的桥段,而是正在被越来越多开发者掌握的真实能力。在中文语音合成领域&#…

作者头像 李华
网站建设 2026/3/11 9:43:23

错误弹窗设计:友好提示问题原因及解决办法

错误弹窗设计:如何让技术报错变成用户友好的解决方案 在开发 AI 音频合成工具的过程中,我们常常陷入一个误区:把功能实现当作终点。但真正决定用户体验的,往往不是模型多强大、生成多快,而是当系统出错时——你有没有告…

作者头像 李华
网站建设 2026/3/11 2:38:51

深夜,造价人为何总与文档“死磕”?

凌晨的办公室,键盘声未歇。这不是电影片段,而是无数造价工程师的日常。我们究竟在忙什么?不过三件事:1、手动“搬砖”:成百上千份合同、签证、报告,需要你一份份手动分类、编号,塞进A/C/D卷。枯…

作者头像 李华