作者:小华 QQ:56111981 www.hackbase.com |
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漏洞应该属于此类。
本人在这方面也只能起个抛砖引玉的作用.