常见sql注入的类型
这里只讲解sql注入漏洞的基本类型,代码分析将放在另外一篇帖子讲解
目录
- 最基础的注入-union注入攻击
- Boolean注入攻击-布尔盲注
- 报错注入攻击
- 时间注入攻击-时间盲注
- 堆叠查询注入攻击
- 二次注入攻击
- 宽字节注入攻击
- base64注入攻击
- cookie注入攻击-http请求头参数注入
- XFF注入攻击-http请求头参数注入
- 知道绝对路径的注入
0x01最基础的注入-union注入攻击
- 判断是get型还是post型注入;
- 找到正确的闭合规则;
- order by 查询字段数;
- union select 1,2.....查看显示位是第几位,没有的话就试试把id=1的显示位让出来,让其等于id=-1;
- 第二、三位显示出来了,那么即可在这两个位置写入sql语句;
- 查询当前数据库,当前mysql用户 union select 1,user(),database();
- 查询当前数据库里面的表 union select 1,2,group_concat(table_name) from information_schema.tables where table_schema="data_name";
- 查询到敏感表名user,继续查询表里面的字段 union select 1,2,group_concat(column_name) from information_schema.columns where table_name="user";
- 查询字段,例如“id”、"passwd"的内容 union select 1,id,passwd from user;
- 拿到用户、密码登入后台。
0x02 Boolean注入攻击-布尔盲注
- 查看现象,能报错,但没有报错信息,正确查询也显示不了查询内容就属于布尔盲注,只存在两种状态,对或错;
- 由页面的两种不同返回的状态来判定我们的闭合规则;
- 为了方便,我们这里假设返回正确用“yes”,返回错误用“no”来表示这两种状态
- 找到闭合规则后,我们在闭合规则里面 and 1=1 和 and 1=2 测试一下,看看最后返回是不是两种状态;
- 布尔盲注要用到length()和substr()语句,用两种状态来猜解数据库、表名等的长度和正确字母;
- 先用 and length(database())>2 来猜数据库的长度,使用的是二分法;
- 再用 and substr(database(),1,1)='t' 来确定第一个字母,可用burp跑,26个字母,哪个字母返回yes则代表第一个字母就是它;
- and substr(database(),2,1)='t' 代表当前数据库的第二个字母;
- 最后结合长度,成功的将数据库猜解出来;
- 后面的操作跟union注入的步骤差不多了,只是sql语句写在 上文的 database() 处。
0x03 报错注入攻击
- 只要注入点有sql报错信息,那么就可以使用报错注入;
- 还是一样,引号报错,然后找到闭合规则,页面正常显示,则可以在闭合规则中开始写入报错注入的sql语句;
- updatexml报错获取当前数据库:
and updatexml(1,concat(0x7e,(select database()),0x7e),1)
- floor报错获取当前数据库:
and (select 1 from (select count(*),concat((database()),floor (rand(0)*2))x from information_schema.tables group by x)a)
- 两种方式都可行,如果第一个不行就试试第二个
- 接着可以利用select语句替换掉上面database()来继续获取数据库中的表名、字段名,查询语句和union注入攻击的语句相同;
- 只不过这里不能再使用group_concat了,因为报错注入只显示一条结果,所以需要使用limit语句;
0x04 时间注入攻击-时间盲注
- 没有明确的现象,不管是对是错都返回一个状态;
- 但是如果用sleep(5)方法,能让响应时间延迟为5秒以上,那么就为时间盲注;
- 我们用sleep(5)函数构造了一个时间延时的状态,因此,我们又有了两种状态,像布尔盲注一样可以根据这两种状态来判定数据库、表名和字段名的长度和正确的每个字母;
- 同样的找到正确的闭合规则,当然,这个闭合规则得配合着 and sleep(5)语句来构造,哪一个闭合规则执行了sleep(5),那么就是正确得闭合规则;
- 时间盲注配合着 if(A,B,C) 语句结合使用,含义是:如果A是 true,则返回B(也就是执行B),否则返回C(执行C);
- 那么判断当前数据库名的长度的语句为:
if (length(database())>1,sleep(5),1)
就是说如果数据库长度大于1,那么响应延时5秒,否则执行select 1(也就是不延时),由此来推出数据库长度。
- 判断当前数据库名的第一个和第二个字母的语句:
if(substr(database(),1,1)='s',sleep(5),1)
if(substr(database(),2,1)='s',sleep(5),1)
只有第一个字母等于26个字母中正确的字母时,才会延时5秒,因此可以通过burp或者sqlmap来跑。
- 根据数据库名长度以此内推即可得出完整的数据库的库命、表名、字段名和具体内容。
0x05 堆叠查询注入攻击
- 可以使用堆叠注入的地方也可以使用布尔盲注与时间盲注;
- 同样先找出正确的闭合规则,然后也看两种状态来猜解库名、表名等;
- 堆叠注入的语句为
;select if(length(database())>1,sleep(3),1)
;select if(substr(database(),1,1)='r',sleep(3),1) - 按照原理来说,分号后面可以执行新sql语句,但是很多时候没必要,如果遇到其他注入方法(或者绕过方式)不行的情况下可以试试这个注入方式;不是很常用。
0x06 二次注入攻击
- 二次注入一共有两个url,url一用来注入,也就是注入点,插入sql语句的地方,另外一个url用来返回信息;
- 也就是url一插入了sql语句,url一的响应里面就会返回这条信息对应的id值,然后url二就传入这个新id值,然后访问,响应回来之后将会爆出sql语句查询的结果,正确或者错误的sql信息;
- 就相当于url是一个用户注册的地方,用户注册后会在数据库里面加入新id存放用户的注册信息,那么这个id可以传给url二来访问,url二就可以显示出用户的注册信息,但如果注册信息含义恶意sql语句,url二就会显示出敏感的数据库信息;
- 跟union注入攻击差不多,只是回显的信息需要在另外的url中显示出来了;
- 后面就是union注入攻击的常规操作。
0x07 宽字节注入攻击
- 如果遇到单、双引号被转义,变成了反斜杠,导致参数id无法逃逸单引号的包围;
- 一般情况下,此处就不存在sql注入漏洞的;
- 但是如果数据库的编码为GBK时,就可以使用宽字节注入,因此在不知道是否是GBK编码时,都可以尝试去使用宽字节注入;
- 宽字节的格式是在地址后先加一个 %df ,再加单引号,因为反斜杠的编码为%5c,在GBK编码中,%df%5c是繁体字“連”,因此,单引号成功逃逸,爆出sql错误;
- 因此构造闭合规则时,在单引号前面加上 %df 就行了;
- 之后在闭合规则中写入同union注入的一些查询语句就行了;
0x08 base64注入攻击
- 如果遇到url的参数id的值看起来像base64的,先拿去url解码,然后如果是base64,拿去base64解码,解出来的应该就是id的值(1,2等数字);
- 那么如果要对这个url进行sql注入测试,就需要对id后面的所有值进行base64编码;
- 注入的方式步骤都是跟union注入一样的,只不过后面的所有值(整个payload)都要进行base64编码后传给url的c参数提交,包括闭合规则。
0x09 HTTP请求头参数注入-cookie注入攻击
- 抓包对一个url的http请求头的所有参数进行sql注入测试,里面的所有参数都有可能存在注入点,如果响应包出现sql报错,那么测试的这个参数就是注入点;
- 常见的http头部注入的参数有:
【Referer】、【X-Forwarded-For】、【Cookie】、【X-Real-IP】、【Accept-Language】、【Authorization】
- 如果测试到cookie参数的时候,响应有报sql错误,那么就是cookie注入攻击;
- 和union注入的差别就在于注入点不一样,之后使用union注入的方法即可。
0x10 HTTP请求头参数注入-XFF注入攻击
XFF注入即HTTP头部的X-Forwarded-for参数存在sql注入;
例如测试此参数的值 X-Forwarded-for:127.0.0.1' 响应有sql报错,那么此处就是注入点;
- 之后使用union注入的方法完成即可。
0x11 知道绝对路径的注入
如果通过一些方式爆出了网站的根目录,并且知道此站点存在sql注入;
猜测此数据库可能有file权限,那么我们就可以使用语句:into outfile 来写shell到网站的根目录下,之后用菜刀连接;
如果数据库没有file权限,那么我们用sqlmap的参数 --is-dba 来查看当前数据库的用户是否有管理员权限;
如果有管理员权限,我们就可以使用sqlmap里面的参数命令 --os-shell 来上传、反弹shell,最终getshell;
如果file、管理员权限都没有,那么另寻思路,日志、缓存写入等。
简单的介绍了大致遇到的sql注入存在的类型,但是实际情况下可能会遇到更奇葩的sql注入利用方法,但是掌握了这些基本的sql注入之后,对后面sql注入的进阶会更有帮助;之后还会介绍sql注入常用到的绕过技术。
常见sql注入的类型的更多相关文章
- 常见SQL注入点判断
sql注入手工检测 SQL注入手工检测 1基本检测 数字型 字符型 搜索型 POST注入 布尔盲注 报错注入 堆叠注入 判断是什么数据库 2绕过技巧 大小写 替换关键字 使用编码 注释和符号 等价函数 ...
- Sql注入_类型
1.sql注入 通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令. 2.sql注入类型 按照注入点类型来分类 (1)数字型注入点 在 Web ...
- XSS过滤JAVA过滤器filter 防止常见SQL注入
Java项目中XSS过滤器的使用方法. 简单介绍: XSS : 跨站脚本攻击(Cross Site Scripting),为不和层叠样式表(Cascading Style Sheets, CSS)的缩 ...
- ecshop常见sql注入修复(转)
ecshop系统部署在阿里云服务器上,阿里云提示Web-CMS漏洞: 修复方法如下: 0. /good.php 大概在第80行 $goods_id = $_REQUEST['id']; 修改为 $go ...
- 常见sql注入的防范总结
在平时的开发过程中,我们可能很少会刻意的去为项目做一个sql注入的防范,这是因为你可能因为使用了某些框架,而无意间已经有了对应sql注入的一些防范操作(比如mybatis使用#{XX}传参,属于预编译 ...
- 十四:SQL注入之类型及提交注入
简要明确参数类型 数字,字符,搜索,json等 简要明确请求方法 GET,POST,COOKIE,REQUEST,HTTP头 其中SQL语句干扰符号:' " % ) } 等,具体查看用法 非 ...
- sql注入之类型及提交注入
#参数类型 这里说的参数是源码中存在注入的地方. 其中参数类型有:数字.字符.搜索.json等. 其中sql语句干扰符号有:',",%,),}等,过滤首先考虑闭合这些符号,再进行注入测试. ...
- 常见sql注入原理详解!
1.首先我们创建一个mysqli的链接 /**数据库配置*/ $config = ['hostname'=>"localhost", 'port'=>"330 ...
- SQL注入的各种类型的检测方式
#SQL注入各个类型检测方式 http://127.0.0.1/day6/1.php?id=1 union select 1,name,pass from admin 数字型 数字型不用特意加字符,直 ...
随机推荐
- 大数据篇:Zookeeper
Zookeeper 1 Zookeeper概念 Zookeeper是什么 是一个基于观察者设计模式的分布式服务管理框架,它负责和管理需要关心的数据,然后接受观察者的注册,一旦这些数据的状态发生变化,Z ...
- postman之上传文件
前言 小伙伴们在日常工作中有没测试过上传文件的接口呢?那么怎么用postman测试上传文件的接口呢?下面我们一起来学习吧! 需求:(1)上传接口地址:http://localhost:8080/pin ...
- 鸭子类型 - Duck Typing
还是先看定义 duck typing, 鸭子类型是多态(polymorphism)的一种形式.在这种形式中,不管对象属于哪个, 也不管声明的具体接口是什么,只要对象实现了相应的方法,函数就可以在对象上 ...
- 12-Tomcat&Servlet:
今日知识 1. web相关概念回顾 2. web服务器软件:tomcat 3. servletr入门学习 web相关概念回顾 1. 软件架构 1. C/S:客户端/服务器端 2. B/S:浏览器/服务 ...
- sparc v8 stack frame calling convention
main.c ; int main() { int a, b; int sum; a = ; b = ; sum = add(a, b); ; } int add(int a, int b) { in ...
- Rip 动态路由协议
路由信息协议(RIP) 是内部网关协议IGP中最先得到广泛使用的协议. Routing Information Protocol) RIP是一种分布式的基于距离矢量的路由 ...
- 字符编码及字节串bytes类型
1 字符编码简介 ASCII码:美国人发明并使用,用1个字节(8位二进制)代表一个字符,ASCII码是其他任意编码表的子集(utf-16除外). Unicode:包含和兼容全世界的语言,与全世界的语言 ...
- cornerstone使用beyond compare比较工具
prefrences->general->external compare tool->open script foder 新建一个bc.sh文件(名字可以任意,sh后缀即可)保存到 ...
- 记网站部署中一个奇葩BUG
网页中引用的文件名不要带 adv 等 近日在写好一个网页后就把他部署到apache上测试,结果用chrome访问时有个背景图片总显示不出来,但是用firefox等却一切正常, 关键是我用windows ...
- leaflet结合geoserver利用WFS服务实现图层删除功能(附源码下载)
前言 leaflet 入门开发系列环境知识点了解: leaflet api文档介绍,详细介绍 leaflet 每个类的函数以及属性等等 leaflet 在线例子 leaflet 插件,leaflet ...