文章标签 ‘php’

转载时请标明文章原始出处和作者信息, 作者: lostsnow.http://www.lsproc.com/blog/nginx_php_pathinfo_securit/ 漏洞介绍: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.lsproc.com/a.jpg,我们以如下的方式去访问 http://www.lsproc.com/a.jpg/xxx.php 将会得到一个URI /a.jpg/xxx.php 经过location指令,该请求将会交给后端的fastcgi处理,nginx为其设置环境变量SCRIPT_FILENAME,内容为 /scripts/a.jpg/xxx.php 而在其他的webserver如lighttpd当中,我们发现其中的SCRIPT_FILENAME被正确的设置为 /scripts/a.jpg 所以不存在此问题。 后端的fastcgi在接受到该选项时,会根据fix_pathinfo配置决定是否对SCRIPT_FILENAME进行额外的处理,一般情况下如果不对fix_pathinfo进行设置将影响使用PATH_INFO进行路由选择的应用,所以该选项一般配置开启。Php通过该选项之后将查找其中真正的脚本文件名字,查找的方式也是查看文件是否存在,这个时候将分离出SCRIPT_FILENAME和PATH_INFO分别为 /scripts/a.jpg和xxx.php 最后,以/scripts/a.jpg作为此次请求需要执行的脚本,攻击者就可以实现让nginx以php来解析任何类型的文件了。 PHP为什么会接受这样的参数, 并且把a.jpg解析呢? 这就要说到PHP的cgi SAPI中的参数, fix_pathinfo了: ; cgi.fix_pathinfo provides *real* PATH_INFO/PATH_TRANSLATED support for CGI. PHP's ; previous behaviour was to [...]

2010年5月21日11:34 | 1 条评论

转载时请标明文章原始出处和作者信息, 作者: lostsnow.http://www.lsproc.com/blog/nginx_userid_decode/ 在网上看到用 ruby 解码的一段程序 http://forum.nginx.org/read.php?2,52592,52592 > cookie_uid = "0Cvz4ktwVPEdbRcMAwMFAg=="; cc = cookie_uid.unpack('m*').first; rr = cc.split("").map{|c| c[0].to_i}.inject([]) {|v,s| v.push sprintf("%02X", s); v; }.values_at(3, 2, 1, 0, 7, 6, 5, 4, 11, 10, 9, 8, 15, 14, 13, 12).join("") => "E2F32BD0F154704B0C176D1D02050303" 我用 PHP 写了一个 <?php function nginx_userid_decode($str) { $str_unpacked = unpack('h*', base64_decode(str_replace(' ', '+', $str))); [...]

2010年4月12日09:59 | 没有评论
标签: , , , ,

转载时请标明文章原始出处和作者信息, 作者: lostsnow.http://www.lsproc.com/blog/use_ob_flush_on_nginx_fastcgi/ Nginx与php-cgi是两个独立的程序,通过TCP或Unix套接字通信,不像Apache那样是集成在一起的。所以,Nginx有fastcgi 缓冲区,数据超出缓冲区大小、或程序执行完,才会将内容输出到客户端。如果要使用ob_flush,不能开启gzip压缩输出。 nginx.conf: fastcgi_buffer_size 4k; fastcgi_buffers 8 4k; gzip off; php.ini: output_buffering = Off <?php set_time_limit(0); ob_end_clean(); ob_implicit_flush(1); for($i = 0; $i < 10; $i++) { echo $i . "<br />\n"; echo str_repeat('', 1024*4); sleep(1); } 其中 echo str_repeat('', 1024*4); 使得fastcgi_buffer_size 4k; 的缓冲区满,从而输出内容到浏览器 参考: http://blog.s135.com/nginx_php_v6/2/1/ -- EOF --

2010年3月8日11:45 | 没有评论

转载时请标明文章原始出处和作者信息, 作者: lostsnow.http://www.lsproc.com/blog/lighttpd_phpfastcgi_config/ php(fastcgi) 5.2.6 编译参数 ./configure --prefix=/usr/local/php --with-mysql=/usr/local/mysql --with-gd=/usr --enable-calendar --with-zlib --with-bz2 --with-curl --with-mysqli=/usr/local/mysql/bin/mysql_config --enable-mbstring --with-openssl --enable-zend-multibyte --with-gettext --enable-exif --with-png-dir=/usr --with-jpeg-dir=/usr --with-libxml-dir=/usr --enable-gd-native-ttf --enable-dom --with-freetype-dir=/usr --with-iconv-dir=/usr --enable-fastcgi lighttpd 1.5.0 编译参数 ./configure --prefix=/usr/local/lighttpd --with-mysql=/usr/bin/mysql_config --with-openssl --with-pcre --with-bzip2 --enable-lfs --with-linux-aio 添加fastcgi 及lighttpd执行用户 groupadd www useradd -g www -s /sbin/nologin -d /dev/null www 复制lighttpd源码包内 doc/spawn-php.sh 并修改如下 #!/bin/bash [...]

2008年6月15日19:06 | 没有评论
标签: , ,

转载时请标明文章原始出处和作者信息, 作者: lostsnow.http://www.lsproc.com/blog/configure_lamp/ 编译环境 Debian (Ubuntu) apt-get install build-essential apt-get install libncurses5-dev sudo apt-get install libxml2-dev libcurl3-dev libpng-dev libmhash-dev libmcrypt-dev libxslt-dev libpspell-dev Mysql编译安装参数 CHOST="i686-pc-linux-gnu" CFLAGS="-O3 -msse2 -mmmx -mfpmath=sse -mcpu=pentium4 -march=pentium4 -pipe -fomit-frame-pointer" CXXFLAGS="-O3 -msse2 -mmmx -mfpmath=sse -funroll-loops -mcpu=pentium4 -march=pentium4 -pipe -fomit-frame-pointer" ./configure --prefix=/usr/local/mysql --localstatedir=/var/lib/mysql --with-comment=Source --with-server-suffix=-Community-Server --with-mysqld-user=mysql --without-debug --with-big-tables --with-charset=utf8 --with-collation=utf8_general_ci --with-extra-charsets=all --with-pthread --enable-static --enable-thread-safe-client [...]

2008年3月18日16:35 | 2 条评论