写点什么

【网络安全】干货|SQL 注入攻击思路手法总结(上)

作者:H
  • 2022 年 1 月 23 日
  • 本文字数:2324 字

    阅读完需:约 8 分钟

【网络安全】干货|SQL注入攻击思路手法总结(上)

一、前言

本文为自己对 SQL 注入这个攻击手法的理解,跟大家一起分享 SQL 注入知识。

分上下篇,上篇为攻击手法概括,初稿不会写太多,后面会更新;下篇为防御篇,会把一些常见的,不常见的写进去。

二、概念

SQL 注入漏洞之所以会出现就是开发人员针对代码编写开发 web 应用程序过程中,未对使用者输入的可控参数的合法性进行有效判断和过滤。从而造成被别有用心之人,利用“参数可控”特性将恶意参数带入数据库中执行,造成了恶意的 SQL 语句对数据库执行行为。



归结出两个条件,引起 SQL 注入:

1.传入参数可控,使用者可以对传入数据库的参数变量进行操作。

2.应用过滤不当,前端或者 web 应用、框架等未对使用者做好隐藏执行语句和传入参数的严格过滤。

SQL 注入的关联性

其实“注入”这个行为,也是一种对数据库的操作。这个行为的对敏感信息造成泄漏,所以判定成恶意的“注入”,实际上与用户的普通操作别无二致,在开发过程中,应该对用户的“操作”进行过滤和规范,尽量减少 SQL 注入的出现。

SQL 注入的注入点与脚本语言关系不大,只和数据库类型相关。就拿 php 站点和 java 站点来说,php 站点会爆出更多的漏洞,因为 java 中存在预编译机制,所以相较来说 sql 注入更少,这是语言特性决定的。但是语言特性和数据库没有强关联,在漏洞通报中出现 SQL 注入,不会通报用何种语言编写,只会出现是何种数据库。

所以 SQL 注入只和数据库类型有关系,脚本语言只是发现注入点的一个门户。

三、注入思路

这里给大家分享一些学习资料及思路大纲可【点击查看】


 

测试方式

黑盒测试:url、回显、报错、延时、布尔状态等等

白盒测试:代码审计

攻击方式选取

参数类型>>【闭合方式】

数据库类型>>【payload 的选择和语句组合】

提交方式>>【传参的方式可以绕过某些防护设备】

数据查询方式>>【是否有回显,回显点;延时注入的模糊判断;二次注入的数据呈现;工具有时候无法对所有数据捕获】

传输时加密>>【要提交对方可以识别的参数】

注入权限>>【拿到的权限是否可以造成威胁、扩大威胁】

攻击方式的选取应该存在多角度,但是一定离不开脚本语言、数据库类型和数据传输。



注入危害

单个数据库拿权>>【考虑低权限提权,查看是否存在可利用函数和扩展】

多个数据库拿权>>【尝试寻找信息泄露多角度提权,尝试使用高级函数、跨库提权】

后台数据泄露>>【寻找、构筑路由,寻找管理员账号、历史配置文件等】

web 权限丢失>>【尝试对网站功能点测试】

服务器权限丢失>>【进行横移;站库分离时,从数据库拿到宿主服务器的权限;根据当前数据库类型和服务器的安全性决定】

点到面突破,数据库中可以包含许多信息,这已经不是单纯 SQL 注入,可以发展到其他攻击面进行渗透。

特点注入

语言只决定 SQL 注入产生概率>>【确定网站使用的语言,根据不同的语言特性进行注入,提高效率】

数据库类型决定 SQL 注入的过程>>【每种数据的语句存在差异,这样的差异决定注入的思路】

SQL 注入需要人工配合>>【工具存在一定的局限性,部分工具对于数据回传没有判定从而忽略注入点】

存在防护设备下注入>>【判定防护设备,可以尝试“旧瓶装新酒”对旧思路加工再注入;分块、编码、、垃圾数据、带外、中间等注入】

有目的去注入,才会使攻击效率提高。SQL 注入通过多维度确定对方信息,能有效选取 payload 和思路。



四、常见注入方式

1.盲注

所谓盲注,就是我们在注入过程中,无法获得直接的回显或者有效信息去判断注入点是否存在,需要借助一些方法去进行验证和获取返回的数据。

1.布尔盲注:执行 SQL 语句后,只会存在两种结果。通过构造逻辑表达式判断数据的具体内容。

2.时间盲注:因为数据传输存在时间差,可以利用 sleep()函数等,去判断构造的逻辑表达式是否成功获取数据。

3.报错盲注:通过数据库的特殊函数的报错强制使参数在报错页面输出。这种函数往往会带出其他信息,可以扩展打击面。

2.堆叠注入

利用数据库特性,进行多语句执行。

但是限制较大,受 API、数据库类型、权限、网站架构等限制。一般多见于 CTF 比赛中,但是实际渗透中,如果存在多语句可执行,那么可以尝试,也许有意外收获。

已知支持数据库类型有: mysql、SQL-Server、PostgreSQL。

3.二次注入

二次注入其实就是,先入数据后注入,等同于一次注入。攻击者先构造出特定语句存入数据库,当攻击者对存入数据或者语句进行读取时出现注入点,这就是“二次”所在。

其实是一次内鬼之战,攻击者第一次输入的数据被认为是“安全”时,存入数据库内被转义,被转义的数据默认是安全的。然后第二次输入时,调用时即使输入数据没被转义,也可能被判定成“安全”,这时造成二次注入。

4.差异化注入

注入时,需要注意数据库类型和网站架构。不同的数据库类型存在差异,利用这种差异进行注入攻击。

access 数据库的偏移注入:知道表名而不知道列名时,利用“*”对其猜解,当到达一定长度时返回正常页面。

mysql 数据库的结构利用:因为 mysql 数据库的特性,库名-表名-列名-数据层层递归,mysql5 或以上存在三张特殊的表(information_schema.schemata/tables/colusmn),进行间接查询。

sqlite 数据库的隐藏表利用:sqlite 文件中存在一张隐藏表格 sqlite_master ,该表格记录下建表时的信息。

Mongodb 数据库闭合注入 &数组绑定注入:mongodb 是一种非关系型数据库,可以利用构造数组后使用 ne(等同于>等字符)进行注入。

5.基于场景注入

host 注入:因为不同语言和开发逻辑,获取 IP 的方法都是不一样的。那么在数据包中有一个 HOST 字段,如果该字段可控,并且获取到 IP 地址数据被写入数据库中,那么就有机会存在 HOST 注入。

XFF 注入:这个比较有意思,和 XRIP 字段一样,用于记录访问者的 IP,这个字段记录“真实 IP”。但是一旦这个字段被修改,返回中存在“XXIP 无法访问该资源”等类似语句时,就代表可控,可控也可以搞一波。

SQL 注入本质上也是一种对数据库的操作,获取我们想要的信息。

用户头像

H

关注

还未添加个人签名 2021.08.04 加入

还未添加个人简介

评论

发布
暂无评论
【网络安全】干货|SQL注入攻击思路手法总结(上)