SQL注入是web开发者在日常开发中最容易犯的错误,很多童鞋都了解SQL INJECTION并且知道怎么去防范它,但是对于它的危害性认识不足,所以开发过程中稍有疏忽还是会留下漏洞。本文就不叙述什么是sql injection(SQL注入)了,而是通过一个互联网上的真实案例来分析下sql injection到底有哪些危害性,攻击者拿到这些漏洞到底能干些什么。
首先,互联网每天都有很多无聊人士用各种工具扫描你的网站漏洞,所以不要抱着侥幸的心里,你的任何一个程序漏洞都有可能成为黑客窃取你信息的大门!比如下面这个某网站的投票系统:
我们在url后面加个非法字符(单引号)试试看能不能解析出来。
我们看到页面显示了一个空的投票页面,表面程序接收了带非法字符的参数,但是数据库没有查找到对应记录。
我们再试试用or关键字来构建sql语句。我们假设该投票页面使用了类似下面的语句:
SELECT * FROM vote WHERE voteid=$_GET['res_id'];
加入or后sql语句变成了这样:
SELECT * FROM vote WHERE voteid=$_GET['res_id'] or 1=1;
由于后面的表达式恒成立,所以执行该条语句后的结果就是$_GET['res_id']对应的那条记录和vote表(假设存在的表)里的所有记录。我们看看实际效果:
页面显示了所有的投票表里的数据,直接把我的浏览器给卡死了- – ,看来该程序确实存在sql injection漏洞,下面我们来看看通过这个漏洞能攻击者能获得什么信息。
一般攻击者除了能够获得漏洞表里的数据以外(通常用处不大),会通过sql的union语法来得到数据库里面其他表,甚至是同台机器上其他数据库里 的数据(帐号共享的情况下),sql union语法的作用是把2条sql查询的结果合并起来,有一个限制条件,2条语句返回的字段个数必须一直,否则会报错,典型的语法如下:
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语句来慢慢尝试到底第一点里面是取了几个字段,比如在地址后面加上
union select 1 from information_schema.tables
如果字段数不匹配,sql语句会出错导致没有任何结果显示:
尝试到5个字段的时候,页面显示正确结果了
把字段4换成table_name就可以顺利得到数据库里面其他的表名了。后面的演示就不再继续了,攻击者可以继续渗透得到表字段名直接读取数据,万一库里面放了用户表,那就会造成很大的影响了。
sql injection更大的危害就是攻击者不仅可以获取你的网站数据,还可以直接生成网站后门,后门程序可以得到web用户的所有权限,包括对数据库的增删改查,文件的修改等。
因为mysql支持select .. into outfile的功能可以将数据写入到某文件里面.
综上所述,sql injection的确能给web应用带来致命的危害。其实我们平时写程序的时候多多注意变量初始化以及变量的过滤,还是很容易防范的。千万不能因为一时方便而忽略这些细节!
(注:本文示例仅作学习交流之用) |
|