PHP编程函数安全篇


Posted in PHP onJanuary 08, 2013

对于我们想做web安全的人来说,最好就是拿来学习,可是万物抓根源,我们要的不是鱼而是渔。在国内,各种各样的php程序1.0版,2.0版像雨后春笋一样的冒出来,可是,大家关注的都是一些著名的cms,论坛,blog程序,很少的人在对那些不出名的程序做安全检测,对于越来越多的php程序员和站长来说,除了依靠服务器的堡垒设置外,php程序本身的安全多少你总得懂点吧。
有人说你们做php安全无非就是搞搞注入和跨站什么什么的,大错特错,如果这样的话,一个magic_quotes_gpc或者服务器里的一些安全设置就让我们全没活路了:(。我今天要说的不是注入,不是跨站,而是存在于php程序中的一些安全细节问题。OK!切入正题。
注意一些函数的过滤
有些函数在程序中是经常使用的,像include(),require(),fopen(),fwrite(),readfile(),unlink(),eval()以及它们的变体函数等等。这些函数都很实用,实用并不代表让你多省心,你还得为它们多费点心。 :)
1.include(),require()和fopen(),include_once(),require_once()这些都可以远程调用文件,对于它们的危害,google搜一下你就会很明了,对于所包含调用的变量没过滤好,就可以任意包含文件从而去执行。举个例子,看print.php

