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 数据结构 算法 三元组 Triplet
Jul 02 PHP
PHP中文件读、写、删的操作(PHP中对文件和目录操作)
Mar 06 PHP
自己在做项目过程中学到的PHP知识收集
Aug 20 PHP
PHP实现把数字ID转字母ID
Aug 12 PHP
PHP编程中的常见漏洞和代码实例
Aug 06 PHP
PHP会话控制:Session与Cookie详解
Sep 27 PHP
PHP实现的简易版图片相似度比较
Jan 07 PHP
PHP简单检测网址是否能够正常打开的方法
Sep 04 PHP
php实现HTML实体编号与非ASCII字符串相互转换类实例
Nov 02 PHP
php 根据自增id创建唯一编号类
Apr 06 PHP
PHP文字转图片功能原理与实现方法分析
Aug 31 PHP
php利用云片网实现短信验证码功能的示例代码
Nov 18 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实现二叉树的深度优先与广度优先遍历方法
2015/09/28 PHP
PHP读取大文件末尾N行的高效方法推荐
2016/06/03 PHP
kindeditor 加入七牛云上传的实例讲解
2017/11/12 PHP
PHP实现基于PDO扩展连接PostgreSQL对象关系数据库示例
2018/03/31 PHP
php实现微信支付之现金红包
2018/05/30 PHP
PHP的mysqli_ssl_set()函数讲解
2019/01/23 PHP
php 使用mpdf实现指定字段配置字体样式的方法
2019/07/29 PHP
一个基于jquery的图片切换效果
2010/07/06 Javascript
jquery 与NVelocity 产生冲突的解决方法
2011/06/13 Javascript
js data日期初始化的5种方法
2013/12/29 Javascript
用javascript将数据导入Excel示例代码
2014/09/10 Javascript
使用jQuery制作Web页面遮罩层插件的实例教程
2016/05/26 Javascript
微信小程序 开发之滑块视图容器(swiper)详解及实例代码
2017/02/22 Javascript
Bootstrap table学习笔记(2) 前后端分页模糊查询
2017/05/18 Javascript
vue如何判断dom的class
2018/04/26 Javascript
webpack4实现不同的导出类型
2019/04/09 Javascript
VUE脚手架具体使用方法
2019/05/20 Javascript
localstorage实现带过期时间的缓存功能
2019/06/28 Javascript
JS数组转字符串实现方法解析
2020/09/04 Javascript
[02:45]DOTA2英雄敌法师基础教程
2013/11/25 DOTA
Python设计模式编程中Adapter适配器模式的使用实例
2016/03/02 Python
请不要重复犯我在学习Python和Linux系统上的错误
2016/12/12 Python
Python实现扣除个人税后的工资计算器示例
2018/03/26 Python
使用python实现名片管理系统
2020/06/18 Python
Python json格式化打印实现过程解析
2020/07/21 Python
python线程优先级队列知识点总结
2021/02/28 Python
五年级音乐教学反思
2014/02/06 职场文书
大班幼儿评语大全
2014/04/30 职场文书
关于青春的演讲稿800字
2014/08/22 职场文书
先进典型事迹材料
2014/12/29 职场文书
小学少先队辅导员述职报告
2015/01/10 职场文书
催款律师函范文
2015/05/27 职场文书
导游词之黄帝陵景区
2019/09/16 职场文书
Python实战之疫苗研发情况可视化
2021/05/18 Python
MySQL日期时间函数知识汇总
2022/03/17 MySQL
MySQL 分区表中分区键为什么必须是主键的一部分
2022/03/17 MySQL