第五关:
根据提示输入ID,随便来个一
输入100,因为数据库没有,所以这里没输出内容
还是先找注入点:输入单引号试试
注入点找到了'
查询数据库列数;?id=1' order by 4 --+
测试发现order by 3时页面正常,当对第4列字段进行排序时,页面报错。说明该表只有3列
页面有布尔状态,所以用布尔盲注。页面没有回显不能用联合查询注入,没有报错信息,不能用报错注入
在这里,我们猜测数据库长度大于10,这里没有结果输出,说明数据库长度小于10
在这里,我们猜测数据库长度为8,发现有结果显示。说明数据库长度为8
再来一个substr()的例子:
猜测数据库第一个字符为K
在猜测数据库第一个字符为s
其他的操作也可以通过这样猜的方式得出
例如表名,字段名等
第六关:
先介绍一下,updatexml报错注入
原理: 我们在使用该函数进行报错的时候一般会去修改其第二个参数,通过构造非法格式的查询语句,来使其返回错误的信息,并将其更新出来。如果路径中(第二个参数)存在特殊符号 比如'~' ,就会报错 , 同时显示路径参数的内容,如果路径参数中包含函数 , 那么函数将会被执行 , 并将执行结果展示在报错内容中。
首先熟悉的单引号字符注入
发现没反应,可能过滤了单引号
OK,来试试双引号
注入点就找到了
试一试:id=1" and updatexml(1,concat(0x7e,(select database())),3);
获取表名:
id=1" and updatexml(1,concat(0x7e,(select table_name from information_schema.tables where table_schema = 'security' limit 0,1)),3)--+
web页面只能显示一行,所以用limit 限制
第七关:
首先寻找注入点
根据报错信息可以猜测'))或者"))
先来试试'))
可以发现注入点就是'))
使用select ...into outfile 语句的前提条件
1.mysql数据库中secure_file_priv参数设置允许对目录进行导入导出操作
2.mysql对路径有读取权限
3.在进行文件读取时要有权限。
secure_file_outfile参数
1.如果为空:不做任何限制,,任何目录都可以
2.如果指定了目录,就只能从这个目录导出
3.如果设置为NULL,则禁止导入导出功能。
使用导出语句进行数据爆破
?id=1')) union select 1,database(),version() into outfile '/root/text' --+
发现有问题
show global variables like '%secure%';
在进行数据导出的时候出现--secure-file-priv option so it cannot execute this statement
问题时,修改/etc/mysql/mysql.conf.d/mysqld.cnf文件
在末尾添加一句secure_file_priv="/"即可将数据导出到任意目录
又来了这个问题
算了算了。先跳过
第八关:
注入点为'
解释一下为什么不用报错注入:
当我们输入的语句正确,页面正常回显;当我们输入的语句错误,页面并不会给我们显示报错信息。显然我们不能使用报错注入了。
盲注:首先盲注是SQL注入的一种,盲注是在SQL注入的基础上,根据SQL注入的回显不同而定义的。也就是在服务器或者页面没有错误回显的时候完成的注入攻击。其实也就是猜解,输入语句猜解数据库名字、表名等等。
时间盲注:通过页面的响应时间来判断条件是否正确。
布尔盲注:布尔盲注一般适用于页面没有回显字段(不支持联合查询),且web页面返回True 或者 false。
举个栗子:
这是正确的输入
错误的输入
第九关:
可以看见一样没有内容信息显示
老方法:报错注入和盲注
先来报错注入:
id=1' irder by 4 --+
经过判断该数据库的字段数为3,我这里根据第四列排序,肯定是错的。
当然了:布尔盲注也用不了了
因为使用布尔盲注的前提是页面必须在面对不同的语句的时候有不同的回显。也就是语句正确回显正常,语句错误回显不正常。
这种时候适合采用时间盲注:
if(expr1,expr2,expr3)含义是如果expr1是True,则返回expr2,否则返回expr3。也可以理解为如果expr为True,则执行expr2,否则执行expr3。
sleep(int):代表过int时间后响应
测试:
?id=1' and sleep(2) --+
这段代码的含义是让网页停止两秒后响应,如果单引号是注入点,那么该页面就会停止两秒后再响应,如果双引号不是注入点,那么网页就会正常响应。
九关的注入点为单引号。
时间盲注猜数据库长度:
id=1?and if(length(database())>8,sleep(2),0)--+
可以发现是立即相应的,说明数据库长度小于=8
第十关:
发现是基于双引号的注入
测试过程:可以发现页面始终是这样,可以考虑下时间盲注
先' ,然后" ,反正就是猜嘛
id=1" and sleep(2) -++