首先得在虚拟机中搭建sqli-labs的环境
搭建完成后创建数据库
接下来开始闯关
不管是第几关,我们的最终目的是获取用户和密码,从而获取最高权限!
如果你的sqli-labs搭建在了本虚拟机,直接将ip的地方改成127.0.0.1或者localhost就行,当然也可以直接换成对应虚拟机的ip地址
第一关(单引号型注入,格式:id=1')
首先我们确定他是什么类型的注入方式,输入1=2 --+ 页面回显正常,说明不是字符型注入
输入带引号的1‘,出现问题,说明可能存在字符型的注入
我们在后面加上--+进行一下闭合,(--+就是注释符号,注释了后面的语句),,回显正常,说明是单引号字符型注入
接下来用order by 来判断表有几列数据,发现他有3列数据(为4时出错,为3时正常)
我们将id改成一个不存在的数字,如“417”。判断页面有几个显示位,使用联合查询语句union select 发现只有两个显示位
接下来我们爆破数据库的数据库名,表名,列名,字段信息
首先我们获得有多少个数据库
查询我们的数据库的版本和名字,看来是security
我们接下来查询security数据库的表名,发现有四个表 分别是emails,referers,uagents,users 很明显我们最后的目标是users表
接下来我们看看user表中都有哪些列,发现有user和password列(因为版本不一样,可能列名不一样,但是一定会有用户名和密码两列)
我们来获得用户名和密码的字段
0x3a: 0x是十六进制标志,3a是十进制的58,是ascii
中的 ':' ,用以分割username和pasword的,
该账号密码使用,,隔开 ,,之中是一组
第一关结束,
第二关(数字型注入,格式:id=1)
发现第二关和第一关的区别在于他不是字符型注入了,是数字型注入了(数字注入的话就没有1后面的‘号了)
接下来就是获取表有个显示位,发现是3个,之后就是获取数据库名,表名,列名,字段名,和第一关一模一样
对于第一关和第二关的另外一种解法,
获取当前数据库的表名
获取user表的列名
没显示全,我们再使用看看其他的列名
获得user和password的字段值
同样使用not in显示其他的值
第三关(基于错误的GET单引号变形字符型注入,格式:id=1') )
这一关使用‘)进行闭合 这关是基于错误的GET单引号变形字符型注入
第四关(基于错误的GET双引号变形字符型注入,格式:id=1") )
这关是基于错误的GET双引号变形字符型注入
1-4关其实除啦需要闭合的sql语句不同,其他都一样,总结:
基本步骤:
1. http://127.0.0.1/sqli-labs-master/Less-4/?id=1"查看是否有注入,注意:其中绿色部分是ip和搭建sqli-labs当时命名的文件夹,,Less-4可以换为相应的(1,2,3,4)
2. http://127.0.0.1/sqli-labs-master//Less-4/?id=1”) order by 3--+查看有多少列
3. http://127.0.0.1/sqli-labs-master//Less-4/?id=-1") union select 1,2, group_concat(schema_name) from information_schema.schemata --+查看所有数据库
4. http://127.0.0.1/sqli-labs-master//Less-4/?id=-1") union select 1,2, group_concat(table_name) from information_schema.tables where table_schema=0x7365637572697479 --+查看所有的表
5. http://127.0.0.1/sqli-labs-master//Less-4/?id=-1") union select 1,2, group_concat(column_name) from information_schema.columns where table_name=0x7573657273 --+查看所有的列信息
6. http://127.0.0.1/sqli-labs-master//Less-4/?id=-1") union select 1,2, group_concat(concat_ws(0x7e,username,password)) from security.users --+直接可以得到所有的账号和密码,并且使用~符号进行分割。
第五关
看这关是不是和之前关卡不太一样了,没有显示位了,遇到这个情况有三种结果:布尔盲注,报错型注入,时间延迟注入(就是通过给你显示延迟表示你输入的对不对的一种形式)
测试一下发现是时间延迟注入,并且还是单引号字符型注入
时间延迟注入算是一种盲注,因为它没有回显的信息
时间延迟型手工注入,正确会延迟,错误没有延迟。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。
我们用其他软件查看下爆的数据库,确认下。我这里用的Navicat
这种时间延迟盲注很繁琐,,得反复尝试,,还有别的注入方法,
布尔型手工注入,正确会回显,错误不回显
数据库第一个字符小于r无回显
数据库第一个字符小于t有回显,,一点一点尝试,最终获得库名为security
接下来确定表名,第一个字母得出是r,其他的步骤还是一样,修改limit x,1和left中的位数限定数字,第一张表是emails,爆破到第二张表为referer,终于在第四张表爆破到user表,名为users。
接下来爆列,得出第二列是用户名,第三列是密码(虽然我只截图了两张,但是里面的每个字母都是通过二分法,大于小于,这样的方式测试出来的)
最后一步爆用户名和密码(只截图了第一个用户名和密码,并且大小写不知道)
还有第三种方法,报错注入,
简单说就是通过反馈的错误信息,在反馈信息中显示出你想知道的信息
首先介绍三种报错注入常用的语句:
(1). 通过floor报错
select count(*), concat((select version()), floor(rand()*2))as a from information_schema.tables group by a;
其中payload为你要插入的SQL语句
需要注意的是该语句将 输出字符长度限制为64个字符
(2). 通过updatexml报错
and updatexml(1,payload,1)
同样该语句对输出的字符长度也做了限制,其最长输出32位
并且该语句对payload的反悔类型也做了限制,只有在payload返回的不是xml格式才会生效
(3). 通过ExtractValue报错
and extractvalue(1, payload)
输出字符有长度限制,最长32位。
payload即我们要输入的sql查询语句,这里面的concat是聚合函数,使用聚合函数进行双注入查询时,会在错误信息中显示一部分错误信息。
下面我们使用floot报错进行演示,爆数据库
爆用户
爆表名
爆列名
爆用户和密码
这里爆的是第二个的 密码和用户,,
第六关
和第五关一样,不再赘述,只是将1' ----->(换成了)1"
还是用报错注入简单,不像时间延迟注入和布尔型手工注入那样一个一个试
第七关(注入格式:id=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连接语句,顺藤摸瓜,找到数据库管理员信息
找到了管理员信息(其中,,用户、密码和主机之后,填写数据库管理的配置时 ,要用,)
再次右击刚才的地址,,点击数据库管理,点击配置,根据上图输入以下信息:
提交,就可以管理数据库啦,单击和双击只能选择那一项,需要点击执行,才能显示
第八关(注入格式id=1' )
发现是字符型注入,并且通过回显的信息可以看出是布尔盲注
首先看看有没有file权限,发现有,说明和第七关相同,,只是注入的闭合符合不同
也可以用像第五关的时间注入和二分法猜测
第九关
上来先判断是字符型注入,并且是延迟型注入(如何判断是不是延迟型,当你用二分法时不管左边还是右边都是对的,说明二分法就做不了了)
时间注入在第五关已有详细的描述,在这里不再过多的赘述
数据库名长度为8
获得数据库名,剩下的按照第五关的操作走就行
获得用户
密码
第十关(注入格式:id=1")
和第九关相同,,只是把单引号 ' 还成双引号 "
获得用户密码