博主资料

留言短消息 加为好友 收藏

用户ID:  118214
昵称:  115300111
来自:  福建 福州
年龄:  23
爱好: 唱KTV 跑跑卡丁车 魔兽争霸 黑色 白色 《武林外传》 摇滚

标题

研究PHPWIND,分析PHPWIND,解剖PHPWIND,肢解PHPWIND,,,
实习主刀:Cos.X

日历

2009 - 7
   1234
567891011
12131415161718
19202122232425
262728293031 
«» 2009 - 7 «»

日志分类

日志文章列表

2007年08月16日 15:16:58

一点经验分享

一、PHP几个容易混淆的系统常量

1
$_SERVER['SCRIPT_FILENAME']
__FILE__

区别: a.php 中输入代码
<?php
echo $_SERVER['SCRIPT_FILENAME'];
echo '<br>'
echo __FILE__;
?>
b.php中include('a.php');

执行 b.php 就会发现他们的区别了
D:\www\hpc\b.php
D:\www\hpc\a.php

2.我也还没搞清的
$_SERVER['HTTP_HOST'] www.mayday.net.cn
$_SERVER['SERVER_NAME'] www.mayday.net.cn

$_SERVER['SCRIPT_NAME'] /hpc/c.php
$_SERVER['PHP_SELF'] /hpc/c.php



二、包含的困惑
a.php 输出asdasd
b.php 包含a.php
admin/c.php 包含b.php

b.php包含a.php有两种方式
include('a.php');
include('./a.php');
第二种会出错

三、
admin/b.php中包含a.php
a.php 输入<?php
session_save_path('admin');
session_start();
?>
执行b.php提示出错
改成'./admin'还是提示出错

二三总结,本地路径最好用绝对路径

四、上传文件的bug?
创建一个PHP文件,输入代码
<pre><?php
print_r($_FILES);
?></pre>
<form method="post" enctype="multipart/form-data">
    <input type="file" name="file" />
    <input type="submit" value="提交" />
</form>
执行上传一个文件名带单引号的文件,比如 Cos.X'sBlog.txt
上传之后获取到的文件名只剩 'sBlog.txt'

类别: 无分类 |  评论(0) |  浏览(9022) |  收藏
2007年06月13日 17:41:02

惊人发现:PHP所有版本 SESSION 漏洞

惊人发现:PHP所有版本 SESSION 漏洞

关键字:php 漏洞 session register_globals 登录 安全

先看这一段简单的代码
<?php
session_start();

$_SESSION['isadmin']='yes';

$isadmin='no';

echo $_SESSION['isadmin'];

?>
当php.ini里配置 register_globals = Off 时,
没任何问题,
输出 yes

但是
当php.ini里配置 register_globals = On 的时候,
第一次运行输出 yes
而刷新一下,则显示的是 no

显然这是不正常的,
这是个很奇怪的问题,
如果说是 $isadmin='no'; 改变了SESSION,
那么为什么第一次会显示yes呢?

都知道:当配置 register_globals = On 的时候,
通过 xxx.php?id=123 访问时,程序会自动创建变量 id
那么自动创建的变量会不会改变SESSION呢?
测试代码
<?php
//xxx.php
session_start();
echo $_SESSION['id'];
?>
通过 xxx.php?id=123 访问,没任何输出,
还好,不然不知道将有多少
采用 SESSION 做登录的
而PHP配置 register_globals 为 On 的网站
将被随便登录。

还有两个常用的函数 import_request_variables() 和 extract()
import_request_variables -- 将 GET/POST/Cookie 变量导入到全局作用域中
extract -- 从数组中将变量导入到当前的符号表
<?php
//xxx.php

import_request_variables('G');
echo $id;

?>
当通过xxx.php?id=123访问的时候,
就算 register_globals 设为 Off
也是会输出123

extract($_GET) 与 import_request_variables('G') 功能相似

那么试试import_request_variables() 与 extract()创建的变量会不会影响SESSION呢?
测试代码
<?php
//xxx.php
session_start();

import_request_variables('G');

echo $_SESSION['id'];
?>
当通过xxx.php?id=123访问程序,
没有输出,再用extract($_GET)代替import_request_variables('G')测试,
还是没输出,这一点又很奇怪了,因为测试
<?php
session_start();
$arr=array('id'=>123);
extract($arr);
echo $_SESSION['id'];
?>
register_globals 为 On 时
会输出 123

看来同样是数组,
extract 处理 $_GET 与处理定义的数组
用的是不一样的方法。

结论:
register_globals 为 On 的时候,
用import_request_variables('G')和extract($_GET)创建的变量是不会改变SESSION的。

