var params:Object = LoaderInfo(this.root.loaderInfo).parameters;
var ctl:String = String(params["ctl"]);
var ao:Worker;
if (ctl == "Add) {
ao = new AddCommand();
} else if (ctl == "Modify") {
ao = new ModifyCommand();
} else {
throw new UnknownActionError();
}
ao.doAction(params);
var params:Object = LoaderInfo(this.root.loaderInfo).parameters;
var ctl:String = String(params["ctl"]);
var ao:Worker;
var cmdClass:Class = getDefinitionByName(ctl + "Command") as Class;
ao = new cmdClass();
ao.doAction(params);
if/else
代码段也完全删除了,而且还可以在不改变命令发送器的情况下增加新的命令类型。Worker
接口的对象实例化。如果命令发送器仍对 access control 负责,那么只要程序员创建实现 Worker
接口的新类,就务必要修改发送器的 access control 代码。如果未修改 access control 代码,那么一些 Worker
类就没有任何 access control 权限。Worker
对象负责执行 access control 检查。下面是一段重新修改的代码示例:
var params:Object = LoaderInfo(this.root.loaderInfo).parameters;
var ctl:String = String(params["ctl"]);
var ao:Worker;
var cmdClass:Class = getDefinitionByName(ctl + "Command") as Class;
ao = new cmdClass();
ao.checkAccessControl(params);
ao.doAction(params);
Continuation
对象的回调方法可能使攻击者能够通过应用程序创建意外的控制流路径,从而有可能绕过安全检查。continuationMethod
属性,该属性用于确定接收响应时要调用的方法的名称。
public Object startRequest() {
Continuation con = new Continuation(40);
Map<String,String> params = ApexPages.currentPage().getParameters();
if (params.containsKey('contMethod')) {
con.continuationMethod = params.get('contMethod');
} else {
con.continuationMethod = 'processResponse';
}
HttpRequest req = new HttpRequest();
req.setMethod('GET');
req.setEndpoint(LONG_RUNNING_SERVICE_URL);
this.requestLabel = con.addHttpRequest(req);
return con;
}
continuationMethod
属性,这使得攻击者能够调用与名称匹配的任何函数。
...
Dim ctl As String
Dim ao As New Worker()
ctl = Request.Form("ctl")
If (String.Compare(ctl,"Add") = 0) Then
ao.DoAddCommand(Request)
Else If (String.Compare(ctl,"Modify") = 0) Then
ao.DoModifyCommand(Request)
Else
App.EventLog("No Action Found", 4)
End If
...
...
Dim ctl As String
Dim ao As New Worker()
ctl = Request.Form("ctl")
CallByName(ao, ctl, vbMethod, Request)
...
if/else
代码段也完全删除了,而且还可以在不改变命令发送器的情况下增加新的命令类型。Worker
对象的方法。如果命令发送器对 access control 负责,那么,只要程序员在 Worker
类中创建了新方法,就必须修改发送器的 access control 逻辑。如果 access control 逻辑过期,那么某些 Worker
方法将不具有任何 access control。Worker
对象负责执行 access control 检查。下面是一段重新修改的代码示例:
...
Dim ctl As String
Dim ao As New Worker()
ctl = Request.Form("ctl")
If (ao.checkAccessControl(ctl,Request) = True) Then
CallByName(ao, "Do" & ctl & "Command", vbMethod, Request)
End If
...
clazz
中定义的所有函数。
char* ctl = getenv("ctl");
...
jmethodID mid = GetMethodID(clazz, ctl, sig);
status = CallIntMethod(env, clazz, mid, JAVA_ARGS);
...
String ctl = request.getParameter("ctl");
Worker ao = null;
if (ctl.equals("Add")) {
ao = new AddCommand();
} else if (ctl.equals("Modify")) {
ao = new ModifyCommand();
} else {
throw new UnknownActionError();
}
ao.doAction(request);
String ctl = request.getParameter("ctl");
Class cmdClass = Class.forName(ctl + "Command");
Worker ao = (Worker) cmdClass.newInstance();
ao.doAction(request);
if/else
代码段也完全删除了,而且还可以在不改变命令发送器的情况下增加新的命令类型。Worker
接口的对象实例化。如果命令发送器仍对 access control 负责,那么只要程序员创建实现 Worker
接口的新类,就务必要修改发送器的 access control 代码。如果未修改 access control 代码,那么一些 Worker
类就没有任何 access control 权限。Worker
对象负责执行 access control 检查。下面是一段重新修改的代码示例:
String ctl = request.getParameter("ctl");
Class cmdClass = Class.forName(ctl + "Command");
Worker ao = (Worker) cmdClass.newInstance();
ao.checkAccessControl(request);
ao.doAction(request);
Worker
接口的对象;系统中所有对象的默认构造函数都可以调用。如果对象没有实现 Worker
接口,则会在分配到 ao
前抛出 ClassCastException
。但如果构造函数执行了一些有利于攻击者的操作,则说明已经造成损害。对于简单的应用程序来说,这种情况的影响并不大,但是对于日趋复杂的大型应用程序来说,攻击者利用构造函数发动攻击并非没有可能。performSelector
方法所使用的参数,通过此种方式创建一个意想不到且贯穿于整个应用程序的控制流路径,从而避开潜在的安全检查。UIApplicationDelegate
类中定义的方法签名匹配的任何函数。
...
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url
sourceApplication:(NSString *)sourceApplication annotation:(id)annotation {
NSString *query = [url query];
NSString *pathExt = [url pathExtension];
[self performSelector:NSSelectorFromString(pathExt) withObject:query];
...
$ctl = $_GET["ctl"];
$ao = null;
if (ctl->equals("Add")) {
$ao = new AddCommand();
} else if ($ctl.equals("Modify")) {
$ao = new ModifyCommand();
} else {
throw new UnknownActionError();
}
$ao->doAction(request);
$ctl = $_GET["ctl"];
$args = $_GET["args"];
$cmdClass = new ReflectionClass(ctl . "Command");
$ao = $cmdClass->newInstance($args);
$ao->doAction(request);
if/else
代码段也完全删除了,而且还可以在不改变命令发送器的情况下增加新的命令类型。Worker
接口的对象实例化。如果命令发送器仍对 access control 负责,那么只要程序员创建实现 Worker
接口的新类,就务必要修改发送器的 access control 代码。如果未修改 access control 代码,那么一些 Worker
类就没有任何 access control 权限。Worker
对象负责执行 access control 检查。下面是一段重新修改的代码示例:
$ctl = $_GET["ctl"];
$args = $_GET["args"];
$cmdClass = new ReflectionClass(ctl . "Command");
$ao = $cmdClass->newInstance($args);
$ao->checkAccessControl(request);
ao->doAction(request);
Worker
接口的对象;系统中所有对象的默认构造函数都可以调用。如果对象没有实现 Worker
接口,则会在分配到 $ao
前抛出 ClassCastException
。但如果构造函数执行了一些有利于攻击者的操作,则说明已经造成损害。对于简单的应用程序来说,这种情况的影响并不大,但是对于日趋复杂的大型应用程序来说,攻击者利用构造函数发动攻击并非没有可能。
ctl = req['ctl']
if ctl=='add'
addCommand(req)
elsif ctl=='modify'
modifyCommand(req)
else
raise UnknownCommandError.new
end
ctl = req['ctl']
ctl << "Command"
send(ctl)
if/else
代码段也完全删除了,而且还可以在不改变命令发送器的情况下增加新的命令类型。define_method()
动态创建方法,或者通过覆盖 missing_method()
来调用方法。审计和跟踪这些方法以及访问控制代码在这些方法中的使用方式是非常困难的,当考虑到这一点还将取决于所加载的其他库代码时,可能会使这个近乎不可完成的任务能够以这种方式正确地完成。
def exec(ctl: String) = Action { request =>
val cmdClass = Platform.getClassForName(ctl + "Command")
Worker ao = (Worker) cmdClass.newInstance()
ao.doAction(request)
...
}
if/else
代码段也完全删除了,而且还可以在不改变命令发送器的情况下增加新的命令类型。Worker
接口的对象实例化。如果命令发送器仍对 access control 负责,那么只要程序员创建实现 Worker
接口的新类,就务必要修改发送器的 access control 代码。如果未修改 access control 代码,那么一些 Worker
类就没有任何 access control 权限。Worker
对象负责执行 access control 检查。下面是一段重新修改的代码示例:
def exec(ctl: String) = Action { request =>
val cmdClass = Platform.getClassForName(ctl + "Command")
Worker ao = (Worker) cmdClass.newInstance()
ao.checkAccessControl(request);
ao.doAction(request)
...
}
Worker
接口的对象;系统中所有对象的默认构造函数都可以调用。如果对象没有实现 Worker
接口,则会在分配到 ao
前抛出 ClassCastException
。但如果构造函数执行了一些有利于攻击者的操作,则说明已经造成损害。对于简单的应用程序来说,这种情况的影响并不大,但是对于日趋复杂的大型应用程序来说,攻击者利用构造函数发动攻击并非没有可能。performSelector
方法所使用的参数,通过此种方式创建一个意想不到且贯穿于整个应用程序的控制流路径,从而避开潜在的安全检查。UIApplicationDelegate
类中定义的方法签名匹配的任何函数。
func application(app: UIApplication, openURL url: NSURL, options: [String : AnyObject]) -> Bool {
...
let query = url.query
let pathExt = url.pathExtension
let selector = NSSelectorFromString(pathExt!)
performSelector(selector, withObject:query)
...
}
...
Dim ctl As String
Dim ao As new Worker
ctl = Request.Form("ctl")
If String.Compare(ctl,"Add") = 0 Then
ao.DoAddCommand Request
Else If String.Compare(ctl,"Modify") = 0 Then
ao.DoModifyCommand Request
Else
App.EventLog "No Action Found", 4
End If
...
...
Dim ctl As String
Dim ao As Worker
ctl = Request.Form("ctl")
CallByName ao, ctl, vbMethod, Request
...
if/else
代码段也完全删除了,而且还可以在不改变命令发送器的情况下增加新的命令类型。Worker
对象的方法。如果命令发送器仍对 access control 负责,那么,只要程序员在 Worker
类中创建了新方法,就必须修改发送器的 access control 代码。如果无法修改 access control 代码,那么一些 Worker
方法就不具有任何 access control 权限。Worker
对象负责执行 access control 检查。下面是一段重新修改的代码示例:
...
Dim ctl As String
Dim ao As Worker
ctl = Request.Form("ctl")
If ao.checkAccessControl(ctl,Request) = True Then
CallByName ao, "Do" & ctl & "Command", vbMethod, Request
End If
...
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE foo [
<!ELEMENT foo ANY >
<!ENTITY xxe SYSTEM "file:///c:/winnt/win.ini" >]><foo>&xxe;</foo>
- (void) parseSomeXML: (NSString *) rawXml {
BOOL success;
NSData *rawXmlConvToData = [rawXml dataUsingEncoding:NSUTF8StringEncoding];
NSXMLParser *myParser = [[NSXMLParser alloc] initWithData:rawXmlConvToData];
[myParser setShouldResolveExternalEntities:YES];
[myParser setDelegate:self];
}
rawXml
,该 XML 的形式如下所示:
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE foo [
<!ELEMENT foo ANY >
<!ENTITY xxe SYSTEM "file:///c:/boot.ini" >]><foo>&xxe;</foo>
boot.ini
文件的内容。
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE foo [
<!ELEMENT foo ANY >
<!ENTITY xxe SYSTEM "file:///dev/random" >]><foo>&xxe;</foo>
- (void) parseSomeXML: (NSString *) rawXml {
BOOL success;
NSData *rawXmlConvToData = [rawXml dataUsingEncoding:NSUTF8StringEncoding];
NSXMLParser *myParser = [[NSXMLParser alloc] initWithData:rawXmlConvToData];
[myParser setShouldResolveExternalEntities:YES];
[myParser setDelegate:self];
}
rawXml
,该 XML 的形式如下所示:
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE foo [
<!ELEMENT foo ANY >
<!ENTITY xxe SYSTEM "file:///c:/boot.ini" >]><foo>&xxe;</foo>
boot.ini
文件的内容。
...
<?php
$goodXML = $_GET["key"];
$doc = simplexml_load_string($goodXml);
echo $doc->testing;
?>
...
Example 2
中的代码:
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE foo [
<!ELEMENT foo ANY >
<!ENTITY xxe SYSTEM "file:///c:/boot.ini" >]><foo>&xxe;</foo>
boot.ini
文件的内容填充 <foo> 元素的内容。攻击者可能会利用返回到客户端的 XML 元素来窃取数据或获取有关网络资源是否存在的信息。
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE foo [
<!ELEMENT foo ANY >
<!ENTITY xxe SYSTEM "file:///dev/random" >]><foo>&xxe;</foo>
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE foo [
<!ELEMENT foo ANY >
<!ENTITY xxe SYSTEM "file:///etc/passwd" >]><foo>&xxe;</foo>
/etc/passwd
的内容并将它们包含在文档中。
def readFile() = Action { request =>
val xml = request.cookies.get("doc")
val doc = XMLLoader.loadString(xml)
...
}
func parseXML(xml: String) {
parser = NSXMLParser(data: rawXml.dataUsingEncoding(NSUTF8StringEncoding)!)
parser.delegate = self
parser.shouldResolveExternalEntities = true
parser.parse()
}
rawXml
内容,该 XML 的形式如下所示:
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE foo [
<!ELEMENT foo ANY >
<!ENTITY xxe SYSTEM "file:///c:/boot.ini" >]><foo>&xxe;</foo>
boot.ini
文件的内容。shoes
。
<order>
<price>100.00</price>
<item>shoes</item>
</order>
shoes
替换成 shoes</item><price>1.00</price><item>shoes
。新的 XML 如下所示:
<order>
<price>100.00</price>
<item>shoes</item><price>1.00</price><item>shoes</item>
</order>
<price>
标签中的值将会覆盖第一个 <price>
标签中的值。这样,攻击者就可以只花 1 美元购买一双价值 100 美元的鞋。shoes
。
<order>
<price>100.00</price>
<item>shoes</item>
</order>
shoes
替换成 shoes</item><price>1.00</price><item>shoes
。新的 XML 如下所示:
<order>
<price>100.00</price>
<item>shoes</item><price>1.00</price><item>shoes</item>
</order>
<price>
标签中的值将会覆盖第一个 <price>
标签中的值。这样,攻击者就可以只花 1 美元购买一双价值 100 美元的鞋。shoes
:
<order>
<price>100.00</price>
<item>shoes</item>
</order>
shoes
替换成 shoes</item><price>1.00</price><item>shoes
。新的 XML 如下所示:
<order>
<price>100.00</price>
<item>shoes</item><price>1.00</price><item>shoes</item>
</order>
<price>
标签中的值将会覆盖第一个 <price>
标签中的值。这样,攻击者就可以只花 1 美元购买一双价值 100 美元的鞋。shoes
。
<order>
<price>100.00</price>
<item>shoes</item>
</order>
shoes
替换成 shoes</item><price>1.00</price><item>shoes
。新的 XML 如下所示:
<order>
<price>100.00</price>
<item>shoes</item><price>1.00</price><item>shoes</item>
</order>
<price>
标签中的值将会覆盖第一个 <price>
标签中的值。这样,攻击者就可以只花 1 美元购买一双价值 100 美元的鞋。shoes
。
<order>
<price>100.00</price>
<item>shoes</item>
</order>
shoes
替换成 shoes</item><price>1.00</price><item>shoes
。新的 XML 如下所示:
<order>
<price>100.00</price>
<item>shoes</item><price>1.00</price><item>shoes</item>
</order>
shoes
。
<order>
<price>100.00</price>
<item>shoes</item>
</order>
shoes
替换成 shoes</item><price>1.00</price><item>shoes
。新的 XML 如下所示:
<order>
<price>100.00</price>
<item>shoes</item><price>1.00</price><item>shoes</item>
</order>
<price>
标签中的值将会覆盖第一个 <price>
标签中的值。这样,攻击者就可以只花 1 美元购买一双价值 100 美元的鞋。shoes
。
<order>
<price>100.00</price>
<item>shoes</item>
</order>
shoes
替换成 shoes</item><price>1.00</price><item>shoes
。新的 XML 如下所示:
<order>
<price>100.00</price>
<item>shoes</item><price>1.00</price><item>shoes</item>
</order>
<price>
标签中的值将会覆盖第一个 <price>
标签中的值。这样,攻击者就可以只花 1 美元购买一双价值 100 美元的鞋。
...
<?php
$goodXML = $_GET["key"];
$doc = simplexml_load_string($goodXml);
echo $doc->testing;
?>
...
Example 2
中的代码:
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE foo [
<!ELEMENT foo ANY >
<!ENTITY xxe SYSTEM "file:///c:/boot.ini" >]><foo>&xxe;</foo>
boot.ini
文件的内容填充 <foo> 元素的内容。攻击者可能会利用返回到客户端的 XML 元素来窃取数据或获取有关网络资源是否存在的信息。shoes
。
<order>
<price>100.00</price>
<item>shoes</item>
</order>
shoes
替换成 shoes</item><price>1.00</price><item>shoes
。新的 XML 如下所示:
<order>
<price>100.00</price>
<item>shoes</item><price>1.00</price><item>shoes</item>
</order>
<price>
标签中的值将会覆盖第一个 <price>
标签中的值。这样,攻击者就可以只花 1 美元购买一双价值 100 美元的鞋。shoes
。
<order>
<price>100.00</price>
<item>shoes</item>
</order>
shoes
替换成 shoes</item><price>1.00</price><item>shoes
。新的 XML 如下所示:
<order>
<price>100.00</price>
<item>shoes</item><price>1.00</price><item>shoes</item>
</order>
<price>
标签中的值将会覆盖第一个 <price>
标签中的值。这样,攻击者就可以只花 1 美元购买一双价值 100 美元的鞋。shoes
。
<order>
<price>100.00</price>
<item>shoes</item>
</order>
shoes
替换成 shoes</item><price>1.00</price><item>shoes
。新的 XML 如下所示:
<order>
<price>100.00</price>
<item>shoes</item><price>1.00</price><item>shoes</item>
</order>
<price>
标签中的值将会覆盖第一个 <price>
标签中的值。这样,攻击者就可以只花 1 美元购买一双价值 100 美元的鞋。shoes
。
<order>
<price>100.00</price>
<item>shoes</item>
</order>
shoes
替换成 shoes</item><price>1.00</price><item>shoes
。新的 XML 如下所示:
<order>
<price>100.00</price>
<item>shoes</item><price>1.00</price><item>shoes</item>
</order>
<price>
标签中的值将会覆盖第一个 <price>
标签中的值。这样,攻击者就可以只花 1 美元购买一双价值 100 美元的鞋。