[success]
这件事起因很简单,就是我QQ一个好友在帮我测试网站的安全性,突然他给我发了一张这样的图片。。。
[/success]
好友给我发的图片
当时看到了这个我就惊出了一身冷汗,要知道我数据库只有本地才能访问,而且密码也是随机的,还有我用的不是PHP,所以不存在PHP的漏洞,后来我问了一下,才发现这个是SQL注入来实现的。注入的是这样一个接口:
这个是一个post请求,接收下面几个参数
返回结果如下
当初我怎么也想不通,怎么可能通过这个接口直接脱库?我什么东西都没返回。。。
学习SQL注入
为了尽快找出别人的攻击原理,我决定去补充相关的知识,然后就花了大概一天左右的时间学习了相关的原理和攻击方法,学完后我才发现这个sql注入非常恐怖,仅仅通过注入下面这种的简单查询窗口就可以直接把你的数据库给全部扒下来(这里我使用的是靶机,不是别人的网站!!!)
而且kali上有专门的软件来进行sql注入(就是下面这个)
通过折款软件可以把你所有的数据库都扒出来
还有获取某个数据库中的某张表的结构
以及表中的数据
基本上通过这个漏洞可以把你数据库中所有的数据都获取到。。。
用自己的网站做实验
学习完后我第一时间就拿自己的网站来做测试。结果真的直接把我的数据库全部扒出来了。。。
原理
sql注入其实就是利用sql语句来实现的注入。通过sql的联合查询获取到想要的数据
比如下面这个语句,直接把数据库的用户名和数据库的名字给查出来了
我的那个是利用sql盲注来实现的
因为我接口返回的数据是不可能泄露数据库的任何信息的,所以这个工具巧妙的利用了SQL语句中的延时来实现,通过在sql语句中插入延时语句,根据接口响应时间一个字符一个字符的套出来的,比如我那个查出所有的数据表大概要花半个多小时,看到这里我不禁佩服想出这种想法人的智慧。
如何预防
说到如何预防我只能说我真的太天真了,永远不要认为用户会按照正常的套路输入数据,对于输入的数据千万要进行判断,要不然系统随时可能奔溃。。。
我系统出现这个问题最根本的问题就是我的sql语句是直接拼接的,没有对单引号进行转义,导致别人利用这个漏洞进行sql注入。
预防简单的方式SQL语句千万不能拼接,一定要利用SQL的参数化查询来实现。
所以我只好把我所有的sql查询和插入语句全部替换为参数化查询语句(大概有200多条sql语句,改的我都快吐了。。。)
感想
现在看看自己做的博客系统真的的太天真了,xss攻击漏洞发现了三个,还有这个最严重的sql注入漏洞。我以为从零做一个系统非常简单,但是,现在打磨了快半年了,bug还是有一堆。前面好不容易解决了项目规范的问题,现在就面临着严重的安全问题,需要考虑的地方实在太多,我现在这个系统就像是一个精致的花瓶,虽然外表好看,但是却脆弱不堪。
欢迎大家积极找bug和漏洞,有的话请第一时间下本篇文章下留言,还好找出漏洞的人是友军,如果是黑客的话,估计数据库直接被脱库了(虽然我这个破系统不值钱),好了就说到这里,下面我会花一点时间进行安卓端接口的适配,安卓端接口非常麻烦,可能需要几天。