前言:
?墮落了三個(gè)月,現(xiàn)在因?yàn)楸徽覍?shí)習(xí)而困擾,著實(shí)自己能力不足,從今天開始 每天沉淀一點(diǎn)點(diǎn) ,準(zhǔn)備秋招?加油
注意:
本文章參考qax的網(wǎng)絡(luò)安全java代碼審計(jì),記錄自己的學(xué)習(xí)過(guò)程,還希望各位博主 師傅 大佬 勿噴,還希望大家指出錯(cuò)誤
SSRF漏洞?
SSRF(Server-side Request Forge, 服務(wù)端請(qǐng)求偽造)。
由攻擊者構(gòu)造的攻擊鏈接傳給服務(wù)端執(zhí)行造成的漏洞,一般用來(lái)在外網(wǎng)探測(cè)或攻擊內(nèi)網(wǎng)服務(wù)。
危害:
1.獲取內(nèi)網(wǎng)主機(jī)、端口、banner信息
2.對(duì)內(nèi)網(wǎng)的應(yīng)用程序 進(jìn)行攻擊,例如Redis、jboos
3.file等偽協(xié)議讀取文件
4.造成內(nèi)網(wǎng)程序的溢出
SSRF審計(jì)函數(shù)?
SSRF漏洞一般位于遠(yuǎn)程圖片加載與下載、圖片或文章收藏功能、URL分享、通過(guò)URL在線翻譯、轉(zhuǎn)碼等功能點(diǎn)處。當(dāng)然,SSRF是由發(fā)起網(wǎng)絡(luò)請(qǐng)求的方法造成。代碼審計(jì)時(shí)需要關(guān)注的發(fā)起HTTP請(qǐng)求的類及函數(shù),部分如下:
HttpURLConnection. getInputStream |
Java里面SSRF支持的協(xié)議:
https,https,file,ftp等?
所以使得JAVA并不能像PHP中一樣使用gopher?協(xié)議來(lái)拓展攻擊面,gopher 協(xié)議在jdk8 中就被移除了
gopher協(xié)議在SSRF中使用可以看下面這篇文章
gopher 協(xié)議在SSRF 中的一些利用
?我們直接進(jìn)入Webgoat的靶場(chǎng)進(jìn)行測(cè)試
點(diǎn)擊第二關(guān)得到
根據(jù)提示我們輸入 jerry
?
這時(shí)候就說(shuō)明 傳入的參數(shù)可控,產(chǎn)生了SSRF漏洞
我們看一下源代碼
@RestController
@AssignmentHints({"ssrf.hint1", "ssrf.hint2"})
public class SSRFTask1 extends AssignmentEndpoint {
@PostMapping("/SSRF/task1")
@ResponseBody
public AttackResult completed(@RequestParam String url) {
return stealTheCheese(url);
}
protected AttackResult stealTheCheese(String url) {
try {
StringBuilder html = new StringBuilder();
if (url.matches("images/tom\\.png")) {
html.append(
"<img class=\"image\" alt=\"Tom\" src=\"images/tom.png\" width=\"25%\""
+ " height=\"25%\">");
return failed(this).feedback("ssrf.tom").output(html.toString()).build();
} else if (url.matches("images/jerry\\.png")) {
html.append(
"<img class=\"image\" alt=\"Jerry\" src=\"images/jerry.png\" width=\"25%\""
+ " height=\"25%\">");
return success(this).feedback("ssrf.success").output(html.toString()).build();
} else {
html.append("<img class=\"image\" alt=\"Silly Cat\" src=\"images/cat.jpg\">");
return failed(this).feedback("ssrf.failure").output(html.toString()).build();
}
} catch (Exception e) {
e.printStackTrace();
return failed(this).output(e.getMessage()).build();
}
}
}
主要看下面幾行代碼
public AttackResult completed(@RequestParam String url) {
return stealTheCheese(url);
}
//?completed()?方法使用?@PostMapping?注解標(biāo)記,表示它處理HTTP POST請(qǐng)求,并且映射到路徑 "/SSRF/task1"。該方法接受一個(gè)名為 "url" 的請(qǐng)求參數(shù),類型為字符串。
?意思就是接受url的參數(shù) 并映射到到路徑 "/SSRF/task1
然后看下一句
protected AttackResult stealTheCheese(String url) {
try {
StringBuilder html = new StringBuilder();
//stealTheCheese()?方法是一個(gè)受保護(hù)的方法,用于處理傳入的URL并返回相應(yīng)的結(jié)果。它接受一個(gè)名為 "url" 的字符串參數(shù)。
方法邏輯:stealTheCheese()?方法首先創(chuàng)建了一個(gè)?StringBuilder?對(duì)象?html,用于構(gòu)建HTML響應(yīng)。
就是很明顯沒(méi)有對(duì)這個(gè)url進(jìn)行過(guò)濾處理等,然后?就直接進(jìn)入下面的url匹配,
? ? 這段代碼是一個(gè)簡(jiǎn)單的SSRF攻擊任務(wù)處理器。它接受一個(gè)URL作為輸入,并根據(jù)URL的不同返回不同的HTML響應(yīng)。然而,代碼中存在一些潛在的安全風(fēng)險(xiǎn),因?yàn)樗鼪](méi)有對(duì)傳入的URL進(jìn)行充分的驗(yàn)證和過(guò)濾,可能導(dǎo)致安全漏洞,如SSRF攻擊。
我們接著看下一關(guān)
我們先點(diǎn)擊看看會(huì)是啥樣
?我們還是根據(jù)提示進(jìn)行輸入
url=http://ifconfig.pro
?驗(yàn)證成功
?
說(shuō)明url參數(shù)可控,可以通過(guò)惡意語(yǔ)句進(jìn)行對(duì)內(nèi)網(wǎng)主機(jī)信息的獲取?
我們分析源代碼
@RestController
@AssignmentHints({"ssrf.hint3"})
public class SSRFTask2 extends AssignmentEndpoint {
@PostMapping("/SSRF/task2")
@ResponseBody
public AttackResult completed(@RequestParam String url) {
return furBall(url);
}
protected AttackResult furBall(String url) {
if (url.matches("http://ifconfig\\.pro")) {
String html;
try (InputStream in = new URL(url).openStream()) {
html =
new String(in.readAllBytes(), StandardCharsets.UTF_8)
.replaceAll("\n", "<br>"); // Otherwise the \n gets escaped in the response
} catch (MalformedURLException e) {
return getFailedResult(e.getMessage());
} catch (IOException e) {
// in case the external site is down, the test and lesson should still be ok
html =
"<html><body>Although the http://ifconfig.pro site is down, you still managed to solve"
+ " this exercise the right way!</body></html>";
}
return success(this).feedback("ssrf.success").output(html).build();
}
var html = "<img class=\"image\" alt=\"image post\" src=\"images/cat.jpg\">";
return getFailedResult(html);
}
private AttackResult getFailedResult(String errorMsg) {
return failed(this).feedback("ssrf.failure").output(errorMsg).build();
}
}
?咱們主要關(guān)注下面兩行代碼
public AttackResult completed(@RequestParam String url) {
return furBall(url);
}completed() 方法使用 @PostMapping 注解標(biāo)記,表示它處理HTTP POST請(qǐng)求,并且映射到路徑 "/SSRF/task2"。該方法接受一個(gè)名為 "url" 的請(qǐng)求參數(shù),類型為字符串。
protected AttackResult furBall(String url) {
//furBall() 方法是一個(gè)受保護(hù)的方法,用于處理傳入的URL并返回相應(yīng)的結(jié)果。它接受一個(gè)名為 "url" 的字符串參數(shù)。
下面就是常規(guī)的正則匹配,總體而言,這段代碼是另一個(gè)簡(jiǎn)單的SSRF攻擊任務(wù)處理器。它接受一個(gè)URL作為輸入,并嘗試訪問(wèn)該URL獲取HTML內(nèi)容,并根據(jù)結(jié)果返回相應(yīng)的響應(yīng)。如果訪問(wèn)成功,則返回包含HTML內(nèi)容的成功響應(yīng);如果訪問(wèn)失敗,則返回一個(gè)包含特定錯(cuò)誤消息的失敗響應(yīng)。
具體的JAVA中 SSRF漏洞可以訪問(wèn)
https://www.freebuf.com/vuls/293473.html
SSRF修復(fù)?
1,過(guò)濾返回信息,驗(yàn)證遠(yuǎn)程服務(wù)器對(duì)請(qǐng)求的響應(yīng)是比較容易的方法。如果web應(yīng)用是去獲取某一種類型的文件。那么在把返回結(jié)果展示給用戶之前先驗(yàn)證返回的信息是否符合標(biāo)準(zhǔn)。
2, 統(tǒng)一錯(cuò)誤信息,避免用戶可以根據(jù)錯(cuò)誤信息來(lái)判斷遠(yuǎn)端服務(wù)器的端口狀態(tài)。
3,限制請(qǐng)求的端口為http常用的端口,比如,80,443,8080,8090。
4,黑名單內(nèi)網(wǎng)ip,(正確判斷內(nèi)網(wǎng)IP,正確獲取host)
5,禁用不需要的協(xié)議。僅僅允許http和https請(qǐng)求。可以防止類似于file:///,gopher://,ftp:// 等引起的問(wèn)題。
6.正確處理302跳轉(zhuǎn)?
?文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-840282.html文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-840282.html
?
到了這里,關(guān)于Java代碼審計(jì)安全篇-SSRF(服務(wù)端請(qǐng)求偽造)漏洞的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!