(注:本文示例仅作学习交流之用)

SQL注入是web开发者在日常开发中最容易犯的错误,很多童鞋都了解SQL INJECTION并且知道怎么去防范它,但是对于它的危害性认识不足,所以开发过程中稍有疏忽还是会留下漏洞。本文就不叙述什么是sql injection(SQL注入)了,而是通过一个互联网上的真实案例来分析下sql injection到底有哪些危害性,***者拿到这些漏洞到底能干些什么。
首先,互联网每天都有很多无聊人士用各种工具扫描你的网站漏洞,所以不要抱着侥幸的心里,你的任何一个程序漏洞都有可能成为***窃取你信息的大门!比如下面这个某网站的投票系统:

我们在url后面加个非法字符(单引号)试试看能不能解析出来。

 

我们看到页面显示了一个空的投票页面,表面程序接收了带非法字符的参数,但是数据库没有查找到对应记录。

我们再试试用or关键字来构建sql语句。我们假设该投票页面使用了类似下面的语句:

 

 
  
  1. SELECT * FROM vote WHERE voteid=$_GET['res_id']; 

加入or后sql语句变成了这样:

 
  
  1. SELECT * FROM vote WHERE voteid=$_GET['res_id'or 1=1; 

由于后面的表达式恒成立,所以执行该条语句后的结果就是$_GET['res_id']对应的那条记录和vote表(假设存在的表)里的所有记录。我们看看实际效果:

 

页面显示了所有的投票表里的数据,直接把我的浏览器给卡死了- –  ,看来该程序确实存在sql injection漏洞,下面我们来看看通过这个漏洞能***者能获得什么信息。

一般***者除了能够获得漏洞表里的数据以外(通常用处不大),会通过sql的union语法来得到数据库里面其他表,甚至是同台机器上其他数据库里的数据(帐号共享的情况下),sql union语法的作用是把2条sql查询的结果合并起来,有一个限制条件,2条语句返回的字段个数必须一直,否则会报错,典型的语法如下:

 

 
  
  1. SELECT 1,2,3,4,5 FROM A UNION SELECT 6,7,8,9,10 FROM B; 

 

通过上面的语法我们可以知道,要想union到其他表上的数据,我们必须得到两样东西:

1.前面的sql语句到底使用了几个字段,也就是程序作者在生成投票的时候从vote表里面取了几个字段。

2.TABLE B的表名。这个时候可以利用mysql的information_schema库了,这个库用视图的方式存储了mysql数据表的一些基本信息,一般情况下,所有用户都可以访问到这个库的部分信息。我们这里使用tables这个表,该表存储了数据库所有表的信息,跟我们执行show table status的结果类似。

根据第二点,我们可以构建sql语句来慢慢尝试到底第一点里面是取了几个字段,比如在地址后面加上

 
  
  1. union select 1 from information_schema.tables 

如果字段数不匹配,sql语句会出错导致没有任何结果显示:

尝试到5个字段的时候,页面显示正确结果了

 

把字段4换成table_name就可以顺利得到数据库里面其他的表名了。后面的演示就不再继续了,***者可以继续***得到表字段名直接读取数据,万一库里面放了用户表,那就会造成很大的影响了。

sql injection更大的危害就是***者不仅可以获取你的网站数据,还可以直接生成网站后门,后门程序可以得到web用户的所有权限,包括对数据库的增删改查,文件的修改等。

因为mysql支持select .. into outfile的功能可以将数据写入到某文件里面.

综上所述,sql injection的确能给web应用带来致命的危害。其实我们平时写程序的时候多多注意变量初始化以及变量的过滤,还是很容易防范的。千万不能因为一时方便而忽略这些细节!

本文仅作抛砖引玉之用,欢迎大家一起讨论。