SQL注入防御绕过——二次编码之干掉反斜杠

Wesley13
• 阅读 477

SQL注入防御绕过——二次编码

01 背景知识

一、为什么要进行URL编码

通常如果一样东西需要编码,说明这样东西并不适合传输。对于URL来说,编码主要是为了避免引发歧义与混乱。
例如,URL参数字符串中使用key=value键值对这样的形式来传参,键值对之间以&符号分隔,如/?name=abc&pwd=123如果你的value字符串中包含了=或者&,那么势必会造成接收Url的服务器解析错误,因此必须将引起歧义的&和= 符号进行转义,也就是对其进行编码。
对于URL编码的深入研究可以参看下面这些内容:
为什么要进行URL编码
深入分析 web 请求响应中的编码问题

二、URL传输过程中的编码问题

HTTP请求过程经历的几个环节:
浏览器【get/post】①========>服务器②========>浏览器显示③

  • ①:浏览器会把URL经过编码后发送给服务器,不同的浏览器对URL的编码规则不同。对于GET方式提交的数据,浏览器会自动进行URL编码;对于POST方式提交的数据,其编码方式可以由开发者进行指定。
  • ②:服务器根据其自身的配置文件对URL进行解码(解码成Unicode),然后将显示内容编码。
  • ③:浏览器按照指定的编码显示该网页。
    此外,在客户端也就是浏览器上运行的前端程序也会根据Web服务的需要对要传输的数据进行一些编码操作,而在服务端除了服务器中间件会自动对URL进行解码,后端的Web程序会对前端进行编码的数据进行解码操作。

02 二次编码注入

下面这幅图片很好地解释了二次编码注入的原理(图片来源为网易Web安全工程师课程,侵删):

二次编码注入

从中我们也可以得知,二次编码注入产生的原因是:
后端程序的编码函数,如urldecode()等,与PHP本身处理编码时,两者配合失误,使得攻击者可以构造数据消灭\

看一下实例代码:

//用GET方式获取id值,并对其中的特殊字符进行转义
$id = mysql_real_escap_string($_GET['id']);
//使用urldecode()函数进行解码
$id = urldecode($id); $sql = "SELECT * FROM usres WHERE id = '$id' LIMIT 0,1; $result = mysql_query($sql); $row = mysql_fetch_array($result); 

上面的代码就是一个二次注入的典型场景,这时如果我们提交:
http://127.0.0.1/sql.php?id=1%2527
就可以绕过对'的转义,进行SQL注入攻击。

在测试时,如果发现了页面可能存在二次编码注入漏洞,也可以使用sqlmap进行自动化攻击

//只需在注入点后键入%2527即可
python sqlmap.py -u "http://127.0.0.1/sql.php?id=1%2527"

分享一个二次编码注入的漏洞实例

点赞
收藏
评论区
推荐文章
blmius blmius
2年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Jacquelyn38 Jacquelyn38
2年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Easter79 Easter79
2年前
sql注入
反引号是个比较特别的字符,下面记录下怎么利用0x00SQL注入反引号可利用在分隔符及注释作用,不过使用范围只于表名、数据库名、字段名、起别名这些场景,下面具体说下1)表名payload:select\from\users\whereuser\_id1limit0,1;!(https://o
Stella981 Stella981
2年前
Python3:sqlalchemy对mysql数据库操作,非sql语句
Python3:sqlalchemy对mysql数据库操作,非sql语句python3authorlizmdatetime2018020110:00:00coding:utf8'''
Stella981 Stella981
2年前
Bypass ngx_lua_waf SQL注入防御(多姿势)
0x00前言ngx\_lua\_waf是一款基于ngx\_lua的web应用防火墙,使用简单,高性能、轻量级。默认防御规则在wafconf目录中,摘录几条核心的SQL注入防御规则:select.(from|limit)(?:(union(.?)select))(?:from\Winformation_schema\W)这边
Wesley13 Wesley13
2年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Wesley13 Wesley13
2年前
URL编码与解码
通常如果一样东西需要编码,说明这样东西并不适合传输(???存疑)。原因多种多样,如Size过大,包含隐私数据,对于Url来说,之所以要进行编码,是因为Url中有些字符会引起歧义。例如,Url参数字符串中使用keyvalue键值对这样的形式来传参,键值对之间以&符号分隔,如/s?qabc&ieutf8。如果你的value字符串中包含了或者&,那么
Wesley13 Wesley13
2年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
3个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这