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 随机记录mysql rand()造成CPU 100%的解决办法
May 18 PHP
php中随机显示图片的函数代码
Jun 23 PHP
使用PHP求两个文件的相对路径
Jun 20 PHP
PHP将两个关联数组合并函数提高函数效率
Mar 18 PHP
PHP异常Parse error: syntax error, unexpected T_VAR错误解决方法
May 06 PHP
php 购物车完整实现代码
Jun 05 PHP
php实现httpRequest的方法
Mar 13 PHP
yii2 RBAC使用DbManager实现后台权限判断的方法
Jul 23 PHP
深入浅析PHP的session反序列化漏洞问题
Jun 15 PHP
php命令行写shell实例详解
Jul 19 PHP
Laravel框架实现修改登录和注册接口数据返回格式的方法
Aug 17 PHP
PHP中$GLOBALS与global的区别详解
Mar 21 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
phpMyAdmin链接MySql错误 个人解决方案
2009/12/28 PHP
三个类概括PHP的五种设计模式
2012/09/05 PHP
php判断手机访问还是电脑访问示例分享
2014/01/20 PHP
php 人员权限管理(RBAC)实例(推荐)
2017/05/24 PHP
PHP命令Command模式用法实例分析
2018/08/08 PHP
Eclipse去除js(JavaScript)验证错误
2014/02/11 Javascript
JS判断网页广告是否被浏览器拦截过滤的代码
2015/04/05 Javascript
js判断文本框输入的内容是否为数字
2015/12/23 Javascript
AngularJS入门教程之控制器详解
2016/07/27 Javascript
JavaScript仿百度图片浏览效果
2016/11/23 Javascript
纯javascript前端实现base64图片下载(兼容IE10+)
2018/09/14 Javascript
使用form-create动态生成vue自定义组件和嵌套表单组件
2019/01/18 Javascript
深入理解Node内建模块和对象
2019/03/12 Javascript
Javascript读取上传文件内容/类型/字节数
2019/04/30 Javascript
浅谈vue限制文本框输入数字的正确姿势
2019/09/02 Javascript
原生JavaScript实现的无缝滚动功能详解
2020/01/17 Javascript
js实现带箭头的进度流程
2020/03/26 Javascript
[01:52]2014DOTA2西雅图邀请赛 V社开大会你不知道的小秘密
2014/07/08 DOTA
Python+Django在windows下的开发环境配置图解
2009/11/11 Python
简单介绍Python中的几种数据类型
2016/01/02 Python
在Pycharm中将pyinstaller加入External Tools的方法
2019/01/16 Python
一文了解Python并发编程的工程实现方法
2019/05/31 Python
python-xpath获取html文档的部分内容
2020/03/06 Python
python pip如何手动安装二进制包
2020/09/30 Python
加拿大女装网上购物:Reitmans
2016/10/20 全球购物
KIKO比利时官网:意大利彩妆品牌
2017/07/23 全球购物
英国游戏机和游戏购物网站:365games.co.uk
2018/06/18 全球购物
JD Sports澳洲官网:英国领先的运动鞋和运动时尚零售商
2020/02/15 全球购物
乌克兰数字设备、配件和智能技术的连锁商店:KTC
2020/08/18 全球购物
什么是Assembly(程序集)
2014/09/14 面试题
编程输出如下图形
2013/11/24 面试题
大学毕业生简单自荐信
2013/11/05 职场文书
党员思想汇报范文
2013/12/30 职场文书
学校个人对照检查材料
2014/08/26 职场文书
投资公司董事长岗位职责
2015/04/16 职场文书
python实现大文本文件分割成多个小文件
2021/04/20 Python