如何寻找WEB程序漏洞,及如何利用和防范

网络安全是一个非常流行的话题,不论是这方面的专家还是一个普通人,都或多或少涉及其中。
在此环境下,入侵也变得前所未有的活跃。每个人都想成为这领域的高手。
入侵分几个方面,现在以SQL注入和溢出最为流行。我在此浅谈一下SQL注入的相关问题。
  其实SQL注入和溢出有异曲同工之妙,都是利用不按正常思维来达到入侵的目的。简单的说就是程序作者想得没有入侵者想得全面,不乏有些作者水平很高,但想投机取巧。
SQL注入简单的理解就是构造特殊的SQL语句,让数据库执行,数据库可以是任何一种。现今注入漏洞层出不穷,似乎没有一个安全的WEB系统。不论国内和国外,隔三岔五报道类似文章。
小菜惊叹作者思路巧妙的同时,心中充满敬畏和感慨。要是我也能公布几个漏洞该多好!
本人就把自己的一些心得写出来分享一下,希望能促成大家快速由菜鸟变成苍鹰。


一 如何寻找漏洞
  这个是大家最关心的。大家寻找漏洞只能寻找能读到源代码码的,没有源代码但有注入漏洞的系统只能猜,具有特殊性。网上很多主机用的是成品,它的系统源代码可以从网上下到。至于如何判断主机用的是哪个系统,就需要大家有一定的积累了。这也没法用语言描述,我举个简单的例子。
以动网6为例,看到某个论坛界面酷似动网,9成是动网论坛,再看看下面的版本就知道是动网6了。这个时候就可以去Chinaz下个动网6来读一下,不会ASP的就没办法了。当然漏洞早就公布,我只是告诉大家如何判断主机用哪个WEB系统。
  漏洞是如何被发现的呢?其实也没什么诀窍,主要是扎实的基础知识,要是连HTTP协议不懂,不会抓包,也别找漏洞了,找到也不会用,这样最好先补基础知识。有了基础知识,剩下的就是毅力和耐心。论能力,现在好多系统漏洞,张三找的到,李四也找的到。
  主要是看谁先找,谁下的工夫深。有的漏洞读一遍源码是找不到的。
  找漏洞的过程也是熟悉这个WEB系统的过程,首先要了解它的数据库结构,这是最基本的。接下来就得一个文件一个文件的读。先读不需要权限的。
  有的页面开头就来个SESSION判断,就算下面有漏洞都没用。
找漏洞的过程其实就是一个文件一个文件读的过程。下面以一个页面为例。

  首先把握系统流程。所谓系统的流程就是系统到底如何执行。一般系统为 开头——中间——结尾 模式。开头一般是输出HTML中<HEAD></HEAD>之间内容,对我们找漏洞没有影响。
一般文件开头都会包含很多头文件,大家看了感到头晕,其实头文件都没什么用。主要是数据库连接文件,  全局配置文件,和函数库。我们大可不理会这些东西,再找漏洞时用到了回头再看也不迟。
但是函数库里面关于输入串过滤的函数要重点看一下。
  结尾是输出系统版权信息,有的用到SQL查询,不过这里用处也不大,我们可以很粗略的看一下。
中间部分是我们重点关注的地方。

  其次重点关注输入变量。因为这些变量是我们控制的,没有外来输入变量也不用谈注入了。
大家要有这样一种概念,不管是GET,POST,还是COOKIE方法,只有是从用户提交的变量都可以由我们指定,我们想让它是多少就是多少。
  至于系统取得变量后做了什么过滤是另外一回事。
  在输入变量中要重点关注能参与SQL执行的变量,有的变量比如action或者page都是控制流程的,根本就没用,就算改了值也没什么意思。

  再者就要深刻了解数据库了,没有对数据库全面的把握,很可能错失很多注入点,这也是高手和菜鸟最大的差别所在。
  我们常见的数据库有Access、Mysql和SQLServer,至少要对他们有很深的了解才能找出漏洞。

二 分三个方面并举实例讲解注入点的寻找及利用 
 1 注入点很容易发现,利用也很简单
  这种漏洞相信已经很少了,除非程序作者根本就不关心程序的安全才会有此漏洞。以前经典的 ' or '1=1就属于此类
  典型的类似(模型,以下类同)
select * from tablename where user='request("user")',
select * from tablename where id=request("id")
  有的程序对这些变量做了过滤,但不全,也可以归结为这一类。
  相信这样的漏洞大家都能发现而且也很容易利用,更不用说防范了。这种漏洞容易找,也很少。我给大家截了几个有漏洞的图,是几个系统存在的类似漏洞。
图一
  动网某插件更改密码注入漏洞
图二
  某PHP插件ftpid 变量未过滤漏洞
 2 注入点容易发现,但利用相对困难
  这种漏洞是注入需要很高技巧的,作者也基本不可能避免。
典型的类似

 select * from tablename where user='FilterFunc(request("user"))'
 select * from tablename where id=FilterFunc(request("id"))

  也就是把输入的变量做了过滤,但未过滤全,有一线生机。尤其是没过滤引号。这种利用确实存在,大家不要看着简单。
  有个程序只过滤了空格,比如以前的BBSXP系统。尤其当用户提交的数据是用COOKIE的时候,作者更有恃无恐,做了简单的过滤。

  首先谈如何防范,我给大家一个PHP例子。
function getRequestVariables()
{
   foreach ($_POST as $postKey => $postValue)
   {
       global $$postKey;
       $$postKey = filter(trim ($postValue)));
   }
   foreach ($_GET as $getKey => $getValue)
   {
        global $$getKey;
        $$getKey = filter(trim($getValue)));
      
   }
}

  思想就是把所有的变量都用这个函数进行常规的提前过滤,不是所有符号都过滤,每个变量需要输入的数据不一样。做了过滤之后,可以在具体页面进行二次过滤,目的就是防止写程序时忘记过滤,有一次过滤使损失减到最少。
ASP也可以使用类似方法。
  前几天惊云下载系统 edti.asp文件就属于此类。既然注入点容易发现,那就要谈如何利用。
拿  select * from tablename where id=FilterFunc(request("id")) 为例,如果系统只过滤了单引号,和诸如"exec declare // -- ; "等,我们同样就可以猜测用户名密码(这些是建立在我们知道系统数据库结构的基础上).
  假如系统表名为 admin,用户字段为username,密码字段为password,那么我们可以构造以下查询(适合各种数据库,只是函数不一样)。

  猜测用户名密码长度
select * from tablename where id=1 and (select count(*) from admin where id=1 and len(username)=1)=1
   以上ID=1是指定的,根据具体情况变化,如果注入上面的内容返回为真(再解释),说明ID为1的用户名为1,为假就继续猜,我想基本不会在20个长度以上(如果是,那个人太变态了)。密码同样方法。猜测字符也类似。
  MYSQL中情况有点不一样,因为MYSQL不支持子查询(5.0不清楚)。MYSQL要用下面的方法(系统得支持UNION,现在有很多系统支持):
select * from tablename where id=1111111 union select [字段匹配] from admin where id=1
  上面的字段匹配表示要和tablename的字段数目一致,MYSQL列类型检查非常送,有null即可完成匹配,上面的方法可以让系统暴露敏感信息。
比如
select a,b,c from tablename where id=1111111 union select null,username,null from admin where id=1

  至于上面所提到的返回为真概念是想当广泛的。可以是服务器返回标志,如HTTP 500就是内部错误,还有根据页面的返回,这种类太多要自己体会。


 3 注入点非常隐蔽,只要找到就能利用

  这种漏洞就需要很深的功底和长期积累的技巧了。漏洞很少,但发现之后影响很广。前期动网USER-AGENT注入漏洞和BBSXP5.0sq1漏洞应该属于此类。
本人在这方面也只能起个抛砖引玉的作用.

作者:小花 QQ:56111981(小华)http://xiaohuar.blogchina.com 

转载必须注明出处
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值