闯关之前我们需要搭建所需环境SQLi-Labs
SQLi-Labs是一个专业的SQL注入练习平台,该平台包含了以下在测试场景中常见的注入类型:
1.报错注入(联合查询)
1)字符型
2)数字型
2.报错注入(基于二次注入)
3.盲注
1)基于布尔值
2)基于时间
4.UPDATE型注入练习
5.INSERT型注入练习
6.HTTP头部注入
1)基于Referer
2)基于UserAgent
3)基于Cookie
7.二次排序注入练习
对于学习SQL注入来说是一个优秀的平台。
环境搭建
1.准备工作:我们在虚拟机中安装phpstudy集成环境即可
2. 安装过程
2.1 下载并解压
从网上下载sqli-labs,解压到phpstudy的www文件夹目录下
2.2 修改配置文件
进入网站目录,在sql-connections
文件夹下找到db-creds.inc
文件,修改文件内容,将用户名和密码改成本地MySQL数据库的用户名和密码
(初始用户名和密码都为root)
2.3 安装
打开浏览器,输入http://192.168.31.246/Sqli_Edited_Version-master
进入SQLi-Labs测试平台
(我的ip为192.168.31.246,www文件夹下文件名为Sqli_Edited_Version-master
)
点击Setup/reset Database for labs
进行安装,出现以下界面则表示安装成功
好,环境搭建完成,那么开始闯关吧。
第一关
首先我们确定他是什么类型的注入方式,经过语句and1=2测试(即输入1=2 --+) 页面回显正常,说明不是字符型注入
输入带引号的1‘,出现问题,说明可能存在字符型的注入
我们在后面加上--+进行一下闭合,(--+就是注释符号,注释了后面的语句),look,回显正常,说明是单引号字符型注入
接下来用order by 来判断表有几列数据,发现他有3列数据(为4时出错,为3时正常)
我们将id改成一个不存在的数字,如“666”。判断页面有几个显示位,使用联合查询语句union select 发现只有两个显示位
接下来我们爆破数据库的数据库名,表名,列名,字段信息
首先我们获得有多少个数据库
查询我们的数据库的版本和名字,看来是security
我们接下来查询security数据库的表名,发现有四个表 分别是emails,referers,uagents,users 很明显我们最后的目标是users表
接下来我们看看user表中都有哪些列,发现有user和password列(因为版本不一样,可能列名不一样,但是一定会有用户名和密码两列)
我们来获得用户名和密码的字段
0x3a: 0x是十六进制标志,3a是十进制的58,是ascii中的 ':' ,用以分割pasword和username。
闯关结束
第二关
发现第二关和第一关的区别在于他不是字符型注入了,是数字型注入了(数字注入的话就没有1后面的‘号了)
接下来就是获取表有个显示位,发现是3个,之后嘞就是获取数据库名,表名,列名,字段名,和第一关一模一样
其实对于第一和第二关还有另外一种解法
获得当前数据库的表名
获得user表的列名
没有显示全,我们再使用看看,其他的列名
获得user和password的字段值
同样使用not in显示其他的值
第三关
这一关使用‘)进行闭合 这关是基于错误的GET单引号变形字符型注入
第四关
这关是基于错误的GET双引号变形字符型注入
第五关
这关和之前关卡不太一样,没有显示位了,遇到这个情况有三种结果:布尔盲注,报错型注入,时间延迟注入(就是通过给你显示延迟表示你输入的对不对的一种形式)
我们测试一下发现是时间延迟注入,并且还是单引号字符型注入
时间延迟注入算是一种盲注,因为它没有回显的信息
时间延迟型手工注入,正确会延迟,错误没有延迟。id无所谓,不看回显,可以通过浏览器的刷新提示观察延迟情况,但是id正确的时候的回显有利于观察。
我们来看一下数据库的名字是几个字符,如果是8个字符,则延迟2秒,发现延迟,则证明是8个字符 ?id=1' and if(报错型核心部分,sleep(3),1)--+
出现延时,所以是八个字符
我们看看第一个字符是什么,因为是盲注,所以需要一个一个试,很麻烦,我们知道咱的数据库的名字,所以从s开始试, 一个一个试最终爆破得到left(database(),8)='security'
得到数据库名字之后我们来获取表名,爆破到第二张表为referer,下图是爆的第一个字母,因为有点类似盲注,所以特别慢。其他的就没有截图
终于在第三张表爆破到user表,名为users。limit 后面跟的两个数字是从几到几,1,1就是第二张表的意思 2,1就是第三张表的意思 最后面那个1是对应的left ,从左数共几个 为1时,后面我们就放一个字母
爆完表名,爆列名
首先尝试定向爆破,以提高手工注入速度,修改limit x,1 中的x查询password是否存在表中,lucky的是limit 3,1的时候查到了password列,同样的方法查询username ,又一个lucky,接下来爆破字段的值。
爆完列名,爆字段名 爆破到第一个用户的名字dumb,密码dumb,需要注意的是,mysql对大小写不敏感,所以你不知道是Dumb 还是dumb。
这是我们爆的那个数据库发现确实一样
有没有发现这种方法很繁琐,很累,一直重复试才能试出几个,所以还有别的方法
布尔型手工注入,正确会回显,错误不回显
数据库第一个字符小于t有回显
数据库第一个字符大于t无回显, 一点一点尝试,最终确定的库名为security
接下来确定表名,第一个字母得出是r,其他的步骤还是一样,修改limit x,1和left中的位数限定数字,第一张表是emails,爆破到第二张表为referer,终于在第四张表爆破到user表,名为users。
接下来爆列,得出第二列是用户名,第三列是密码(虽然我只截图了两张,但是里面的每个字母都是通过二分法,大于小于,这样的方式测试出来的)
最后一步爆用户名和密码(只截图了第一个用户名和密码,并且大小写不知道)
当然还有第三种方法, -------使用concat聚合函数
参考资料:http://www.2cto.com/article/201303/192718.html
简单的说,使用聚合函数进行双注入查询时,会在错误信息中显示一部分错误信息。
比如count函数后面如果使用分组语句就会把查询的一部分以错误的形式显示出来。
payload即我们要输入的sql查询语句,下面展示payload在concat()中构造
爆库payload
爆用户
爆表名
爆列名
爆用户名密码
第六关
和第五关一样,不再赘述,只是将1' ----->(换成了)1"
第七关
首先判断是字符型还是数字型,发现是字符型,并且出现了一个我们从来没见过的东西use outfile
可能会有很多小白和我一样,对数据库file权限和 into outfile这个命令比较陌生,所以在这里科普一下file权限和into outfile这个函数。
数据库的file权限规定了数据库用户是否有权限向操作系统内写入和读取已存在的权限
into outfile命令是filefile系列函数来进行读取敏感文件或者写入webshell
字符型的话就要在1后面加‘或“号,所以我们来试试
需要多次尝试1‘ 1“ 1’) 1”) 1‘)) 最后我们发现是1‘))
这关我们主要就是往服务器上写入文件,比如一句话木马啥的,我们首先要有一个存储文件的路径,也可以手动去查看
找到路径之后,我们往这个路径下写入一个文件名为escwq的php文件,主要这里的路径要用双反斜杠\\,否则建立出来的文件名会加前缀
图中标记1是双反斜杠,,标记2是单反斜杠,,路径名加到了文件名前
虽然他回显告诉我们错误,但是确实建成功了,并且在这里有一个安全措施,就是不允许覆盖,你建立了longshisan的php文件,就不能重复建立了
下图是建立的escwq.php中的内容
如果写到WWW文件下就可以直接用localhost前缀啦
我们这次在WWW文件夹下
新建一个yahu.php并一句话木马( [" "]中的字符,是自己设置的密码,,等用中国菜刀连接的时候会用到 ),到时候我们就可以通过这个文件进入数据库
这时就可以用中国菜刀获得这个文件夹的结构啦,
图中标记部分,,地址是当时.php文件的位置,,
小方块中是在加入一句话木马时设置的密码,,划横线部分,菜刀会帮你自动选择的不用管
之后右击,选择文件管理
找到index.php文件,寻找其中sql连接语句,顺藤摸瓜,找到数据库管理员信息
找到了管理员信息(其中,,用户、密码和主机之后,填写数据库管理的配置时 ,要用,)
再次右击刚才的地址,,点击数据库管理,点击配置,根据上图输入以下信息:
提交,就可以管理数据库啦,单击和双击只能选择那一项,需要点击执行,才能显示
第八关
发现是字符型注入,并且通过回显的信息可以看出是布尔盲注
那就一步一步来吧,和less5一样的,根据回显判断,可以通过 > < 比较字符大小加速爆破
暴库payload
你也可以用向第五关的方法时间注入啊,二分法猜测啊在这都可以用
第九关
上来先判断是字符型注入,并且是延迟型注入(咋判断是不是延迟型,当你用二分法时不管左边还是右边都是对的,说明二分法就做不了了)
时间注入在第五关做了详细的描述,在这里不再过多的赘述
数据库名长度为8
获得数据库名,剩下的按照第五关的操作走就行
获得密码
第十关
第十关就是把第九关的单引号‘换成双引号“就可以啦
获得用户名密码
1--10关就闯关完成了。