总结:漏洞只存在于PHP配置register_globals = On的时候,定义的变量会改变同名的SESSION。

转载请保留
作者:Cos.X
日期:2007年6月13日
ps. 结果让我挺失望的,以为会发现一个惊人的PHP SESSION 登录安全漏洞。

类别: 无分类 |  评论(0) |  浏览(7244) |  收藏
2007年05月05日 10:41:35

最值得推荐的五迷网站:相信·五月天中文网

最值得推荐的五迷网站:相信·五月天中文网

纯真MAYDAY
www.maydayfans.com
域名注册时间: 19-jan-2004
google搜索五月天排名:第二页第二位
baidu搜索五月天排名:第一页第七位
世界排名:436,054
日均 IP 访问量≈ 450

老字号论坛,
首页,播放器,博客


摇滚5台
www.maydayclub.com
google搜索五月天排名:第四页第九位
baidu搜索五月天排名:第三页第一位
域名注册时间: 16-jun-2004
世界排名:577,264
日均 IP 访问量≈ 300
与纯真同级老字号
论坛 商城 新闻


五月天中文站
www.maydaycn.com
域名注册时间: 14-aug-2004
google搜索五月天排名:第三页第三位
baidu搜索五月天排名:找不到
世界排名:2,532,982
日均 IP 访问量 无法统计。
稍微晚一点
原本以博客做首页,现在只有一个论坛,


相信·五月天中文网
Www.Mayday.Net.Cn
域名注册时间: 2007-01-22 13:04
google搜索五月天排名:第二页第八位
baidu搜索五月天排名:第一页第八位
世界排名:694,199
日均 IP 访问量≈ 450
很酷的首页,播放器,论坛,博客


maydayfans.com
老了,似乎有点破旧了,首页设计粗糙。
论坛公告:
设置数据不存在,调用已中止!
登录出错...
Microsoft JET Database Engine 错误 '80040e10'
至少一个参数没有被指定值。
/bbs/inc/Dv_ClsMain.asp,行1425
垃圾广告贴:

maydaycn.com
只有一个空荡荡的论坛,没版头图片,也没版块介绍,
从数据上分析也是没什么希望的样子...

maydayclub.com
还不错

mayday.net.cn
个人感觉最好,有一个强大的管理团队——五月天福建歌迷会支撑起来的。
站长是福建农大的,而 5月13号 五月天来农大做活动 也许这不是个巧合...
五月天离开地球表面世界巡回演唱会大陆首站也在福建...
活动,聚会频繁,网站也相当有活力,每隔一段时间都会有所变化。


总结:最值得推荐的五迷网站:
相信·五月天中文网
http://www.mayday.net.cn/


欢迎转载...

类别: 无分类 |  评论(0) |  浏览(6788) |  收藏
2007年03月26日 11:38:14

PW5.3 global.php 随机函数

function randstr($lenth){
mt_srand((double)microtime() * 1000000);
for($i=0;$i<$lenth;$i++){
$randval.= mt_rand(0,9);
}
$randval=substr(md5($randval),mt_rand(0,32-$lenth),$lenth);
return $randval;
}
function num_rand($lenth){
mt_srand((double)microtime() * 1000000);
for($i=0;$i<$lenth;$i++){
$randval.= mt_rand(0,9);
}
return $randval;
}

一个是随机字符串,一个是随机数字,

。。。这种函数命名风格,要批评一下。。。

要么一个randstr 一个randnum

要么一个str_rand 一个num_rand

类别: 无分类 |  评论(0) |  浏览(6587) |  收藏
2007年02月04日 03:24:02

还是测试直观些。。。

PW5.3 global.php 245-259
function Showmsg($msg_info,$dejump=0){

     @extract($GLOBALS, EXTR_SKIP);
     global $stylepath,$tablewidth,$mtablewidth,$tplpath,$runfc;
     $runfc='';
     if(defined('SIMPLE')){
           echo "<base href=\"$db_bbsurl/\">";
     }
     require_once(R_P.'require/header.php');
     require_once GetLang('msg');
     $lang[$msg_info] && $msg_info=$lang[$msg_info];

     require_once PrintEot('showmsg');
     exit;
}

安装PW,要目录下建一个test.php

内容:
<?php
include('global.php');
showmsg('not_login');

类别: 无分类 |  评论(0) |  浏览(6622) |  收藏
2007年02月04日 02:17:58

pw5.3 global.php 268-276

