我正在尝试编写一个故意容易受命令注入影响的页面。这适用于培训环境。这是我到目前为止的代码:
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
它会返回一个空白。
我所期待的是它会从域查找返回结果,然后是dir
命令的输出。
答案 0 :(得分:3)
您将命令直接传递给CreateProcess函数。此函数绕过命令行解释器cmd.exe。
如果你想让cmd.exe处理事情,那么将整个命令(就像你输入的那样)作为参数传递,并使用cmd.exe作为进程名称......
ProcessStartInfo psi = new ProcessStartInfo("cmd.exe", "nslookup.exe " + domain)
{
UseShellExecute = false,
CreateNoWindow = true,
RedirectStandardOutput = true
};
答案 1 :(得分:3)
在这种情况下拍摄自己并不容易,但你可以像这样:
ProcessStartInfo psi = new ProcessStartInfo("cmd.exe", "/c \"nslookup.exe " + domain + "\"")
{
UseShellExecute = false,
CreateNoWindow = true,
RedirectStandardOutput = true
};