下面的代码片段来自ASP.NET MVC应用程序。它接受来自浏览器的所有参数。我相信它很脆弱。
我正在测试应用程序的安全性,它使用Invoke方法,但是从用户的输入中动态接受Object类型,方法和参数。我认为这很危险,我试图证明这一点。
您认为我可以调用Console.Write或执行某种任意/危险的代码吗?
我想尝试使用C#Invoke方法写入控制台来证明漏洞。这就是我所做的:
static void Main(string[] args)
{
Type magicType = Type.GetType("System");
ConstructorInfo magicConstructor = magicType.GetConstructor(Type.EmptyTypes);
object magicClassObject = magicConstructor.Invoke(new object[] { });
MethodInfo magicMethod = magicType.GetMethod("Console.Write");
object magicValue = magicMethod.Invoke(magicClassObject, new object[] { 100 });
}
但它不起作用。它说对象没有初始化。我错过了什么?
答案 0 :(得分:4)
System
不是类型,它是名称空间。您实际上在寻找System.Console
,这是控制台类。之后,您正在寻找具有正确重载的WriteLine
方法,该方法需要int
,这是您传递给Type.GetMethod
的方法。只有这样,您才可以使用MethodInfo
作为对象(因为这是Invoke
类)和正确的参数来调用null
对象。
你真正想要的是:
static