function PrintEot($template,$EXT="htm"){
     //Copyright (c) 2003-06 PHPWind
     global $tplpath;
     if(!$template) $template=N;
     $path=R_P."template/$tplpath/$template.$EXT";
     !file_exists($path) && $path=R_P."template/wind/$template.$EXT";      

     return $path;
}
声明全局变量$tplpath
参数$template(为NULL为空字符串为零为false)则将$template改为N
N是一个常量的喔,不是字符串
定义$path为R_P加上"template/$tplpath/$template.$EXT"
如果$path所指文件不存在,则将$path改为R_P."template/wind/$template.$EXT"
最后返回$path

感觉好像是费话一样...

类别: 无分类 |  评论(2) |  浏览(7917) |  收藏
2006年06月08日 14:17:24

why? PHPWind 4.3.2 wysiwyg.php

Copy code
if($type=='color'){
     include PrintEot('color');exit;
}elseif($type=='table'){
     include PrintEot('table');exit;
}elseif($type=='p_w_picpath'){
     include PrintEot('p_w_picpath');exit;
}elseif($type=='sale'){
     include PrintEot('sale');exit;
}elseif($type=='download'){
     require_once($db_cp.'require/c_module.php');
     $softconf = DownloadMod();
     $adddate=get_date($timestamp,'Y-m-d');
     include PrintEot('download');exit;
}

为什么不用switch? 却用if?
明显用switch更合适的呀?

类别: 无分类 |  评论(0) |  浏览(6734) |  收藏
2006年06月07日 09:52:55

获得访客浏览器,操作系统函数。

PHPWind 4.3.2 require/agent.php

Copy code
function expinfo($agent)
{
     $expser="";$expserver="";
  //$agent = $GLOBALS["HTTP_USER_AGENT"];
     if (ereg("Mozilla",$agent) && ereg("MSIE",$agent))
     {
           $temp = explode("(", $agent); $anc=$temp[1];
           $temp = explode(";",$anc); $anc=$temp[1];
           $temp = explode(" ",$anc);$expserver=$temp[2];
           $expserver =preg_replace("/([\d\.]+)/","\\1",$expserver);
           $expserver = " $expserver";
           $expser = "Internet Explorer";
     }
     elseif (ereg("Mozilla",$agent) && !ereg("MSIE",$agent))
     {
           $temp =explode("(", $agent); $anc=$temp[0];
    $temp =explode("/", $anc); $expserver=$temp[1];
    $temp =explode(" ",$expserver); $expserver=$temp[0];
    $expserver =preg_replace("/([\d\.]+)/","\\1",$expserver);
    $expserver = " $expserver";
    $expser = "Netscape Navigator";
  }
     if ($expser!="")
     {
           $expseinfo = "$expser$expserver";
     }
     else
     {
           $expseinfo = "Unknown";
     }
     return $expseinfo;
}
//会员操作系统
function sysinfo($agent)
{
     $sys="";
     //$agent = $GLOBALS["HTTP_USER_AGENT"];
     if (eregi('win',$agent) && eregi('nt 5\.1',$agent))
     {
           $sys="Windows XP";
     }
     elseif (eregi('win',$agent) && ereg('98',$agent))
     {
           $sys="Windows 98";
     }
     elseif (eregi('win',$agent) && eregi('nt 5\.0',$agent))
     {
           $sys="Windows 2000";
     }
     elseif (eregi('win 9x',$agent) && strpos($agent, '4.90'))
     {
           $sys="Windows ME";
     }
     elseif (eregi('win',$agent) && strpos($agent, '95'))
     {
           $sys="Windows 95";
  }
     elseif (eregi('win',$agent) && eregi('nt',$agent))
     {
           $sys="Windows NT";
  }
     elseif (eregi('win',$agent) && ereg('32',$agent))
     {
           $sys="Windows 32";
     }
     elseif (eregi('linux',$agent))
     {
           $sys="Linux";
     }
     elseif (eregi('unix',$agent))
     {
           $sys="Unix";
     }
     elseif (eregi('ibm',$agent) && eregi('os',$agent))
     {
           $sys="IBM OS/2";
     }
     elseif (eregi('NetBSD',$agent))
     {
           $sys="NetBSD";
     }
     elseif (eregi('BSD',$agent))
     {
           $sys="BSD";
     }
     elseif (eregi('FreeBSD',$agent))
     {
           $sys="FreeBSD";
     }
     else
           $sys = "Unknown";
     return $sys;
}


使用方法:
expinfo($GLOBALS["HTTP_USER_AGENT"]);
sysinfo($GLOBALS["HTTP_USER_AGENT"]);
将返回访客浏览器、操作系统信息。

类别: 无分类 |  评论(0) |  浏览(6485) |  收藏
2006年06月06日 23:18:15

PHPWind 4.3.2 global.php 475-486行

