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的栏目导航程序
Oct 09 PHP
用PHP实现将GB编码转换为UTF8
Nov 25 PHP
PHP header函数分析详解
Aug 06 PHP
用PHP实现Ftp用户的在线管理
Feb 16 PHP
PHP获取http请求的头信息实现步骤
Dec 16 PHP
PHP数字字符串左侧补0、字符串填充和自动补齐的几种方法
May 10 PHP
php获取服务器端mac和客户端mac的地址支持WIN/LINUX
May 15 PHP
Symfony2框架学习笔记之表单用法详解
Mar 18 PHP
Zend Framework框架之Zend_Mail实现发送Email邮件验证功能及解决标题乱码的方法
Mar 21 PHP
老生常谈PHP位运算的用途
Mar 12 PHP
PHP API接口必备之输出json格式数据示例代码
Jun 27 PHP
YII2框架中使用RBAC对模块,控制器,方法的权限控制及规则的使用示例
Mar 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
其他功能
2006/10/09 PHP
discuz Passport 通行证 整合笔记
2008/06/30 PHP
PHP 判断常量,变量和函数是否存在
2009/04/26 PHP
如何用PHP实现插入排序?
2013/04/10 PHP
PHP Web木马扫描器代码分享
2015/09/06 PHP
Yii2中hasOne、hasMany及多对多关联查询的用法详解
2017/02/15 PHP
PHP在弹框中获取foreach中遍历的id值并传递给地址栏
2017/06/13 PHP
PHP7中I/O模型内核剖析详解
2019/04/14 PHP
javascript js cookie的存储,获取和删除
2007/12/29 Javascript
Javascript面向对象编程
2012/03/18 Javascript
div+css+js实现无缝滚动类似marquee无缝滚动兼容firefox
2013/08/29 Javascript
js键盘事件的keyCode
2014/07/29 Javascript
JS实现往下不断流动网页背景的方法
2015/02/27 Javascript
深入理解JavaScript中的对象
2015/06/04 Javascript
Node.js返回JSONP详解
2016/05/18 Javascript
Reactjs实现通用分页组件的实例代码
2017/01/19 Javascript
详解axios 全攻略之基本介绍与使用(GET 与 POST)
2017/09/15 Javascript
使用webpack-dev-server处理跨域请求的方法
2018/04/18 Javascript
使用Vue的slot插槽分发父组件内容实现高度复用、更加灵活的组件(推荐)
2018/05/01 Javascript
vue加载完成后的回调函数方法
2018/09/07 Javascript
layui实现数据表格自定义数据项
2019/10/26 Javascript
python3解析库BeautifulSoup4的安装配置与基本用法
2018/06/26 Python
Pytorch 实现自定义参数层的例子
2019/08/17 Python
TensorFlow查看输入节点和输出节点名称方式
2020/01/04 Python
pycharm 激活码及使用方式的详细教程
2020/05/12 Python
使用css3匹配手机屏幕横竖状态
2014/01/27 HTML / CSS
html5中JavaScript removeChild 删除所有节点
2014/05/16 HTML / CSS
日本高岛屋百货购物网站:TAKASHIMAYA
2019/03/24 全球购物
个性大学生自我评价
2013/12/04 职场文书
《四季》教学反思
2014/04/08 职场文书
安全生产宣传标语
2014/06/06 职场文书
研修心得体会
2014/09/04 职场文书
警察正风肃纪剖析材料
2014/10/16 职场文书
Django 如何实现文件上传下载
2021/04/08 Python
Python中字符串对象语法分享
2022/02/24 Python
详解Redis的三种常用的缓存读写策略步骤
2022/05/06 Redis