首页 > 其他分享 >二次、宽字节注入

二次、宽字节注入

时间:2023-09-17 11:01:00浏览次数:37  
标签:语句 字符 字节 二次 admin 转义 注入

1 二次注入  

二次注入是指已存储(数据库、文件)的用户输入被读取后,再次进入到 SQL 查询语句中导致的注入。

过程如下:

1. 第一次插入恶意数据:在第一次进行数据库插入数据的时候,使用addslashes 或者是借助 get_magic_quotes_gpc 对其中的特殊字符进行了转义,在后端代码中可能会被转义,但在存入数据库时还是原来的数据,数据中一般带有单引号和#号;

例如,插入1‘#;转义成1\’#。不能注入,但是保存在数据库时变成了原来的1’#。

2. 引用恶意数据,篡改正常数据:再次调用时,拼凑到SQL中就形成了二次注入。

利用1’#进行注入,也很好理解,单引号提前闭合,#注释后续语句。

这里利用时要求取出数据时不转义。

二次注入比普通sql注入利用更加困难,利用门槛更高。普通注入数据直接进入到 SQL 查询中,而二次注入则是输入数据经处理后存储,取出后,再次进入到 SQL 查询。换言之,二次注入需要具备的两个条件:

(1)用户向数据库插入恶意语句(即使后端代码对语句进行了转义,如mysql_escape_string、mysql_real_escape_string转义)

(2)数据库对自己存储的数据非常放心,直接取出恶意数据给用户

2 二次注入案例  

2.1 以sqli-lab less-24为例

正常来说,无法通过注入来登录admin,因为用户输入会被转义。我们尝试注册admin ‘#,注册成功;

二次、宽字节注入_宽字节注入

二次、宽字节注入_宽字节注入_02

 

登录admin'# 转义成admin\'#,则登录的是admin'#

更新密码的sql语句为:UPDATE users SET pw=’$newpw’ where username = ‘$name’ and pw=’oldpw’;

修改admin'#的密码,由于这里不会被转义,故可以直接利用,这个时候就变成了修改了admin的密码,#后面的语句不执行。于是语句变成:

UPDATE users SET pw=’123456’ where username = ‘admin’#' and pw=’123’;

于是我们修改admin密码成功

二次、宽字节注入_转义_03

注意到左图admin密码为admin,被修改为123456

2.2 防御

1. 通过预编译解决SQL注入。

2. 永远不要相信用户的输入!对输入一视同仁,无论输入来自用户还是存储,在进入到 SQL 查询前都对其进行过滤、转义。

3 宽字节注入  

宽字节注入是利用mysql的一个特性,mysql在使用GBK编码的时候,会认为两个字符是一个汉字(前一个ascii码要大于128,才到汉字的范围),也就是说一次性会读取两个字节。简单来说,宽字节注入就是将两个ascii字符误认为是一个宽字节字符。然而,除了GBK的存在,转义字符\也是可以构成此漏洞的因素。当ascii码大于127的字符和转义字符\组成宽字节字符,会造成单引号或者双引号逃逸,进而导致sql注入。

产生宽字节注入的原因涉及了编码转换的问题,当我们的mysql使用GBK编码后,同时两个字符的前一个字符ASCII码大于128时,会将两个字符认成一个汉字,那么如果存在过滤我们输入的函数(addslashes()、mysql_real_escape_string()、mysql_escape_string()、Magic_quotes_gpc)会将我们的输入进行转义。

尝试注入,我们举一个简单的例子:addslashes():该函数的作用是返回在预定义字符之前添加反斜杠的字符串。

4 宽字节注入案例  

4.1 以sqli-lab less-32为例

假设我们传入一个参数id为1'查看数据库是否错报:127.0.0.1/sqli-labs/Less-32/?id=1'

那么经过函数过滤后我们的输入拼接到sql语句就会变成:select * from user where id = '1\''

二次、宽字节注入_二次注入_04

二次、宽字节注入_转义_05

单引号被转义了能正常执行。

二次、宽字节注入_数据库_06

127.0.0.1/sqli-labs/Less-32/?id=-1%df%27union select 1,user(),3--+

所以如上,%df' 变为 %df\' 而 %df\组成 %df%5C ,此为運字。而運字刚好使得转义字符失效,单引号成功逃逸,造成提前闭合。

二次、宽字节注入_数据库_07

4.2 pikachu靶场wide byte注入

二次、宽字节注入_转义_08

name=kobe1%df' or 1=1#

5 总结  

