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对gzip文件或者字符串解压实例参考
Jul 25 PHP
PHP daddslashes 使用方法介绍
Oct 26 PHP
使用session判断用户登录用户权限(超简单)
Jun 08 PHP
基于PHP文件操作的详细诠释
Jun 21 PHP
解析PHP跳出循环的方法以及continue、break、exit的区别介绍
Jul 01 PHP
九个你必须知道而且又很好用的php函数和特点
Aug 08 PHP
如何让CI框架支持service层
Oct 29 PHP
7个鲜为人知却非常实用的PHP函数
Jul 01 PHP
php中使用GD库做验证码
Mar 31 PHP
php下载文件,添加响应头的简单实例
Sep 22 PHP
Yii2针对游客、用户防范规则和限制的解决方法分析
Oct 08 PHP
PHP开发实现微信退款功能示例
Nov 25 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与SQL注入攻击[一]
2007/04/17 PHP
php中取得URL的根域名的代码
2011/03/23 PHP
php中time()和mktime()方法的区别
2013/09/28 PHP
php实现批量压缩图片文件大小的脚本
2014/07/04 PHP
php根据日期或时间戳获取星座信息和生肖等信息
2015/10/20 PHP
几款极品的javascript压缩混淆工具
2007/05/16 Javascript
最新的10款jQuery内容滑块插件分享
2011/09/18 Javascript
JavaScript:Div层拖动效果实例代码
2013/08/06 Javascript
jquery通过a标签删除table中的一行的代码
2013/12/02 Javascript
JavaScript操作Oracle数据库示例
2015/03/06 Javascript
jQuery选择器源码解读(一):Sizzle方法
2015/03/31 Javascript
js漂浮广告实现代码
2015/08/15 Javascript
JavaScript运行过程中的“预编译阶段”和“执行阶段”
2015/12/16 Javascript
最简单的JavaScript图片轮播代码(两种方法)
2015/12/18 Javascript
在WordPress中加入Google搜索功能的简单步骤讲解
2016/01/04 Javascript
基于jQuery实现弹出可关闭遮罩提示框实例代码
2016/07/18 Javascript
Vue.directive自定义指令的使用详解
2017/03/10 Javascript
angular directive的简单使用总结
2017/05/24 Javascript
微信小程序之裁剪图片成圆形的实现代码
2018/10/11 Javascript
Vue 实现手动刷新组件的方法
2019/02/19 Javascript
微信小程序实现手势滑动效果
2019/08/26 Javascript
小程序中设置缓存过期的实现方法
2020/01/14 Javascript
Python内置函数bin() oct()等实现进制转换
2012/12/30 Python
利用打码兔和超人打码自封装的打码类分享
2014/03/16 Python
Python提取Linux内核源代码的目录结构实现方法
2016/06/24 Python
详解Python nose单元测试框架的安装与使用
2017/12/20 Python
Python基于matplotlib实现绘制三维图形功能示例
2018/01/18 Python
python使用matplotlib库生成随机漫步图
2018/08/27 Python
python selenium执行所有测试用例并生成报告的方法
2019/02/13 Python
Python pysnmp使用方法及代码实例
2020/08/24 Python
html5通过canvas实现刮刮卡效果示例分享
2014/01/27 HTML / CSS
澳大利亚便宜隐形眼镜购买网站:QUICKLENS Australia
2018/10/06 全球购物
一套VC试题
2015/01/23 面试题
路由表示做什么用的?在linux环境中怎么来配置一条默认路由?
2013/06/07 面试题
英语专业毕业生求职信
2014/05/24 职场文书
考试作弊检讨书范文
2015/01/27 职场文书