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

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

 

01 背景知识

1、为何要进行URL编码

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

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

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

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

02 二次编码注入

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

 
二次编码注入

从中咱们也能够得知,二次编码注入产生的缘由是:
后端程序的编码函数,如urldecode()等,与PHP自己处理编码时,二者配合失误,使得攻击者能够构造数据消灭\python

看一下实例代码:mysql

//用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注入攻击。web

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

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

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

相关文章
相关标签/搜索