终于,我的课程开始讲SQL注入了,对就是那个常年在OWASP上有名的SQL注入
今天是真的冷啊,幸苦的小编还在写csdn
1.SQL注入原理
SQl注入其实就是将恶意的代码向服务器提交,但是后端又不过滤而引发的漏洞!!比如:
select * from security where username="admin"and password="password"
这个句子就是在向security的表中查找username是admin&&password是password所对应的数据
其中admin 和 password是外界传入的参数,像这样:
那如果我们传入恶意参数呢??😊😊 如 admin ' or 1=1 --+ 那么此时的代码是不是就变成了
select * from security where username="admin" or 1=1 --+ password="";
相信可以看出来这里就算不知道账号密码也能进行查询 ,来解释一下这行代码
- username="admin" or 1=1 这里就算数据库中不存在admin也是对的(因为1=1天然成立)
- --+ 在sql中--就是注释的意思 这个+用来占位,你可以替换成任意字符,反正要有占位符,所以后面的password不管对不对都被注释掉了,看代码展示也能看见他变成灰色了吧😊😊
2.SQL注入的类型
SQl注入可以分为以下两种类型
- 按照数据类型
- 字符型
- 数字型
2. 按照返回结果
- 报错注入
- 盲注
今天就先来讲讲第一类
字符型 比如要求我们输入用户名,这种就是字符型 基本格式:
select * from security where username="zhangsan";
这时候我们的检测方法可以有
- 输入 zhangsan' 如果是字符串类型就会出现以下代码
select * from security where username="zhangsan' ";
很显然最后一个 " 没有闭合 那么就会报SQL syntax errors 或者页面发生改变
- 也可以 输入 zhangsan ' and '1' = '2 ,这时候这个查询语句就变成了
select * from security where username="zhangsan" and '1'='2';
这样也是会发生和上面一样的的情况
然后就是数字型注入的检查,相对于字符型就不用考虑这么多了
- 输入 1 and 1=2 这时候的查询语句就变成了
select * from security where id=1 and 1=2;
这样就会发生报错,但是还有一种检测数字型注入的方法
- 输入 1/1 和1/0 (前提是id=1是有值的)如果能正常查询,说明这里不会进行数学运算
就是字符型注入,如果1/1不报错,但是1/0报错,说明进行了数学运算,就是数字型注入
3.MySQL的报错函数
1.extractvalue()
这个函数的用法
如果在使用 EXTRACTVALUE
函数时出现错误,MySQL 将返回 NULL
值,并且可能会生成一个警告
有意思的就是这个警告,他会返回你的一些函数的报错和NULL,上案例!!!
select extractvalue(1,concat(0x7e,(select user()),0x7e));
这句代码的意思就是将~select user()~当作路径查询(0x7e是~的十六进制编码),因为~在xpath的语法中式不存在的,所以就会报错,并且执行select user()
2.updatexml()
这个和上面的extractvalue差不多
还是从Xpath下手,就是酱紫~~~
补充,这里为什么要~~来显示呢,完全可以直接select current_user()对吧 哈,那肯定是有原因的!!!!
这个返回值最大长度是32,如果实际中的返回值大于32呢?
那就要这样查询了
select updatexml(1,substr(concat(0x7e,(select current_user()),0x7e),1,32),1);
通过控制返回值的长度,如果太长了,那就再输入一次将1改为33就是了
3.GTID_SUBSET(参数1,参数2)
这个函数就是用来判断参数2是不是参数1的子集,如果不是就报错返回false,并且执行参数一
那就:(这里的版本要比5.5高哦)
select gtid_subset(user(),1);
以上就是第一节SQL注入课程的知识点整理了!!!(真好,这就一点了😭😭😭)