传递引号字符 (") 作为 C# 控制台应用程序参数
Passing Quotation Mark Character (") as C# Console Application Argument
我有一个项目来演示类似于 MS-DOS 命令行中的 "echo" 命令的程序。这是 C# 中的代码:
using System;
namespace arguments
{
class Program
{
static void Main(string[] args)
{
try
{
switch (args[0])
{
case "/?":
string location = System.Reflection.Assembly.GetEntryAssembly().Location;
string name = System.IO.Path.GetFileName(location);
Console.WriteLine("Displays messages\nSyntax: {0} [message]", name);
Environment.Exit(0);
break;
}
if (args.Length >= 0)
{
string x = "";
foreach (var item in args)
{
x += item.ToString() + " ";
}
Console.WriteLine(Convert.ToString(x)); // this should eliminate vulnerabilities.
}
}
catch
{
string location = System.Reflection.Assembly.GetEntryAssembly().Location;
string name = System.IO.Path.GetFileName(location);
Console.WriteLine("Displays messages\nSyntax: {0} [message]", name);
}
}
}
}
这在完成它应该做的事情方面做得非常有效。然后我开始尝试以任何可能的方式利用它。
在命令提示符下,我运行 arguments.exe "
,这应该打印出"
。但事实并非如此。然后我用 运行 echo "
的 echo
命令尝试了同样的操作,它就像它应该的那样打印出 "
。这令人难以置信,因为我什至不认为这会是一个问题。我无法让它构成很大的威胁,只是让我困惑了一分钟。
我的问题是,有没有办法将引号 ("
) 作为参数传递给此控制台应用程序?
这里有一张图片可以更好地展示它:http://prntscr.com/cm9yal
为了能够获得单引号,您需要绕过 CLR 在填充 args 数组时执行的默认解析。你可以通过检查 Environment.CommandLine
来做到这一点,在你上面描述的情况下,这将 return 类似于:
ConsoleApplication1.exe \"
注意,我传递的参数只是 "
(不是显示的转义变体)。
void Main(string[] args)
args
数组包含已传递给您的应用程序的参数。因为参数可能有空格,所以它们可以用引号括起来。
因此,您不会获得作为参数放置的字符串。您还将在引用的参数之间丢失任意数量的空格。
如果您需要原始命令行字符串,请使用:
string cmdline = System.Environment.CommandLine;
我有一个项目来演示类似于 MS-DOS 命令行中的 "echo" 命令的程序。这是 C# 中的代码:
using System;
namespace arguments
{
class Program
{
static void Main(string[] args)
{
try
{
switch (args[0])
{
case "/?":
string location = System.Reflection.Assembly.GetEntryAssembly().Location;
string name = System.IO.Path.GetFileName(location);
Console.WriteLine("Displays messages\nSyntax: {0} [message]", name);
Environment.Exit(0);
break;
}
if (args.Length >= 0)
{
string x = "";
foreach (var item in args)
{
x += item.ToString() + " ";
}
Console.WriteLine(Convert.ToString(x)); // this should eliminate vulnerabilities.
}
}
catch
{
string location = System.Reflection.Assembly.GetEntryAssembly().Location;
string name = System.IO.Path.GetFileName(location);
Console.WriteLine("Displays messages\nSyntax: {0} [message]", name);
}
}
}
}
这在完成它应该做的事情方面做得非常有效。然后我开始尝试以任何可能的方式利用它。
在命令提示符下,我运行 arguments.exe "
,这应该打印出"
。但事实并非如此。然后我用 运行 echo "
的 echo
命令尝试了同样的操作,它就像它应该的那样打印出 "
。这令人难以置信,因为我什至不认为这会是一个问题。我无法让它构成很大的威胁,只是让我困惑了一分钟。
我的问题是,有没有办法将引号 ("
) 作为参数传递给此控制台应用程序?
这里有一张图片可以更好地展示它:http://prntscr.com/cm9yal
为了能够获得单引号,您需要绕过 CLR 在填充 args 数组时执行的默认解析。你可以通过检查 Environment.CommandLine
来做到这一点,在你上面描述的情况下,这将 return 类似于:
ConsoleApplication1.exe \"
注意,我传递的参数只是 "
(不是显示的转义变体)。
void Main(string[] args)
args
数组包含已传递给您的应用程序的参数。因为参数可能有空格,所以它们可以用引号括起来。
因此,您不会获得作为参数放置的字符串。您还将在引用的参数之间丢失任意数量的空格。
如果您需要原始命令行字符串,请使用:
string cmdline = System.Environment.CommandLine;