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函数代码
Apr 22 PHP
常用的PHP数据库操作方法(MYSQL版)
Jun 08 PHP
PHP正确配置mysql(apache环境)
Aug 28 PHP
深入PHP数据缓存的使用说明
May 10 PHP
php编程每天必学之表单验证
Mar 01 PHP
php5.2的curl-bug 服务器被php进程卡死问题排查
Sep 19 PHP
PHP编程获取音频文件时长的方法【基于getid3类】
Apr 20 PHP
php从数据库中读取特定的行(实例)
Jun 02 PHP
thinkPHP5框架实现基于ajax的分页功能示例
Jun 12 PHP
Thinkphp5.0 框架Model模型简单用法分析
Oct 11 PHP
阿里对象存储OSS在laravel框架中的使用方法
Oct 13 PHP
通过PHP的Wrapper无缝迁移原有项目到新服务的实现方法
Apr 02 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面向对象中static静态属性与方法的内存位置分析
2015/02/08 PHP
php记录搜索引擎爬行记录的实现代码
2018/03/02 PHP
PHP面向对象五大原则之接口隔离原则(ISP)详解
2018/04/04 PHP
jQuery源码分析-02正则表达式 RegExp 常用正则表达式
2011/11/14 Javascript
简略说明Javascript中的= =(等于)与= = =(全等于)区别
2013/04/16 Javascript
JavaScript将数组转换成CSV格式的方法
2015/03/19 Javascript
每天一篇javascript学习小结(Boolean对象)
2015/11/12 Javascript
JavaScript的Ext JS框架中的GridPanel组件使用指南
2016/05/21 Javascript
jQuery使用经验小技巧(推荐)
2016/05/31 Javascript
jQuery自制提示框tooltip改进版
2016/08/01 Javascript
jQuery实现的右下角广告窗体跟随效果示例
2016/09/16 Javascript
PHP实现记录代码运行时间封装类实例教程
2017/05/08 Javascript
vue如何将v-for中的表格导出来
2018/05/07 Javascript
移动端滑动切换组件封装 vue-swiper-router实例详解
2018/11/25 Javascript
详解vue项目接入微信JSSDK的坑
2018/12/14 Javascript
JavaScript数据结构与算法之检索算法示例【二分查找法、计算重复次数】
2019/02/22 Javascript
如何对react hooks进行单元测试的方法
2019/08/14 Javascript
如何在vue 中引入使用jquery
2020/11/10 jQuery
python决策树之C4.5算法详解
2017/12/20 Python
为什么入门大数据选择Python而不是Java?
2018/03/07 Python
使用anaconda的pip安装第三方python包的操作步骤
2018/06/11 Python
python初学者,用python实现基本的学生管理系统(python3)代码实例
2019/04/10 Python
tensorflow实现tensor中满足某一条件的数值取出组成新的tensor
2020/01/04 Python
CSS3制作气泡对话框的实例教程
2016/05/10 HTML / CSS
HTML5边玩边学(1)画布实现方法
2010/09/21 HTML / CSS
Java中的基本数据类型所占存储空间大小固定的吗
2012/02/15 面试题
同学聚会老师邀请函
2014/01/28 职场文书
逃课上网检讨书
2014/02/20 职场文书
委托协议书范本
2014/04/22 职场文书
党员评议思想汇报
2014/10/08 职场文书
单位实习鉴定评语
2015/01/04 职场文书
考研经验交流会策划书
2015/11/02 职场文书
四则混合运算教学反思
2016/02/23 职场文书
入党申请书怎么写?
2019/06/21 职场文书
css display table 自适应高度、宽度问题的解决
2021/05/07 HTML / CSS
vue使用echarts实现折线图
2022/03/21 Vue.js