故意编写易受命令注入攻击的页面
Coding a page intentionally vulnerable to command injection
我正在尝试编写一个故意容易受到命令注入攻击的页面。这是一个训练环境。这是我目前的代码:
public ActionResult CommandInjection()
{
string domain = Request.QueryString["domain"];
ViewBag.Domain = domain;
ProcessStartInfo psi = new ProcessStartInfo("nslookup.exe", domain)
{
UseShellExecute = false,
CreateNoWindow = true,
RedirectStandardOutput = true
};
var proc = Process.Start(psi);
string result = proc.StandardOutput.ReadToEnd();
ViewBag.Msg = "This page is vulnerable to Command Injection";
ViewBag.Result = result;
return View();
}
当它看到一个正常的域查找请求时,它似乎工作正常。
但是,当它看到这样的请求时:
http://localhost:50159/Home/CommandInjection?domain=www.google.com+%26+dir
它return是一个空白。
我所期望的是 return 域查找的结果,然后是 dir
命令的输出。
您正在将命令直接传递给 CreateProcess 函数。此函数绕过 command-line 解释器 cmd.exe.
如果您希望 cmd.exe 处理事情,则将整个命令(如您键入的那样)作为参数传递并使用 cmd.exe 作为进程名称...
ProcessStartInfo psi = new ProcessStartInfo("cmd.exe", "nslookup.exe " + domain)
{
UseShellExecute = false,
CreateNoWindow = true,
RedirectStandardOutput = true
};
在这种情况下搬起石头砸自己的脚并不容易,但你可以,像这样:
ProcessStartInfo psi = new ProcessStartInfo("cmd.exe", "/c \"nslookup.exe " + domain + "\"")
{
UseShellExecute = false,
CreateNoWindow = true,
RedirectStandardOutput = true
};
我正在尝试编写一个故意容易受到命令注入攻击的页面。这是一个训练环境。这是我目前的代码:
public ActionResult CommandInjection()
{
string domain = Request.QueryString["domain"];
ViewBag.Domain = domain;
ProcessStartInfo psi = new ProcessStartInfo("nslookup.exe", domain)
{
UseShellExecute = false,
CreateNoWindow = true,
RedirectStandardOutput = true
};
var proc = Process.Start(psi);
string result = proc.StandardOutput.ReadToEnd();
ViewBag.Msg = "This page is vulnerable to Command Injection";
ViewBag.Result = result;
return View();
}
当它看到一个正常的域查找请求时,它似乎工作正常。
但是,当它看到这样的请求时:
http://localhost:50159/Home/CommandInjection?domain=www.google.com+%26+dir
它return是一个空白。
我所期望的是 return 域查找的结果,然后是 dir
命令的输出。
您正在将命令直接传递给 CreateProcess 函数。此函数绕过 command-line 解释器 cmd.exe.
如果您希望 cmd.exe 处理事情,则将整个命令(如您键入的那样)作为参数传递并使用 cmd.exe 作为进程名称...
ProcessStartInfo psi = new ProcessStartInfo("cmd.exe", "nslookup.exe " + domain)
{
UseShellExecute = false,
CreateNoWindow = true,
RedirectStandardOutput = true
};
在这种情况下搬起石头砸自己的脚并不容易,但你可以,像这样:
ProcessStartInfo psi = new ProcessStartInfo("cmd.exe", "/c \"nslookup.exe " + domain + "\"")
{
UseShellExecute = false,
CreateNoWindow = true,
RedirectStandardOutput = true
};