标签:自身 就是 产生 参数 安全工程师 避免 网页 mat 前端
通常如果一样东西需要编码,说明这样东西并不适合传输。对于URL来说,编码主要是为了避免引发歧义与混乱。
例如,URL参数字符串中使用key=value键值对这样的形式来传参,键值对之间以&符号分隔,如/?name=abc&pwd=123
如果你的value字符串中包含了=或者&,那么势必会造成接收Url的服务器解析错误,因此必须将引起歧义的&和= 符号进行转义,也就是对其进行编码。
对于URL编码的深入研究可以参看下面这些内容:
为什么要进行URL编码
深入分析 web 请求响应中的编码问题
HTTP请求过程经历的几个环节:
浏览器【get/post】①========>服务器②========>浏览器显示③
下面这幅图片很好地解释了二次编码注入的原理(图片来源为网易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"
分享一个二次编码注入的漏洞实例
标签:自身 就是 产生 参数 安全工程师 避免 网页 mat 前端
原文地址:https://www.cnblogs.com/fengshui/p/9266992.html