sql-lib闯关秘籍之1-10关
以下所有操作建议在虚拟机中进行~
First you shoud have a 文件夹在你电脑上的例如phpstudy的WWW文件夹中
首先进入这里创建数据库,after that ,let‘s we go~
不管是第几关,我们的最终目标是获得用户密码,从而获取最高权限!
以下的学习过程中如果遇到那里不会的或者不清楚的地方,欢迎大家留言,我将尽力帮助大家~
第一关
首先我们确定他是什么类型的注入方式,输入1=2 --+ 页面回显正常,说明不是字符型注入
输入带引号的1‘,出现问题,说明可能存在字符型的注入
我们在后面加上--+进行一下闭合,(--+就是注释符号,注释了后面的语句),look,回显正常,说明是单引号字符型注入
接下来用order by 来判断表有几列数据,发现他有3列数据(为4时出错,为3时正常)
我们将id改成一个不存在的数字,如“417”。判断页面有几个显示位,使用联合查询语句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。
接下来爆列,得出第二列是用户名,第三列是密码(虽然我只截图了两张,但是里面的每个字母都是通过二分法,大于小于,这样的方式测试出来的)
最后一步爆用户名和密码(只截图了第一个用户名和密码,并且大小写不知道)
当然还有第三种方法,嘿嘿 ---->报错注入 简单说就是通过反馈的错误信息,在反馈信息中显示出你想知道的信息
首先介绍三种报错注入常用的语句:
(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"
第七关
首先判断是字符型还是数字型,发现是字符型,并且出现了一个我们从来没见过的东西use outfile
可能会有很多小白和我一样,对数据库file权限和 into outfile这个命令比较陌生,所以在这里科普一下file权限和into outfile这个函数。
数据库的file权限规定了数据库用户是否有权限向操作系统内写入和读取已存在的权限
into outfile命令是filefile系列函数来进行读取敏感文件或者写入webshell
字符型的话就要在1后面加‘或“号,所以我们来试试
需要多次尝试1‘ 1“ 1’) 1”) 1‘)) 最后我们发现是1‘))
这关我们主要就是往服务器上写入文件,比如一句话木马啥的,我们首先要有一个存储文件的路径,也可以手动去查看
找到路径之后,我们往这个路径下写入一个文件名为longshisan的php文件,主要这里的路径要用双斜杠\\,否则建立出来的文件名会加前缀
虽然他回显告诉我们错误,但是确实建成功了,并且在这里有一个安全措施,就是不允许覆盖,你建立了longshisan的php文件,就不能重复建立了
如果写到www文件夹下就可以用localhost前缀了
我们可以加入一句话木马,到时候我们就可以通过这个文件进入数据库
用中国菜刀就可以获得这个文件夹的结构了
第八关
发现是字符型注入,并且通过回显的信息可以看出是布尔盲注
首先看看有没有file权限,发现有,那咱这关就过去了
你也可以用向第五关的方法时间注入啊,二分法猜测啊在这都可以用
第九关
上来先判断是字符型注入,并且是延迟型注入(咋判断是不是延迟型,当你用二分法时不管左边还是右边都是对的,说明二分法就做不了了)
时间注入在第五关做了详细的描述,在这里不再过多的赘述
数据库名长度为8
获得数据库名,剩下的按照第五关的操作走就行
获得密码
第十关
第十关就是把第九关的单引号‘换成双引号“就可以啦
获得用户名密码
1-10关结束
该文章有参考了以下的网页: