+ -
当前位置:首页 → 问答吧 → 整理了这两天的笔记

整理了这两天的笔记

时间:2007-10-04

来源:互联网

本来想发到blog上的,可图都变形了,还是doc吧,关于PHP安全,边搜边学。
-----------------------------------------------------------------------------------------------------------------------------------------
一直感觉PHP足够安全,今天心血来潮,在百度搜了一下PHP入侵,发现真发现不少.想想自己以前的教训,就在blog总结一下,半搜半学,也是仅供参考;
1.针对整型的过滤,应该算是SQL注入的一种,刷金币的好方法,我曾经因此饱受摧残,其实做起来非常简单,

   
1.jpg (10.39 KB)
2007-10-28 16:21


如果传过去$m=10-1000程序会通过验证,因此而执行的话sql的话,你不仅减不去$m,反而增加了990.
原因是intval的转换会发生问题,丢失后面半截,intval有位数限制,如果转换较大数会发生溢出:
执行echo intval(7777777777);实际上输出: -812156815
解决:只要不把针对整型的处理写在条件中就可以了  如:$num = abs(intval(trim($num)));然后再进行判断.

2.针对SQL的注入.
现在网站上大部分的SQL注入都是针对ASP的,PHP少之又少,主要的方法就是单引号截断,构造SQL,注释掉SQL
PHP提供的转义函数可以很容易的应对,我以前写的转义函数

         
2.jpg (15.48 KB)
2007-10-28 16:21

         

  现在好像比较流行 COOKIE注入,实际和GET/POST注入差不多,COOKIE保存在本地,可以随意修改,所以危险性更大,尤其有些验证页面根据用户名读取库中密码然后比对,如果没有处理好,很容易被绕过:

修改cookie的值
     

3.jpg (13.27 KB)
2007-10-28 16:21

         
4.jpg (5.96 KB)
2007-10-28 16:21

         
5.jpg (21.75 KB)
2007-10-28 16:21
   

我用的是PHP5,默认开启魔法引用,所以第一页面无效,第二页面是关闭魔法引用后的结果,PHP默认是安全的.
      
2.jpg (10.65 KB)
2007-10-28 16:25

1.jpg (40.44 KB)
2007-10-28 16:25


所谓的COOKIE 注入就是这个样子的,当然可以构造更复杂的SQL ,但程序只要过滤就没有问题;
还有一些其它的攻击方法和这个差不多,都是注入,不过不一定非是SQL,比如忘记处理变量,使任何人操纵include,或者引入的脏的文件等,但我感觉只要过滤做的好就基本没有问题,永远要过滤用户提交的数据是在PHPCHINA培训时老师告诉俺的,但也要兼顾性能,过滤的越多,越安全,性能越低.
解决:只要使用转义和为SQL的变量加上单引号,基本上可以防御注入

3.XSS攻击
目前相当流行,我一听CSS还以为是样式表的漏洞,BS一下,防御还是很容易的,针对程序本身的攻击,还是要做html和JS标签的过滤,另外,因为COOKIE的作用域,可以在其它子目录获得,这样还要做好同一域下其它文件的安全,如果一个地方有问题,基本上全都有问题.以前很不理解为什么discuz进后台还要再输一次同样的密码,其实这就是为了防止XSS攻击的请求伪造,包括一些管理功能增加确认操作,也都是这个原因,如果一个管理人员执行index.php?action=del&id=xxx这样一个操作就可以直接删除id=xxx的帖子,那么一个某个用户发表文章,内容是一张图片<img src=”index.php?action=del&id=xxxx />,当管理人员浏览此帖时,图片没看到,id=xxxx的帖子反而被删了,再如一些改密码的操作,更是危险.安全一点做法还是前后台分开.
前几个月比较震憾的就是PW的附件文件名XSS漏洞,资迅比较落后昨天晚上才知道.05年那会儿建论坛的时候就用的是PW,功能挺强大的, 看了下代码
$atc_attachment_name=addslashes($atc_attachment_name);增加了转义,像PW这样NB的论坛,为了追求效率,都是自己用正则写的转义函数,需要转义的才转义,这样节省,俺写可就没那么顾虑了,不管那个页面,不管需不需要,统统将POST和GET全部处理一遍,这样绝对安全.宁可错杀不可放过

4.SESSION 攻击
PHPSESSID是服务器识别SESSION的唯一标识,每一次向服务器请求都带PHPSESSID,如果没有这个标识的话,PHP会尝试用串中读取,这样就有可能导致PHPSESSID的固定和劫持
         

7.jpg (21.42 KB)
2007-10-28 16:21

A
   
8.jpg (24.09 KB)
2007-10-28 16:21

   
输出同样的$_SESSION[‘name’]却有不同结果,我是同步刷新的,可见SESSION只与存于COOKIE中的PHPSESSID有关;页面跳到B页面时COOKIE中带有PHPSESSID值;
9.jpg (6.38 KB)
2007-10-28 16:21



[ 本帖最后由 月黑风高 于 2007-10-28 16:26 编辑 ]

作者: 月黑风高   发布时间: 2007-10-04

鼓励一下。
:)

作者: luzhou   发布时间: 2007-10-04

收藏先,留个脚印,暂不下载。

作者: hotbone   发布时间: 2007-10-04

看下

作者: xlight   发布时间: 2007-10-04

我来顶一下~~顺便下载看看~~

作者: 一条尸体   发布时间: 2007-10-04

下下来,学习一下

作者: naodai   发布时间: 2007-10-09

不错,最好还是把原文发上来!~~对提升论坛的含金量有好处

作者: forest   发布时间: 2007-10-10

收藏学习

作者: yiqieqie   发布时间: 2007-10-10

hao

作者: 逆雪寒   发布时间: 2007-10-10

好详细,绝对支持你!再接再厉.

作者: PHPChina   发布时间: 2007-10-29

支持下

作者: softly   发布时间: 2007-10-30

一个字,实在高!

作者: power_cheung   发布时间: 2007-10-30

都顶俺也顶
好!学习

作者: xiaoxiao0503   发布时间: 2007-10-30