重燃你的PHP安全分析之火

关于脚本安全这个话题好像永远没完没了,如果你经常到国外的各种各样的bugtraq上,你会发现有一半以上都和脚本相关,诸如SQL injection,XSS,Path Disclosure,Remote commands execution这样的字眼比比皆是,我们看了之后的用途难道仅仅是抓肉鸡?对于我们想做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指定为某个文件提交,就发生了原代码泄露。

http://explame.com/ofstar/read.php?fid=123&tid=../index

$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的管道参数,可以执行多条命令。)

到这里,常见的漏洞类型应该知道点了吧。

对于特殊字符的重视

对于特殊字符,有句话叫All
puts is invalid.外国人文章里这句话很常见的。所有输入都是有害的。你永远不要对用户所输入的东西省心,为了对付这些危害,程序员都在忙着过滤大把大把的
字符,唯恐漏了什么。而有些程序员呢?好像从没注意过这些问题,从来都是敞开漏洞大门的。不说废话,还是先看看下面这些东西吧。

1、其实程序的漏洞里最关键,最让开发者放心不下的就是带着$符号的美元符号,变量,对于找漏洞的人来说,抓着变量两个字就是一切。就像目录遍历这
个bug,很多邮件程序都存在,开发者考虑的很周全,有的甚至加上了网络硬盘这个东西,好是好,就像http://mail.com /file.php?id=1&put=list&tid=1&file=./
要是我们把file这个变量换成./../甚至更上层呢?目录就这样被遍历了。

2、尖括号”<>”跨站你不会不知道吧,一些搜索栏里,文章,留言,像前段时间phpwind附件那里的跨站等等。当然,对于跨站问题,你要过滤的远远不止尖括号。不怕过滤时漏掉什么,而是怕你想不起要去过滤。

3、斜杆和反斜杆:对于/和\的过滤,记得魔力论坛的附件下载处的原代码泄露吗?

attachment.php?id=684&u=3096&extension=gif&attach=.\..\..\..\..\..\..\includes\config.php&filename=1.gif

对于过滤.. /
\的问题,像windows主机不仅要过滤../还要过滤..\,windows主机对\会解析为/,这些细节跟SQL
injection比起来,什么才叫深入呢?

4、对于反引号(“),反引号在php中很强大,它可以执行系统命令,就像system()这些系统函数一样,如果用户的恶意语句被它所执行的话就会危害服务器,我想除了服务器设置的很好以外,对于它们,你还是老老实实的过滤好吧。

5、对于换行符,NULL字符等等,像”\t,\x0B,\n,\r,\0这些,这些都是很有用的,像动网以前的上传漏洞就是因为上传中的NULL(\0)字符引起的,对于这些能随意截断程序流程的字符,你说我们在检测的时候应该有多细心呢?

6、分号(;)和分割符(|)

分号截断程序流程,shell_exec(“del
./yourpath/$file”); //使用系统函数shell_exec删除文件$file

变量$file没指定,那么直接写zizzy.php;del
./yourpath ,这样你的yourpath目录也就被del了。

分割符(|)是UNIX里自带的管道函数,可以连接几条命令来执行。有时候加在过滤不严的系统函数中执行。

逻辑错误

验证不完全和一些逻辑错误在程序里也很容易找到,特别是现在的程序员,只顾深入的学习,而对于逻辑错误等等这样的安全意识都没有培养的意识,其实这是是靠自己去培养,而不是等着人来报告bug给你。对于逻辑错误的判断,我们只能说,多练练吧,经验才是最重要的。

1、对于登陆验证的问题。举个例子:我们看某论坛的admin.php片断

它这里username 和
password好像不对劲吧,存在管理员的username和password就直接通过验证,那就意味着没有用户名,没密码也行吧。我们提交

