輸入驗證和表示法問題是由中繼字元、替代編碼和數值表示法引起的。信任輸入會導致安全問題。問題包括:「Buffer Overflows」、「Cross-Site Scripting」攻擊、「SQL Injection」及其他許多問題。
...
String address = request.getParameter("address");
Properties props = new Properties();
props.put(Provider_URL, "rmi://secure-server:1099/");
InitialContext ctx = new InitialContext(props);
ctx.lookup(address);
...
string name = Request["username"];
string template = "Hello @Model.Name! Welcome " + name + "!";
string result = Razor.Parse(template, new { Name = "World" });
...
operation
是良性的值時 (例如「John」),程式會正常運作;在此案例中,result
變數指定的值是「Hello World!Welcome John!」。不過,如果攻擊者指定同時為有效且惡意的語言作業,則會使用父系程序的完整權限來執行那些作業。當主要語言提供系統資源的存取權限或允許執行系統指令時,這類攻擊會更加危險。舉例來說,Razor 允許呼叫 C# 物件,如果攻擊者指定「@{ System.Diagnostics.Process proc = new System.Diagnostics.Process(); proc.EnableRaisingEvents=false; proc.StartInfo.FileName=\"calc\"; proc.Start(); }」 做為 name
的值,則會在主機系統上執行系統指令。
...
ScriptEngineManager scriptEngineManager = new ScriptEngineManager();
ScriptEngine scriptEngine = scriptEngineManager.getEngineByExtension("js");
userOps = request.getParameter("operation");
Object result = scriptEngine.eval(userOps);
...
operation
參數是良性值時,例如「8 + 7 * 2」,程式會正常運作。在此情況下,會指定 result
變數的值為 22。不過,如果攻擊者指定有效且惡意的語言作業,則會使用父系程序的完整權限來執行這些作業。當主要語言提供系統資源的存取權限或允許執行系統指令時,這類攻擊會更加危險。例如,JavaScript 允許叫用 Java 物件,如果攻擊者指定「java.lang.Runtime.getRuntime().exec("shutdown -h now")」作為 operation
的值,則會在主機系統上執行關機指令。
...
userOp = form.operation.value;
calcResult = eval(userOp);
...
operation
參數是良性值時,例如「8 + 7 * 2」,程式會正常運作。在此情況下,會指定 calcResult
變數的值為 22。不過,如果攻擊者指定有效且惡意的語言作業,則會使用父系程序的完整權限來執行這些作業。當主要語言提供系統資源的存取權限或允許執行系統指令時,這類攻擊會更加危險。在 JavaScript 案例中,攻擊者可能使用此弱點執行 Cross-site scripting 攻擊。
...
strUserOp = Request.Form('operation')
strResult = Eval(strUserOp)
...
operation
的範例。strResult
變數所回傳的值為 22。但是,如果使用者指定其他有效的語言作業,不僅會執行那些作業,還會使用父系程序的完整權限來執行。當基本語言提供系統資源的存取權限或允許執行系統指令時,執行任意的程式碼會變得更加危險。例如:如果攻擊者將 operation
指定為「Shell('C:\WINDOWS\SYSTEM32\TSSHUTDN.EXE 0 /DELAY:0 /POWERDOWN')」,則可能會在主機系統上執行關閉指令。Delegate
欄位可能會在還原序列化該類別之時或之後引發任意程式碼執行弱點。Delegate
類型用於保留方法呼叫的參考,該方法呼叫可於稍後在使用者程式碼中叫用。.NET 會使用自訂的序列化方法來序列化 Delegate
類型,並利用 System.DelegateSerializationHolder
類別來儲存附加至或歸屬於 Delegate
的方法資訊。因此,Delegate
物件的已序列化串流不適合持續性儲存或傳遞至遠端應用程式,因為攻擊者可以將方法資訊取代為指向惡意物件圖形的方法資訊,這會在還原序列化之時或之後叫用時導致任意程式碼執行弱點。Delegate
欄位,並且會在 Executor
方法中叫用:
...
[Serializable]
class DynamicRunnner
{
Delegate _del;
string[] _arg;
public DynamicRunnner(Delegate dval, params string[] arg)
{
_del = dval;
_arg = arg;
}
public bool Executor()
{
return (bool)_del.DynamicInvoke(_arg);
}
}
...
Example 1
中提及之類別的不受信任的串流,攻擊者將方法資訊取代為指向 Process.Start
的方法資訊,將會導致在呼叫 Executor
方法時建立任意程序。BeanUtilsHashMapper
來還原序列化 Redis 雜湊,這樣做可能會讓攻擊者控制此類雜湊來執行任意程式碼。
HashMapper<Person, String, String> hashMapper = new BeanUtilsHashMapper<Person>(Person.class);
Person p = hashMapper.fromHash(untrusted_map);
EnableViewStateMac
屬性的設定,因為它會在應用程式中引入遠端程式碼執行弱點。但是,開發人員可以使用 aspnet:AllowInsecureDeserialization
設定覆寫此功能,並因此使應用程式易受遠端程式碼執行的攻擊。aspnet:AllowInsecureDeserialization
設定為 true
。
<appSettings>
<add key="aspnet:AllowInsecureDeserialization" value="true" />
</appSettings>
Low
和 Full
。Low
(預設值) 透過僅還原序列化與最基本的遠端處理功能關聯的類型 (例如,自動還原序列化遠端基礎架構類型、一組有限的系統實作的類型和一組基本的自訂類型) 來防止還原序列化攻擊。Full
還原序列化層級支援在所有情況下遠端處理支援的所有類型的自動還原序列化。typeFilterLevel
設定為 Full
。
<system.runtime.remoting>
<application>
<channels>
<channel ref="tcp" port="2000">
<serverProviders>
<formatter ref="soap" typeFilterLevel="Full" />
<formatter ref="binary" typeFilterLevel="Full" />
</serverProviders>
<clientProviders>
<formatter ref="binary"/>
</clientProviders>
</channel>
</channels>
</application>
...
</system.runtime.remoting>
TestService
方法。範例 2:JMSInvokerServiceExporter 暴露
<bean id="testService" class="example.TestServiceImpl"/>
<bean class="org.springframework.remoting.rmi.RmiServiceExporter">
<property name="serviceName" value="TestService"/>
<property name="service" ref="testService"/>
<property name="serviceInterface" value="example.TestService"/>
<property name="registryPort" value="1199"/>
</bean>
TestService
方法。範例 3:HTTPInvokerServiceExporter 暴露
<bean id="testService" class="example.TestServiceImpl"/>
<bean class="org.springframework.jms.remoting.JmsInvokerServiceExporter">
<property name="serviceInterface" value="example.TestService"/>
<property name="service" ref="testService"/>
</bean>
TestService
方法。
<bean id="testService" class="example.TestServiceImpl"/>
<bean class="org.springframework.remoting.httpinvoker.HttpInvokerServiceExporter">
<property name="serviceInterface" value="example.TestService"/>
<property name="service" ref="testService"/>
</bean>
The pickle module is not intended to be secure against erroneous or maliciously constructed data. Never unpickle data received from an untrusted or unauthenticated source.
__reduce__
方法聲明其應如何還原序列化。此方法應傳回 callable
及其引數。Pickle 將使用提供的引數呼叫 callable 來建構新物件,允許攻擊者執行任意指令。