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 相关文章推荐
BBS(php & mysql)完整版(三)
Oct 09 PHP
php 带逗号千位符数字的处理方法
Jan 10 PHP
php中将指针移动到数据集初始位置的实现代码[mysql_data_seek]
Nov 01 PHP
php生成二维码的几种方式整理及使用实例
Jun 03 PHP
php实现webservice实例
Nov 06 PHP
linux下为php添加iconv模块的方法
Feb 28 PHP
Apache PHP MySql安装配置图文教程
Aug 27 PHP
ThinkPHP5实现作业管理系统中处理学生未交作业与已交作业信息的方法
Nov 12 PHP
PHP三种方式实现链式操作详解
Jan 21 PHP
ThinkPHP Where 条件中常用表达式示例(详解)
Mar 31 PHP
删除PHP数组中的重复元素的实现代码
Apr 10 PHP
thinkphp5.0自定义验证规则使用方法
Nov 16 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
Warning: session_destroy() : Trying to destroy uninitialized sessionq错误
2011/06/16 PHP
VPS中使用LNMP安装WordPress教程
2014/12/28 PHP
JavaScript实现滚动栏效果的方法
2015/04/27 PHP
Laravel 之url参数,获取路由参数的例子
2019/10/21 PHP
在firefox和Chrome下关闭浏览器窗口无效的解决方法
2014/01/16 Javascript
用js提交表单解决一个页面有多个提交按钮的问题
2014/09/01 Javascript
jquery实现多屏多图焦点图切换特效的方法
2015/05/04 Javascript
JavaScript保留关键字汇总
2015/12/01 Javascript
快速使用Bootstrap搭建传送带
2016/05/06 Javascript
模仿password输入框的实现代码
2016/06/07 Javascript
浅谈JSON.stringify()和JOSN.parse()方法的不同
2016/08/29 Javascript
AngularJS封装指令方法详解
2016/12/12 Javascript
jQuery实现百度登录框的动态切换效果
2017/04/21 jQuery
jQuery遍历节点方法汇总(推荐)
2017/05/13 jQuery
Angularjs中ng-repeat的简单实例
2017/08/25 Javascript
Webpack4+Babel7+ES6兼容IE8的实现
2019/04/10 Javascript
JavaScript简单编程实例学习
2020/02/14 Javascript
[36:20]完美世界DOTA2联赛PWL S3 access vs Rebirth 第一场 12.17
2020/12/18 DOTA
Python实现3行代码解简单的一元一次方程
2014/08/18 Python
python进阶教程之循环相关函数range、enumerate、zip
2014/08/30 Python
python分治法求二维数组局部峰值方法
2018/04/03 Python
Flask框架各种常见装饰器示例
2018/07/17 Python
python使用插值法画出平滑曲线
2018/12/15 Python
python做反被爬保护的方法
2019/07/01 Python
在pycharm中实现删除bookmark
2020/02/14 Python
Python使用Pyqt5实现简易浏览器(最新版本测试过)
2020/04/27 Python
python 实现的IP 存活扫描脚本
2020/12/10 Python
印度尼西亚值得信赖的第一家网店:Bhinneka
2018/07/16 全球购物
纯净、自信、100%的羊绒服装:360Cashmere
2021/02/20 全球购物
机电一体化专业应届生求职信
2013/11/27 职场文书
美术教学感言
2014/02/22 职场文书
市场营销方案范文
2014/03/11 职场文书
工会优秀工作者事迹
2014/08/17 职场文书
幼儿教师辞职信
2015/02/27 职场文书
2015年世界环境日演讲稿
2015/03/18 职场文书
Golang 遍历二叉树
2022/04/19 Golang