[Day9] ORM Injection

前言

:你有听过SQL Injection吗?
:有阿
:那你知道怎麽防范吗?
:参数化查询、ORM...
:那你听过ORM Injection吗?
:= =

正文

简述

物件关联对映 Object Relational Mapping 简称ORM,存在於资料库和Model资料容器之间,可以让开发者/使用者更简单安全的去资料库拿取资料,它是利用程序语言去操作资料库语言,实现物件导向概念,同时把SQL的语法进行封装的一种模式,而且通常会提供一组Safe Function来防止SQL Injection攻击。但若使用者使用接受User input的自订function,就特别容易遭到攻击。

而ORM Injection就是对ORM generate的data access model进行注入。这种攻击实际上跟SQL Injection很像,差别是ORM Injection是ORM Layer产生的程序码中存在Injection漏洞。因此不会使用SQL语法进行攻击。可参考: List of object–relational mapping software

ORM产生的object可以使用SQL或SQL的变种对资料库进行CRUD(Create, Read, Update, Delete),但若是一个Web Application使用了未经检查/处理的input参数,就可能受到这种攻击。

Case Study

Hibernate

这是一个2020年发现的漏洞,Hibernate是一个Java的ORM框架,可以让Java开发者使用它来与MySQL、PostgreSQL互动,攻击者可以透过利用特定的DBMS功能突破HQL语法,将HQL转换为SQL语法

public static String doubleQuotes(String input) {
       return input.replaceAll("'", "''");

上述的程序码看起来已经正确的检查已经清理(input.replaceAll),但攻击者只要再'前加上一个backslash\就可以简单的绕过限制如:attack\'

或是一个底层资料库为Mysql而且允许FILE权限被资料库用户使用,就可以透过以下方法,从Escape HQL,注入SQL到最後的INTO OUTFILE写入一个web shell:

100 or 6<>'\'' ) or 1=? into outfile "shell.jsp" -- - '

假设一个透过Hibernate查询语法进行的SQL查询注入:
SELECT column FROM table WHERE id = <injection>

以下是网路上别人整理出来可以用於测试HQL Injection的Cheetsheet
也可以参考PayloadsAllTheThings/HQL Injection

Ruby on Rails ActiveRecord

Orders.find_all "customer_id = 123 AND order_date = '#{@params['order_date']}'"

只要往order_date发送OR 1--就可以成功注入。


下篇预告: NAT Slipstreaming


<<:  #10 Web Crawler 3

>>:  【Day 09】- 今天来创造 Ghost Process(基於断链隐藏 Process 的手法)

[ 卡卡 DAY 22 ] - React Native 元件害羞之骨架屏先让你瞧 react-native-skeleton-placeholder

咦 大家有见网友的经验吗? 在还没见面前是否都是以照片来判断这个人是不是自己的菜? 网站也有一个时...

[Day 30] 完赛,回顾留下的足迹

铁人赛的精神-毅力 终於来到铁人赛的最後一天,当然要来回顾一下这30天发生的点滴及感想罗~ 从Day...

Angular-开发工具&安装AngularCLI(Day15)

开发工具我们选择Visual Studio Code VSC下载 请帮我点选上面的连结下载 Visu...

DAY20 - [JS] 小结与番外篇:浅拷贝 与 深拷贝

今日文章目录 番外篇:浅拷贝 番外篇:深拷贝 小结 ToDoList + 番茄钟时间管理,整体上练...

Day18 用CSS做出动画效果

还没学到这个属性之前,一直以为必须使用到JavaScript,才能让网页有动画的效果,没想到用CS...