浅谈Sql注入

浅谈Sql注入

sql注入概述

SQL注入即是指web应用程序对用户输入数据的合法性没有判断或过滤不严,攻击者可以在web应用程序中事先定义好的查询语句的结尾上添加额外的SQL语句,在管理员不知情的情况下实现非法操作,以此来实现欺骗数据库服务器执行非授权的任意查询,从而进一步得到相应的数据信息,在实战和测试中,难免会遇见到一些sql注入,下面,我将总结一些常用sql注入中的不同姿势。

寻找sql注入

测试注入点:

1.在参数后面添加单引号或双引号,查看返回包,如果报错或者长度变化,可能存在Sql注入

2.通过构造get、post、cookie请求再相应的http头信息等查找敏感喜喜

3.通过构造一些语句,检测服务器中响应的异常

sql注入的类型

附上自己整理的思维导图学习

d2b5ca33bd20260909111553

常见的数据库类型,分为关系型数据库和非关系型数据库

Mysql注入

d2b5ca33bd20260909111610

二次注入

二次注入一般是用于白盒测试、黑盒测试就算是找到注入也没办法攻击。

d2b5ca33bd20260909112036

加密解密注入

这是一个base64加密的字符串其中%3D是编码中的=符号,把他发送到编码模块当中解密,得到明文

发现这个是注入点需要将原来的注入方式重新加密发送给服务器,可以构造注入语句进行base64加密进行报错注入

d2b5ca33bd20260909112053

Dnslog对外注入

通常我们面对SQL注入过程中没有回显的情况下,只能通过盲注的方式来判断是否存在SQL注入,但是,使用盲注,手工测试是需要花费大量的时间的,可能会想到使用sqlmap直接去跑出数据,但在实际测试中,使用sqlmap跑盲注,有很大的几率,网站把ip给封掉,这就影响了我们的测试进度,也许你也可以使用代理池

中转注入

比如受害者网站URL注入点是经过编码的,不能直接结合sqlmap进行漏洞利用,所以本地搭建一个网站,写一个php脚本编码文件,就可以结合sqlmap工具进行测试。

因为,注入点经过复杂编码之后,就不能直接结合sqlmap进行漏洞攻击了。或者sqlmap自己编写tamper脚本进行攻击

Between注入

主要用于盲注看页面是否有变化,原理如下,例如username的字符内容是test1,第一个字符是t,a到b搜索不了,页面不正常。 a到t就有了,页面正常

借鉴大佬图片:

d2b5ca33bd20260909112107

order by注入

当页面出现mysql报错信息时,注入点在 order by后面,此时可以利用报错信息进行注入,尝试报错注入

d2b5ca33bd20260909112134

Sql注入绕过姿势

分块传输

比如在burp抓包时,存在Post请求的注入,如id=1′ and 1=2#

尝试分块传输

d2b5ca33bd20260909112251

进行分块传输的时候,请求头要加上Transfer-Encoding: Chunked,然后POST的数据规则如下

2 #下面的数据的长度,可以在后面加个分号然后添加注释(2; hello world) id #请求的参数 2 #下面的数据的长度 =1 #请求的值,和前面的id连起来 0 #表明分块请求结束,一个0和两个换行

中间件HPP(HTTP参数污染)

d2b5ca33bd20260909112304

HPP是HTTP Parameter Pollution的缩写,意为HTTP参数污染。

  • 原理:浏览器在跟服务器进行交互的过程中,浏览器往往会在GET/POST请求里面带上参数,这些参数会以 名称-值 对的形势出现,通常在一个请求中,同样名称的参数只会出现一次。但是在HTTP协议中是允许同样名称的参数出现多次的。比如下面这个链接:http://www.baidu.com?name=aa&name=bb,针对同样名称的参数出现多次的情况,不同的服务器的处理方式会不一样。有的服务器是取第一个参数,也就是name=aa。有的服务器是取第二个参数,也就是name=bb。有的服务器两个参数都取,也就是name=aa,bb 。这种特性在绕过一些服务器端的逻辑判断时,非常有用。

  • HPP漏洞,与Web服务器环境、服务端使用的脚本有关。如下是不同Web服务器对于出现多个参数时的选择

  • 通过HPP接管账户,当网站开发者不熟悉Web服务器对于多参数时如何选择,将给攻击者可乘之机。HPP能针对客户端和服务端进行攻击。

  • HPP参数污染还可以用于绕过某些防火墙对于 SQL注入的检测,例如当Web服务器对多参数都同时选择时,我们可以用以下这种方式绕过某些防火墙:

