PHP 小心urldecode引发的SQL注入漏洞


Posted in PHP onOctober 27, 2011

Ihipop 学校的 Discuz X1.5 论坛被黑,在那里吵了一个下午。Google 一下“Discuz! X1-1.5 notify_credit.php Blind SQL injection exploit”,你就知道。

Discuz 是国内很流行的论坛系统,被黑的网站应该会很多吧。不过我对入侵别人的网站不感兴趣,同时也鄙视那些代码都不会写只会使用别人放出的工具攻击的所谓的“黑客”。

粗略看了一下代码,这个 SQL 注入漏洞是 urldecode 函数造成的。在 PHP 手册中,urldecode 函数下面有一个警告:

The superglobals $_GET and $_REQUEST are already decoded. Using urldecode() on an element in $_GET or $_REQUEST could have unexpected and dangerous results.

而 Discuz 的开发人员(估计是新手)画蛇添足,多加了一个 urldecode:

foreach($_POST as $k => $v) { 
$value = urldecode($v); 
$this->setParameter($k, $value); 
}

单引号被 urlencode 两次以后是 %2527,然后 POST,PHP 内部在生成全局变量 $_POST 的时候会先 urldecode,得到 %27,然后 PHP 会检查 Magic Quotes 的设置,但是无论是否开启 Magic Quotes,%27 都不会被 addslashes,因为这时根本没有单引号。但是这时如果你在 PHP 代码中画蛇添足的加上 urldecode,%27就变成单引号了,然后……你懂的。

在我初学 PHP 的时候,看的是学校图书馆的一本烂书,里面根本就没写 PHP 在处理表单的时候会自动 urldecode,所以自己用 urldecode 函数来解码(依稀记得书上好像也是这么写的,真是误人子弟啊)。

总结一下,就是:1、选择一本好书非常重要;2、慎用 urldecode 函数。3、注意 PHP 手册中的警告。
原文来自 http://demon.tw/programming/php-urldecode-sql-injection.html

PHP 相关文章推荐
PHP的栏目导航程序
Oct 09 PHP
模仿OSO的论坛(三)
Oct 09 PHP
在PHP中使用反射技术的架构插件使用说明
May 18 PHP
支持中文的php加密解密类代码
Nov 27 PHP
PHP curl 并发最佳实践代码分享
Sep 05 PHP
php源代码安装常见错误与解决办法分享
May 28 PHP
PHP实现文件下载详解
Nov 27 PHP
PHP中大于2038年时间戳的问题处理方案
Mar 03 PHP
php计算两个整数的最大公约数常用算法小结
Mar 05 PHP
php生成与读取excel文件
Oct 14 PHP
thinkPHP自定义类实现方法详解
Nov 30 PHP
php实现的pdo公共类定义与用法示例
Jul 19 PHP
Session保存到数据库的php类分享
Oct 24 #PHP
php中批量修改文件后缀名的函数代码
Oct 23 #PHP
基于Snoopy的PHP近似完美获取网站编码的代码
Oct 23 #PHP
php中经典方法实现判断多维数组是否为空
Oct 23 #PHP
PHP禁止页面缓存的代码
Oct 23 #PHP
Pain 全世界最小最简单的PHP模板引擎 (普通版)
Oct 23 #PHP
供参考的 php 学习提高路线分享
Oct 23 #PHP
You might like
php读取javascript设置的cookies的代码
2010/04/12 PHP
详谈PHP文件目录基础操作
2014/11/11 PHP
php 生成Tab键或逗号分隔的CSV
2016/09/24 PHP
利用PHP实现开心消消乐的算法示例
2017/10/12 PHP
Yii 框架入口脚本示例分析
2020/05/19 PHP
jQuery版仿Path菜单效果
2011/12/15 Javascript
js获取多个tagname的节点数组
2013/09/22 Javascript
新增加的内容是如何将div的scrollbar自动移动最下面
2014/01/02 Javascript
AngularJS学习笔记之ng-options指令
2015/06/16 Javascript
javascript url几种编码方式详解
2016/06/06 Javascript
解决bootstrap导航栏navbar在IE8上存在缺陷的方法
2016/07/01 Javascript
12 款 JS 代码测试必备工具(翻译)
2016/12/13 Javascript
jQuery插件扩展操作入门示例
2017/01/16 Javascript
js学习总结之DOM2兼容处理顺序问题的解决方法
2017/07/27 Javascript
浅谈angular4 ng-content 中隐藏的内容
2017/08/18 Javascript
Vue 组件注册实例详解
2019/02/23 Javascript
vue中template的三种写法示例
2020/10/21 Javascript
Python可变参数函数用法实例
2015/07/07 Python
Python类的继承和多态代码详解
2017/12/27 Python
python实现k-means聚类算法
2018/02/23 Python
Python实现求解括号匹配问题的方法
2018/04/17 Python
Python高级特性切片(Slice)操作详解
2018/09/27 Python
python版本单链表实现代码
2018/09/28 Python
pycharm修改文件的默认打开方式的步骤
2019/07/29 Python
记录模型训练时loss值的变化情况
2020/06/16 Python
基于css3仿造window7的开始菜单
2010/06/17 HTML / CSS
美国时尚配饰品牌:Dooney & Bourke
2017/11/14 全球购物
C语言编程练习
2012/04/02 面试题
生产操作工岗位职责
2014/09/16 职场文书
死亡赔偿协议书
2015/01/28 职场文书
个人廉政承诺书
2015/04/28 职场文书
2015年信息化建设工作总结
2015/07/23 职场文书
学习心得体会
2019/06/20 职场文书
闭幕词的写作格式与范文!
2019/06/24 职场文书
python 统计代码耗时的几种方法分享
2021/04/02 Python
手把手教你使用TensorFlow2实现RNN
2021/07/15 Python