以下为引用的内GET
/bbs/admin/index.php?page=general HTTP/1.1
Accept:
image/gif, image/x-xbitmap, image/jpeg, image/pjpeg,
application/x-shockwave-flash, */*
Accept-Language:
zh-cn
Accept-Encoding:
gzip, deflate
User-Agent:
Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; Maxthon)
Host:
127.0.0.1
Connection:
Keep-Alive
Cookie:
username=’or isnull(1/0) AND level=3/*; password=;
这是我们伪造的一个数据包(你问我咋伪造地?抓包再修改呗),我们使用GET来提交数据,原理也就是在cookie这里构造欺骗语句。

接着,整个SQL语句就成这样

Select * FROM
users Where username=”or isnull(1/0) AND level=3/*’ AND password=”

这里仅仅用一个’or’=‘or’的原理,就把username和password的检测给绕开了,而level=3则是伪造的等级。从而就饶过了检测,进入了管理后台。

对于后台的验证不能这么马虎,两行代码就算完事,你还得从SESSION(会话),Cookie这些地方来增强验证。

2、上传漏洞

有次我看到在一个程序config.php里对上传文件类型限制是这样的

$IllegalExtentions
=
array(‘exe’,‘asp’,‘php’,‘php3′,’bat’,‘cgi’,‘pl’,‘com’,‘vbs’,‘reg’,‘pcd’,‘pif’,‘scr’,‘bas’,‘inf’,‘vb’,‘vbe’,‘wsc’,‘wsf’,‘wsh’);
//
对于上传文件的限制,只允许上传exe,asp,php,php3,bat,cgi,pl,com,vbs,reg,pcd,pif,scr,bas,inf,vb,vbe,wsc,wsf,ws’这些文件。

规定不许用户上传什么什么文件,其它都可以上传,这种逻辑好不好呢?如果我上传.inc,
,.php4 .phtml, .html, .pwml
这样的类型呢?为什么你不把这种逻辑思维改为规定用户除了这几种文件能传,其它的统统不允许上传。就像这样,数组改成逆向的思维。

$IllegalExtentions
= array(‘rar’,‘gif’,‘jpg’,‘bmp’,‘pdf’)//只能上传rar,gif,jpg,bmp,pdf几种格式

其实这个跟你们上传cer,asa是一个道理。

3、典型的逻辑错误

在一些cms(整站程序)中随便注册个用户,你会发现修改资料的地方不要求输入原来的密码,只通过判断用户id或者email,你把网页保存到本
地,把id或email改成管理员的,action
改为修改提交地址,提交你就成了管理员。解决办法不太难,只要我们增加密码验证,增强那个mysql的update语句的过滤也就ok了。

这些我们也没办法,多数程序员对于安全根本不去在意,本来一个人可以去做的事,为什么偏偏要分出搞web安全的和web开发两种人呢?

长度问题

别以为找漏洞的就是为了拿个管理员密码或者webshell,也有些不安分的人,也就是DDOSer(拒绝服务攻击者),他们的花样很多,但对于程
序员来说,关键就在过滤。我所说的长度问题,不仅仅是个字符的长度,也包括时间的长度,你一定见过有人写个脚本,一下就注册成千上万的用户,或者纯粹的写
垃圾数据把数据库拖死。这个时候,限制数据提交时间和验证码就起作用了。不过要真的遇到狠毒的人,一个变量的过滤问题就可以把网站搞瘫痪,这比用什么网络
僵尸那些软件来得更快。

不大不小的问题

1、绝对路径的泄露

这个问题可真是不大不小,很多程序都有,这也算安全的一部分。至少你玩注入loadfile()需要吧。当然,这时的php.ini中的display_errors也可以起作用了。

2、对后台的验证

不要说不信,我就曾看到一些程序这样,你去测试,注册个用户,提交管理员编辑用户的URL,比如
admin_member.php?action=edit&id=55&level=4&username=zizzy&
amp;power=1这样相应的添加管理员的URL,你会发现几乎没验证,直接成功了。所以,对于后台的检测,也很有必要,就像刚出的Discuz的那
个漏洞。

过滤问题不知不觉就说了那么多,写了好多处该过滤的提醒,现在也该说说了如何进行过滤。

1、在用户输入任何数据,也就是提交变量进数据库时,我们必须使用addslashes()进行过滤,像我们的注入问题,一个addslashes()也就搞定了。其实在涉及到变量取值时,intval()函数对字符串的过滤也是个不错的选择。

2、在php.ini中开启magic_quotes_gpc和magic_quotes_runtime。magic_quotes_gpc可以
把get,post,cookie里的引号变为斜杠magic_quotes_runtime对于进出数据库的数据可以起到格式话的作用。其实,早在以前
注入很疯狂时,这个参数就很流行了。

3、在使用系统函数时,必须使用escapeshellarg(),escapeshellcmd()参数去过滤,这样你也就可以放心的使用系统函数。

4、对于跨站,strip_tags(),htmlspecialchars()两个参数都不错,对于用户提交的的带有html和php的标记都将进行转换。比如尖括号”<”就将转化为
“<”这样无害的字符。

5、对于相关函数的过滤,就像先前的include(),unlink,fopen()等等,只要你把你所要执行操作的变量指定好或者对相关字符过滤严密,我想这样也就无懈可击了。

服务器安全设置

谈服务器安全设置,我觉得很不实际的,我们大多数人都用虚拟主机,对于php.ini怎么设,那个只有网管自己看着办了。不过我还是说下,

1、设置”safe_mode”为”on”

这对于广大空间商来说是一个伟大的选项,它能极大地改进PHP的安全性。

2、禁止”open_basedir”
,这个选项可以禁止指定目录之外的文件操作,还能有效地消除本地文件或者是远程文件被include()等函数的调用攻击。

3、expose_php设为off
,这样php不会在http文件头中泄露信息。

4、设置”allow_url_fopen”为”off”
这个选项可以禁止远程文件功能,极力推荐

5、”log_errors”为”on”
错误日至得带上吧

6、对于”display_errors,register_globals”两项要视情况而定了,display_errors太消极了,错误全
关,想调试脚本都不行。至于register_globals(全局变量)把它开起来,关了会很麻烦,现在大多数程序没它支持就别想用了。

这些是最必要的设置。关于php服务器更高的安全设置是门学问,也就不在本文探讨范围内了。

重燃你的PHP安全分析之火

时间: 2024-11-05 23:37:44

重燃你的PHP安全分析之火的相关文章

《全面通缉》重燃玩家反恐梦

<全面通缉>重燃玩家反恐梦被誉为侠盗猎车手之父的大卫·琼斯(David Jones)在近日接受国外游戏媒体Videogamer的采访时表示,对自己创立的Realtime Worlds公司开发中的GTA类网络游戏<全面通缉>充满信心.他表示:"这是一个类似反恐精英类型的游戏,哪个网站,但更复杂而且有趣的多,玩家将同游戏中的环境发生非常多的互动,这是反恐精英所没有的.而在不断的对抗中,玩家将总结经验并开发出新的战术,而我们所要做的是提供给他们这样一个舞台.我预计这个游戏将拥有

ReentrantLock(重入锁)简单源码分析

1.ReentrantLock是基于AQS实现的一种重入锁. 2.先介绍下公平锁/非公平锁 公平锁 公平锁是指多个线程按照申请锁的顺序来获取锁. 非公平锁 非公平锁是指多个线程获取锁的顺序并不是按照申请锁的顺序,有可能后申请的线程比先申请的线程优先获取锁.有可能,会造成优先级反转或者饥饿现象. 3.重入锁/不可重入锁 可重入锁:广义上的可重入锁指的是可重复可递归调用的锁,在外层使用锁之后,在内层仍然可以使用,并且不发生死锁(前提得是同一个对象或者class),这样的锁就叫做可重入锁. 不可重入锁

SPSS-多重响应-频率和交叉表案例分析(问卷调查分析)

在10.1休假前,希望跟大家讨论一下SPSS-多重响应--频率和交叉表分析,希望大家能够多提点提点 在云南电信网上营业厅做了一个关于"客户不使用电信3g业务的原因有哪些的问卷调查,问题所示: 这份问卷调查总更有35人参与,样本容量偏少,其中 1:选择 A :3G资费过高的有 14人 2:选择 B:  网络覆盖率低,信号不稳定的  15人 3:选择 C:买手机太麻烦的  15人 4:选择 D: 换手机号麻烦  15人 5:选择 E: 3G功能用处不大 9人 6:选择F: 朋友使用后,觉得不好  1

Pascal Analyzer 4 代码分析使用简要说明

概述 不管在那个开发团队中每个人的编写风格往往是千差万别能力也有高低,如何让别人快速看懂自己的代码维护你的代码.尽量避免不必要的简单错误,为编写代码作一定的约束是必不可少的.如果你说我一个人不需要规范,其实不然.个人的代码风格能看出你的实际能力.犹如写文章一样杂乱有章,别人看都不愿意看,再精彩的故事也没用.日后自己维护也会头大. 因此有一份简单的代码编写约束是非常有必要的,不仅能提高可读性而且能提高代码质量. 1.    创建分析工程 打开软件后,有显示向导界面(默认关闭的,可以通过File菜单

分析和解决mnesia过载问题

mnesia在频繁操作数据的过程可能会报错:** WARNING ** Mnesia is overloaded: {dump_log, write_threshold},可以看出,mnesia应该是过载了.这个警告在mnesia dump操作会发生这个问题,表类型为disc_only_copies .disc_copies都可能会发生. 如何重现这个问题,例子的场景是多个进程同时在不断地mnesia:dirty_write/2 mnesia过载分析 1.抛出警告是在mnesia 增加dump

病毒木马查杀第006篇:熊猫烧香之逆向分析(中)

一.前言 上一篇文章讲解了"熊猫烧香"病毒样本的反汇编代码入口处的分析,虽然尚未研究到病毒的核心部分,但其实我们后续的分析与之前的思想是一致的.而越到核心部分,可能会遇到越来越多的API函数,结合所调用函数的参数进行分析,反而有助于我们更容易地理解病毒的行为.应当将分析出的每一个CALL函数,改为我们能够理解的名字,这往往也有助于对后续程序的理解. 二.病毒功能分析 上一篇文章的最后,我留下了三个CALL没有分析,现在进入第一个CALL,即sub_408024的内部查看一下: 图1 s

快乐乒乓球网重推砂板IP,真是一场好戏!

近年来,ip成为越来越热的话题,从早年的网络文学,到后来的电视综艺和影视剧,如今又延伸到体育赛事.从奥运会.世界杯.欧洲杯.英超.NBA到意甲.四大满贯网球赛.中超, 中网CBA.极限格斗等都成为了资本和消费者讨论的对象,2016年6月6日,"2016中国砂板大奖赛新闻发布会"在苏州举行,在接下来的半年中,砂板职业联盟将以250万的总奖金打造赛事体系,实现从业余赛事到职业赛事的平滑过渡,这将颠覆传统乒乓球,打造中国砂板大满贯赛事!砂板作为另一重磅IP开始进入资本和公众视野.面对层出不穷

深入理解读写锁—ReadWriteLock源码分析

ReadWriteLock管理一组锁,一个是只读的锁,一个是写锁.读锁可以在没有写锁的时候被多个线程同时持有,写锁是独占的. 所有读写锁的实现必须确保写操作对读操作的内存影响.换句话说,一个获得了读锁的线程必须能看到前一个释放的写锁所更新的内容. 读写锁比互斥锁允许对于共享数据更大程度的并发.每次只能有一个写线程,但是同时可以有多个线程并发地读数据.ReadWriteLock适用于读多写少的并发情况. Java并发包中ReadWriteLock是一个接口,主要有两个方法,如下: public i

打造smali代码库辅助分析

打造smali代码库辅助分析 在分析Android应用程序的时候,我们往往会插入代码重打包apk来辅助我们分析的工作 一个比较取巧的方法就是先用java写好代码以及相关的调用之后, 然后直接扣出代码 然后可以制作成各种代码模版,放在Android Killer中使用(代码模版管理器) Android Killer 自带3种代码模版 1. LoadLibrary const-string v0, "so name" invoke-static {v0}, Ljava/lang/Syste