0x00 废话

又是一个新坑,只是突然心血来潮的,如果写到一半就没了勿怪。
一直想写这么一个系列,从零开始XXXX之类的。虽然网上已经有很多了,但还是想写个自己的吧。其中大部分都是我对SQL注入的理解,很多都不是正确的概念,所以各位看官就不要吐槽了,权当看个热闹吧。

2015.03.17
虽然是从0开始系列,但是SQL基础还是要有一些的。

0x01 安装环境

首先要做的肯定是搭建我们的测试环境,总不能一上来就去找真实的网站一通乱注吧,这样总归是不好的。而且现实中在注入的过程中会出现各种意外情况,为了应付这些意外情况不得不去学习另外的一大堆知识,所以我们还是选择自己搭建SQL注入环境。

这里推荐使用XAMPP,一键安装,比较方便,毕竟我们研究的是SQL注入而不是环境配置。

然后我们去搞个SQLi-Labs。这是别人整理好的一个SQL注入环境,我们就用这个东西来学习SQL注入吧。下载地址:https://github.com/Audi-1/sqli-labs

接下来我们把这东西丢到网站根目录(XAMPP的网站默认根目录在XAMPP安装目录下的htdocs文件夹)去,然后访问下,主要是为了安装数据库。

当你看到黑底黄字很炫酷的刷评论之后,就安装成功啦!

测试一下:访问下Less-1,看看能否打开:http://127.0.0.1/sqli-labs/Less-1/?id=1,URL可能要根据你自己的路径修改。

0x02 何为SQL注入?

说了这么多热闹的东西,又是搭环境又是下东西的。到底什么才是SQL注入呢?如果你去google搜索的话,一定会看到一大堆很官方的东西,看着很厉害的样子,但是看了半天也看不懂。啥?如果你看懂了。那应该不用看这个教程了。

我们就用PHP来举例吧,为啥是PHP呢?因为PHP是世界上最好的语言!假如让你写一个简单的新闻站,你会怎么做呢?用户肯定可以查看某条新闻吧,用户告诉你说:“hi~我想看第59条新闻!”,服务器(或者你)就会从数据库中取出第95条新闻回复给浏览器,浏览器再显示给用户。看似很简单,也确实很简单,用编程语言来描述大概是下面这个样子。

用户访问:http://news.lightless.me/show.php?id=59 (“hi~我想看第59条新闻”)
这个show.php就会从数据库中取出第59条新闻返回给用户。其中的处理语句可能是这样的:

$id = $_GET['id'];  // 此时$id为59于是下面的SQL语句就变成了:
SELECT * FROM news WHERE news_id = 59

一切看起来都挺正常的,但是我们知道,现实中除了男人和女人还有第三种人,那就是熊孩子!此时有个熊孩子说:“我要看第60条新闻并且删除数据库”。于是你的程序就按照接收到的数据去执行了。可能处理语句就变成了:

$id = $_GET['id'];  // 此时$id为60 and drop db_news
SELECT * FROM news WHERE news_id = 60 and drop db_news

于是你的程序高兴的执行了这个语句,因为他分不清哪里是指令哪里是数据!本来应该60 and drop db_news都应该当做数据的一部分而不是指令被执行,但是你的程序却自作聪明的将and后面的内容当做指令执行了,这样一来你的数据库就GG了。

看了上面的例子,你应该大概明白什么叫做SQL注入了吧。如果你想看更官方的解释,可以自行google一下看看,相信你会看懂一部分的。

0x03 最后啰嗦两句

这个教程所有的测试都是基于PHP+MySQL的,现实中可能会有更多的情况,不,是一定会有更多的情况,比如mssql,oracle等等,如果有机会以后再讲。