打破C#实例化的批处理脚本以获得shell?

打破C#实例化的批处理脚本以获得shell?,c#,batch-file,dos,C#,Batch File,Dos,我正在尝试验证应用程序的安全性。场景如下: C#WinForms应用程序由有限的用户通过终端服务(没有桌面,只有应用程序)运行。这个C#app可以做的一件事就是执行一个批处理文件,该文件以提升的权限运行一个漫长的过程。我担心受限用户可能会中断批处理脚本(vua Ctrl+C或其他方法)并获得对底层提升shell的访问权 我自己也尝试过使用Ctrl+C和Ctrl+Break等多种组合来实现这一点。我所能得到的只是“终止批处理作业?(Y/N)”提示,如果您选择终止,则控制会立即返回到C应用程序(这很

我正在尝试验证应用程序的安全性。场景如下:
C#WinForms应用程序由有限的用户通过终端服务(没有桌面,只有应用程序)运行。这个C#app可以做的一件事就是执行一个批处理文件,该文件以提升的权限运行一个漫长的过程。我担心受限用户可能会中断批处理脚本(vua Ctrl+C或其他方法)并获得对底层提升shell的访问权

我自己也尝试过使用Ctrl+C和Ctrl+Break等多种组合来实现这一点。我所能得到的只是“终止批处理作业?(Y/N)”提示,如果您选择终止,则控制会立即返回到C应用程序(这很好)。我还没有找到打破这一局面的办法,但对我来说似乎很危险


有没有人知道一种方法可以突破C#实例化的批处理脚本,访问底层shell而不返回C#app?

没有,我想没有。但是如果你真的很担心,为什么不在
ProcessStartInfo
对象上设置
CreateNoWindow
属性来阻止用户交互呢?

这不是对你描述的场景的回答,而是另一种看待它的方式


如果可能的话,我会有一个“作业服务器”,负责运行终端服务运行应用程序创建的作业。然后,您将通过WCF将作业(或只是it参数)传递给服务器。用户将无法访问服务器,也无法控制作业(可能只是一个取消选项和成功/失败状态报告)。

您可以这样做(通过应用程序上的文本框)

然后,您可以看到批处理的结果,而用户根本看不到窗口,这样,它只能作为一个进程显示,所以他们不能中断它


用户是否可以在批处理文件运行时执行任何操作来覆盖该批处理文件?如果您使用
process.start(“cmd.exe脚本”、…、…、…)
启动该批处理文件,请确保用户无法伪造cmd.exe或脚本。建议不错。我们希望有限的用户能够看到从批处理文件打印的消息,并可能与批处理文件交互(有限的用户是一个tier-1支持组)。我们可以包装外壳,重定向输入/输出流,并在其中添加一些安全性,但我必须证明当前方案不安全,然后才能证明这一努力的合理性。
ProcessStartInfo info = new ProcessStartInfo();
info.Arguments = "/C ping 127.0.0.1";
info.WindowStyle = ProcessWindowStyle.Hidden;
info.CreateNoWindow = true;
info.FileName = "cmd.exe";
info.UseShellExecute = false;
info.RedirectStandardOutput = true;
using (Process process = Process.Start(info))
{
    using (StreamReader reader = process.StandardOutput)
    {
        string result = reader.ReadToEnd();
        textBox1.Text += result;
    }
}