HTTP参数污染是指当同一参数出现多次,不同的中间件会解析为不同的结果

WAF绕过-数据库特性

mysql注释符有三种

空格符

特殊符号:%a换行符

内联注释

mysql黑魔法

WAF绕过-逻辑层

逻辑问题

  1. 云waf防护,一般我们会尝试通过查找站点的真实IP,从而绕过CDN防护。

  2. 当提交GET、POST同时请求时,进入POST逻辑,而忽略了GET请求的有害参数输入,可尝试Bypass。

  3. HTTP和HTTPS同时开放服务,没有做HTTP到HTTPS的强制跳转,导致HTTPS有WAF防护,HTTP没有防护,直接访问HTTP站点绕过防护。

  4. 特殊符号%00,部分waf遇到%00截断,只能获取到前面的参数,无法获取到后面的有害参数输入,从而导致Bypass。

性能问题

  • 猜想1:在设计WAF系统时,考虑自身性能问题,当数据量达到一定层级,不检测这部分数据。只要不断的填充数据,当数据达到一定数目之后,恶意代码就不会被检测了。

  • 猜想2:不少WAF是C语言写的,而C语言自身没有缓冲区保护机制,因此如果WAF在处理测试向量时超出了其缓冲区长度就会引发bug,从而实现绕过。

方式二:静态资源

  • 特定的静态资源后缀请求,常见的静态文件(.js.jpg.swf.css等等),类似白名单机制,waf为了检测效率,不去检测这样一些静态文件名后缀的请求。

  • Aspx/php只识别到前面的.aspx/.php后面基本不识别

方式三:url白名单

  • 为了防止误拦,部分waf内置默认的白名单列表,如admin/manager/system等管理后台。只要url中存在白名单的字符串,就作为白名单不进行检测。常见的url构造姿势

Sqlserver注入(mssql)

SQL Server数据库是由Microsoft开发和推广的关系数据库管理系统(DBMS),是一个比较大型的数据库。端口号为 1433。数据库后缀名 .mdf,注释符是 — 。延时命令:WAITFOR DELAY ‘0:0:2’

SQLServer有三个权限级别:

  • sa权限:数据库操作,文件管理,命令执行,注册表读取等system。SQLServer数据库的最高权限

  • db权限:文件管理,数据库操作等权限 users-administrators

  • public权限:数据库操作 guest-users

d2b5ca33bd20260909112349

全回显操作

获取当前数据库中的表(有2个语句可供选择使用)【下列语句可一次爆数据库所有表(只限于mssql2005及以上版本)】

案例: mozhe_dbv2是数据库名字

d2b5ca33bd20260909112436

一次爆指定表的所有列(只限于mssql2005及以上版本):

案例: mange是表名

d2b5ca33bd20260909112447

拓展

Sqlite注入

如果您的站点允许用户通过网页输入,并将输入内容插入到 SQLite 数据库中,这个时候您就面临着一个被称为 SQL 注入的安全问题。本章节将向您讲解如何防止这种情况的发生,确保脚本和 SQLite 语句的安全。

1.Sqlite-master:这个是内置系统表、相当于mysql的information_schema

但是这里只存有表的信息,里面有个sql字段,有各个表的结构,有表名,字段名和类型

2.sqlite并不支持像mysql那样的注释,但是可以通过 — 方式增加DDL注释(写shell会用到)

Postsql注入

PostgreSQL是一种特性非常齐全的自由软件的对象-关系型数据库管理系统(ORDBMS),4.2版本为基础的对象关系型数据库管理系统。

PostgreSQL安装后,默认的端口是:5432,默认的用户名是: postgres ,默认的数据库也是:postgres 。

d2b5ca33bd20260909112708

Oracle注入

基础知识
Oracle 使用查询语句获取数据时需要跟上表名,没有表的情况下可以使用dual,dual是Oracle的虚拟表,用来构成select的语法规则,Oracle保证dual里面永远只有一条记录。

Oracle的数据类型是强匹配的(MYSQL有弱匹配的味道),所以在Oracle进行类似UNION查询数据时候必须让对应位置上的数据类型和表中的列的数据类型是一致的,也可以使用null代替某些无法快速猜测出数据类型的位置。

© 版权声明
THE END
喜欢就支持一下吧
点赞0赞赏 分享