二次注入关键词为:已存储(数据库、文件)的用户输入被读取后,再次进入到 SQL 查询语句中导致的注入。

宽字节注入关键字为:当ascii码大于127的字符和转义字符\组成宽字节字符,从而造成单引号或者双引号逃逸,进而导致sql注入。

标签:语句,字符,字节,二次,admin,转义,注入
From: https://blog.51cto.com/u_14881360/7500141

相关文章

  • Spring - 1( 相关了解 + IOC 容器 + DI 依赖注入 + )
    Spring-1目录Spring-1了解SpringFramework系统架构系统架构图一、核心容器相关概念存在问题解决引出IOC仍存在问题并引出DI完成目标:充分解耦最终结果IOC入门案例分析实现DI入门案例分析实现IOC相关内容bean配置id、class基础配置name别名配置scope作用范围思考bea......
  • WebSocket无法注入属性
    踩坑一:原因:是因为Spring对象的创建都是以单例模式创建的,在启动时只创建一次WebSocket。而WebSocketServer在每个连接请求到来时,都会new一个对象。所以当你启动项目时,你想要注入的对象已经注入进去,但是当用户连接是,新创建的websocket对象没有你要注入的对象,所以会报NullPointerEx......
  • 堆叠注入笔记
    1堆叠注入 1.1堆叠注入成因Sql查询语句中,分号“;”代表查询语句的结束,所以在执行sql语句结尾分号的后面,再加一条sql语句,这个语句会一起执行,造成注入,这就是堆叠注入(StackedInjection)。堆叠注入在mysql数据库中并不常见,常见于mssql数据库,mssql数据库是默认堆叠注入的。如用户输......
  • spring依赖注入单例模式下(默认都是单例),类变量(实例变量)线程安全问题
    java变量是程序中最基本的存储单元,其要素包括变量名,变量类型和作用域。Java的变量类型有:   成员变量类中的变量(独立于方法之外的变量)   局部变量类的方法中的变量。而java类的成员变量又有俩种:   静态变量(类变量):独立于方法之外的变量,用static修饰。   实例变......
  • APC进程注入C++示例和检测思考
    直接贴C++代码效果:apc注入到pid为39712的进程procexp可以看到注入的DLL! 好了,我们看看代码如何写:注入部分//inject3.cpp:此文件包含"main"函数。程序执行将在此处开始并结束。#include<iostream>#include<Windows.h>#include<TlHelp32.h>usingnamespacestd;......
  • 【大数据OLAP技术新书推荐】 字节跳动、阿里巴巴大厂资深架构师程序员多年实践经验总
    ClickHouse领域集大成之作-ClickHouse入门进阶实战的标准参考书-日常工作案头必备!目录《ClickHouse入门、实战与进阶》简介图书评价作者简介内容简介为何写作本书本书主要特点如何阅读本书致谢全书目录目录《ClickHouse入门、实战与进阶》内容简介为何写作本书本书主要特点......
  • Spring源码分析(三)自动注入与精确注入
    上篇文章讲了1.4小节中关于依赖注入和方法注入的内容。这篇文章继续这节中的其他内容,顺便解决下上篇文章中留下的问题---注入模型前言:在看下面的内容之前,我们先对自动注入和精确注入有一个大概的了解,所谓精确注入就是指通过构造函数或setter方法指定了我们对象之间的依赖,也就是......
  • 宏景HCM SQL注入漏洞复现(CNVD-2023-08743)
    漏洞概述宏景HCM存在SQL注入漏洞,未经过身份认证的远程攻击者可利用此漏洞执行任意SQL指令,从而窃取数据库敏感信息。影响范围宏景HCM<8.2漏洞复现fofa语法:FOFA:body='<divclass="hj-hy-all-one-logo"'鹰图语法:app.name="宏景HCM"POC:(注入点是categories字段)/servlet/codes......
  • python连接mysql sql注入问题 事务
    1.pycharm连接MySQL importpymysql#1.连接MySQL服务端conn=pymysql.connect(host='127.0.0.1',port=3306,user='root',passwd='123456',db='db3',charset='utf8',autocommit=True......
  • SQL注入和序列化的结合
    题目来自:[网鼎杯2018]Fakebook感觉原来学的有点局限,就只考虑到sql注入或者php反序列化啥的单方向,很少思考过结合起来的考法。话不多说,直接开解:登录要密码,join就是注册,估计直接注入注不出来,不然就不会给注册的选项了,那么我们就注册一个吧。这里注意一下blog的意思是给一个域......