Copy code
function Char_cv($msg){
     $msg = str_replace('&','&',$msg);
     $msg = str_replace(' ',' ',$msg);
     $msg = str_replace('"','"',$msg);
     $msg = str_replace("'",''',$msg);
     $msg = str_replace("<","<",$msg);
     $msg = str_replace(">",">",$msg);
     $msg = str_replace("\t","   ",$msg);
     $msg = str_replace("\r","",$msg);
     $msg = str_replace("   ","   ",$msg);
     return $msg;
}


为什么要这样子?
htmlspecialchars()不就可以将& " ' < >转换
我个人觉得这样更好
Copy code
function Char_cv($msg){
     $msg = str_replace('&','&',$msg);
     $msg = str_replace(' ',' ',$msg);
     $msg = htmlspecialchars($msg,ENT_QUOTES);
     $msg = str_replace("\t","   ",$msg);
     $msg = str_replace("\r","",$msg);
     $msg = str_replace("   ","   ",$msg);
     return $msg;
}

类别: 无分类 |  评论(0) |  浏览(6468) |  收藏
2006年06月06日 13:20:38

PHPwind 4.3.2 require/defend.php 5-10行

Copy code
foreach($_POST as $_key=>$_value){
    !ereg("^\_",$_key) && !isset($$_key) && $$_key=$_POST[$_key];
}
foreach($_GET as $_key=>$_value){
    !ereg("^\_",$_key) && !isset($$_key) && $$_key=$_GET[$_key];
}


相当启用PHP.INI中的register_globals选项,
比如URL是:http://www.thisky.com/index.php?n=123
如果PHP.INI中的register_globals选项是启用的,则echo $n;就会输出123
如果是关闭的则输出空,要echo $_GET[n];才会输出123
而在程序开头加上上面一段代码,就算register_globals选项是关闭的,echo $n;仍然会输出123

补充:这样写好像不怎么好吧,直接
extract($_POST);
extract($_GET);
不就可以了

再补充:又看到一个函数,更简单了:
import_request_variables('pg');
一句就解决。

我这样子不是更好?

类别: 无分类 |  评论(0) |  浏览(6649) |  收藏
2006年06月06日 11:03:58

PHPWind的代码风格

PHPWind的代码风格之一:很少用IF,喜欢用“?:”“&&”
虽然有点不好理解,但这样子程序就变得相当精简了,
习惯了以后你会喜欢上它的,你将变得与众不同。

?:的意思,$a==$b?'a等于b':'a不等于b';
$a==$b吗?结果为真则返回'a等于b',否则返回'a不等于b'
叫三元操作符。

&&的意思,$a!=$b && $b+=$a;
$a!=$b则$b+=$a
这样也可以,$a==$b || $b+=$a;
相当于:
if($a!=$b){
$b+=$a;
}
这种方法叫短路

&&也可以写成and
||也可以写成or
$b+=$a就是$b=$b+$a
这些应该都知道吧,顺便讲一下

类别: 无分类 |  评论(0) |  浏览(6480) |  收藏
2006年06月06日 10:27:06

产生随机数

Copy code
function num_rand($lenth){
     mt_srand((double)microtime() * 1000000);
     for($i=0;$i<$lenth;$i++){
           $randval.= mt_rand(1,9);
     }
     return $randval;
}

phpwind 4.3.2 ck.php 66-72行

mt_srand((double)microtime() * 1000000);
PHP手机上说,PHP 4.2.0 之后版本,不要这一句也可以。

类别: 无分类 |  评论(7) |  浏览(7952) |  收藏
2006年06月05日 23:31:01

获得访客真实IP

Copy code
if($_SERVER['HTTP_X_FORWARDED_FOR']){
     $onlineip = $_SERVER['HTTP_X_FORWARDED_FOR'];
}elseif($_SERVER['HTTP_CLIENT_IP']){
     $onlineip = $_SERVER['HTTP_CLIENT_IP'];
}else{
     $onlineip = $_SERVER['REMOTE_ADDR'];
}

类别: 无分类 |  评论(1) |  浏览(6007) |  收藏
2006年06月05日 23:27:12

addslashes自动增加\

Copy code
unset($_ENV,$HTTP_ENV_VARS,$_REQUEST,$HTTP_POST_VARS,$HTTP_GET_VARS,$HTTP_POST_FILES,$HTTP_COOKIE_VARS);
if(!get_magic_quotes_gpc()){
    Add_S($_POST);
    Add_S($_GET);
    Add_S($_FILES);
    Add_S($_COOKIE);
}

function Add_S(&$array){
    foreach($array as $key=>$value){
        if(!is_array($value)){
              $array[$key]=addslashes($value);
        }else{
              Add_S($array[$key]);
        }
    }
}

类别: 无分类 |  评论(0) |  浏览(6688) |  收藏