if (empty ($bn) ) { //检查是变量$bn是否为空
include (“$cfg_dir/site_${site}.php”); //把$cfg_dir这个路径里的site_${site}.php包含进来

不管存不存在$cfg_dir目录,$site这个变量你可以很自然的去使用,因为他根本没检查$site变量啊。可以把变量$site指定远程文件去调用,也可以是本地的一个文件,你所指定的文件里写上php的语句,然后它就去包含执行这个含有php语句的文件了.就像这样
列出文件目录甚至可以扩展到包含一些管理员文件,提升权限,典型的像以前phpwind,bo-blog的漏洞一样。除了依靠php.ini里的allow_url_fopen设为off禁止远程使用文件和open_base_dir禁止使用目录以外的文件外,你还得事先声明好只能包含哪些文件,这里就不多说废话了。
2.fopen(),file(),readfile(),openfile(),等也是该特别留意的地方。函数本身并没什么,它们的作用是去打开文件,可是如果对变量过滤不彻底的话,就会泄露源代码。这样的函数文本论坛里会有很多。

$articlearray=openfile(“$dbpath/$fid/$tid.php”); //打开$dbpath/$fid这个路径的$tid.php文件
$topic_detail=explode(“|”,$articlearray[0]); //用分割符|读出帖子的内容

很眼熟吧,这是ofstar以前版本的read.php,$fid和$tid没有任何过滤,$tid指定为某个文件提交,就发生了原代码泄露。就像这样。

$tid会被加上php的后缀,所以直接写index。这仅仅是个例子,接着看吧。
3.fwrite()和它的变体函数这种漏洞想想都想得出,对于用户提交的字符没过滤的话,写入一段php后门又不是不可以。
4.unlink()函数,前段时间,phpwind里任意删除文件就是利用这个函数,对于判断是否删除的变量没过滤,变量可以指定为任意文件,当然就可以删除任意文件的变量。
5.eval(),preg_replace()函数,它们的作用是执行php代码,如果字符串没被经过任何过滤的话,会发生什么呢,我就常看见一些cms里面使用,想想,一句话的php木马不就是根据eval()原理制作的吗?
6.对于system()这些系统函数,你会说在php.ini里禁止系统函数,对,这也是好办法,可是象一些程序里需要,那是不是就不用了呢?就像上次我看到的一套很漂亮的php相册一样。另外对于popen(),proc_open(),proc_close()函数你也得特别注意,尽管他们执行命令后并没有直接的输出,但你想这到底对黑客们有没有用呢。再这里php提供提供了两个函数,escapeshellarg(),escapeshellcmd(),这两个函数用来对抗系统函数的调用攻击,也就是过滤。
对于危害,来举个例子,我们来看某论坛prod.php
07 $doubleApp = isset($argv[1]); //初始化变量$doubleApp

14 if( $doubleApp ) //if语句
15 {
16 $appDir = $argv[1]; //初始化$appDir
17 system(“mkdir $prodDir/$appDir”); //使用系统函数system来创建目录$prodDir/$appDir

本来是拿来创建$prodDir/$appDir目录的,再接着看上去,程序仅仅检测是否存在$argv[1],缺少对$argv[1]的必要过滤,那么你就可以这样
/prod.php?argv[1]=|ls%20-la或者/prod.php?argv[1]=|cat%20/etc/passwd
(分割符| 在这里是UNIX的管道参数,可以执行多条命令。)
到这里,常见的漏洞类型应该知道点了吧。

所以一定不要只指望服务器端的设置,最好后台程序也需要注意下,一般情况下通过服务器针对某个站点设置应该能好点。但很多与数据库的操作等就不是这么容易控制了。

PHP 相关文章推荐
PHP去掉从word直接粘贴过来的没有用格式的函数
Oct 29 PHP
win7下memCache的安装过程(具体操作步骤)
Jun 28 PHP
windows7下安装php的php-ssh2扩展教程
Jul 04 PHP
ThinkPHP调试模式与日志记录概述
Aug 22 PHP
PHP获取mysql数据表的字段名称和详细信息的方法
Sep 27 PHP
常用PHP框架功能对照表
Oct 23 PHP
php实现二进制和文本相互转换的方法
Apr 18 PHP
PHP中类属性与类静态变量的访问方法示例
Jul 13 PHP
php+mysql查询实现无限下级分类树输出示例
Oct 03 PHP
ThinkPHP5.0框架验证码功能实现方法【基于第三方扩展包】
Mar 11 PHP
PHP INT类型在内存中占字节详解
Jul 20 PHP
Laravel框架集合用法实例浅析
May 14 PHP
php中定时计划任务的实现原理
Jan 08 #PHP
整理的一些实用WordPress后台MySQL操作命令
Jan 07 #PHP
PHP中设置时区,记录日志文件的实现代码
Jan 07 #PHP
PHP基础教程(php入门基础教程)一些code代码
Jan 06 #PHP
将博客园(cnblogs.com)数据导入到wordpress的代码
Jan 06 #PHP
PHP表单递交控件名称含有点号(.)会被转化为下划线(_)的处理方法
Jan 06 #PHP
Fine Uploader文件上传组件应用介绍
Jan 06 #PHP
You might like
DC《小丑》11项提名领跑奥斯卡 Netflix成第92届奥斯卡提名最大赢家
2020/04/09 欧美动漫
PHP截取中文字符串的问题
2006/07/12 PHP
Yii2前后台分离及migrate使用(七)
2016/05/04 PHP
PHP7创建销毁session的实例方法
2020/02/03 PHP
javascript数组组合成字符串的脚本
2021/01/06 Javascript
JavaScript 事件记录使用说明
2009/10/20 Javascript
button没写type=button会导致点击时提交
2014/03/06 Javascript
chrome不支持form.submit的解决方案
2015/04/28 Javascript
javascript绘制漂亮的心型线效果完整实例
2016/02/02 Javascript
基于jquery实现ajax无刷新评论
2020/08/19 Javascript
让编辑器支持word复制黏贴、截屏的js代码
2016/10/17 Javascript
js字符串操作总结(必看篇)
2016/11/22 Javascript
网站申请不到支付宝接口、微信接口,免接口收款实现方式几种解决办法
2016/12/14 Javascript
Bootstrap超大屏幕的实现代码
2017/03/22 Javascript
vue之数据交互实例代码
2017/06/20 Javascript
jQuery实现返回顶部按钮和scroll滚动功能[带动画效果]
2017/07/05 jQuery
pm2 部署 node的三种方法示例
2017/10/20 Javascript
vue.js element-ui validate中代码不执行问题解决方法
2017/12/18 Javascript
使用FileReader API创建Vue文件阅读器组件
2018/04/03 Javascript
2019 年编写现代 JavaScript 代码的5个小技巧(小结)
2019/01/15 Javascript
[29:59]完美世界DOTA2联赛PWL S3 Forest vs access 第二场 12.11
2020/12/13 DOTA
shelve  用来持久化任意的Python对象实例代码
2016/10/12 Python
python编程测试电脑开启最大线程数实例代码
2018/02/09 Python
pytorch构建网络模型的4种方法
2018/04/13 Python
Python双向循环链表实现方法分析
2018/07/30 Python
NumPy中的维度Axis详解
2019/11/26 Python
python多项式拟合之np.polyfit 和 np.polyld详解
2020/02/18 Python
Python爬取梨视频的示例
2021/01/29 Python
Python3.9.1中使用match方法详解
2021/02/08 Python
html5设计原理(推荐收藏)
2014/05/17 HTML / CSS
Elizabeth Gage官网:英国最好的珠宝设计之一
2020/09/26 全球购物
学校元旦晚会方案
2014/02/19 职场文书
高一学生评语大全
2014/04/25 职场文书
个人收入证明范本
2014/09/18 职场文书
网聊搭讪开场白
2015/05/28 职场文书
python之PySide2安装使用及QT Designer UI设计案例教程
2021/07/26 Python