最近非常想找个项目做一下,一方面可以积累些项目经验,另外也可增加点实战知识。。。为年后找工作铺垫一下,毕竟现在没有项目经验自己心里都有点底气不足~
xp_cmdshell 是黑客们喜欢使用的一个存储过程,当然默认情况下是禁用的(如何启用就不要问我了)。如果有SQL的SA权限,使用这个存储过程可以非常轻易的获取 Windows 系统的管理员权限,比如:xp_cmdshell "net user tstuser /add",就给 Windows 系统增加了一个用户,然后再 net LOCALGROUP administrators tst /add 就把 tst 用户的权限提升为 administrators 了,微软在方便的用户的同时也给系统管理员带来了不少麻烦,这大概不是初衷。
其实在 windows 2000 以后的 windows 平台上对权限的分配已经是非常严谨了,不是随随便便就可以执行这些高级命令的。。。闲话到此为止!
闲来无事写的这段代码,其实没有什么实际意义(学习例外),因为在 .net 平台中 ASP.NET 的运行权限是 PowerUser 组,所以当这段代码传到虚拟空间上的时候是不能执行的,不过作为参考学习一下,还是可以看看!
Code
/// <summary>
/// 利用 xp_cmdshell 命令返回 dos 命令结果
/// </summary>
/// <param name="command">dos 命令</param>
/// <returns>DataSet 类型</returns>
DataSet GetCmdShell(string command)
{
SqlConnection cn = new SqlConnection(cns);
DataSet ds = new DataSet();
DataTable dt = new DataTable();
try
{
SqlCommand cmd = new SqlCommand();
cmd.Connection = cn;
cmd.CommandText = "xp_cmdshell";
cmd.CommandType = CommandType.StoredProcedure;
SqlParameter param = new SqlParameter("@command", SqlDbType.NVarChar, 1000);
param.Value = command;
//添加 DOS 命令
cmd.Parameters.Add(param);
SqlDataReader reader;
cn.Open();
reader = cmd.ExecuteReader(CommandBehavior.CloseConnection);
int fieldCount = reader.FieldCount;
//添加表的字段名称和类型
for (int i = 0; i < fieldCount; i++)
dt.Columns.Add(reader.GetName(i), reader.GetFieldType(i));
object[] values = new object[fieldCount];
while (reader.Read())
{
//循环添加每一行记录到 DataTable
reader.GetValues(values);
dt.LoadDataRow(values, true);
}
reader.Close();
cmd.Dispose();
dt.EndLoadData();
}
catch (Exception ex)
{
Response.Write(ex.Message);
}
ds.Tables.Add(dt);
return ds;
}
/// <summary>
/// 利用 xp_cmdshell 命令返回 dos 命令结果
/// </summary>
/// <param name="command">dos 命令</param>
/// <returns>DataSet 类型</returns>
DataSet GetCmdShell(string command)
{
SqlConnection cn = new SqlConnection(cns);
DataSet ds = new DataSet();
DataTable dt = new DataTable();
try
{
SqlCommand cmd = new SqlCommand();
cmd.Connection = cn;
cmd.CommandText = "xp_cmdshell";
cmd.CommandType = CommandType.StoredProcedure;
SqlParameter param = new SqlParameter("@command", SqlDbType.NVarChar, 1000);
param.Value = command;
//添加 DOS 命令
cmd.Parameters.Add(param);
SqlDataReader reader;
cn.Open();
reader = cmd.ExecuteReader(CommandBehavior.CloseConnection);
int fieldCount = reader.FieldCount;
//添加表的字段名称和类型
for (int i = 0; i < fieldCount; i++)
dt.Columns.Add(reader.GetName(i), reader.GetFieldType(i));
object[] values = new object[fieldCount];
while (reader.Read())
{
//循环添加每一行记录到 DataTable
reader.GetValues(values);
dt.LoadDataRow(values, true);
}
reader.Close();
cmd.Dispose();
dt.EndLoadData();
}
catch (Exception ex)
{
Response.Write(ex.Message);
}
ds.Tables.Add(dt);
return ds;
}