‘Program&Database’ 分类的存档

转载时请标明文章原始出处和作者信息, 作者: 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/copy_to_clipboard/ 从 discuz! 里扒出来的(简易实现), 代码如下: var clipboardswfdata; var setcopy_gettext = function(){ clipboardswfdata = document.getElementById('data').value; window.document.clipboardswf.SetVariable('str', clipboardswfdata); } var floatwin = function(){ alert('copy success, ' + clipboardswfdata); } <input type="text" name="data" value="xxxxx11111" id ="data" /> <div id="clipboard_content"> <span class="clipinner" id="clipinner">点此复制到剪贴板 <embed name="clipboardswf" class="clipboardswf" id="clipboardswf" onmouseover="setcopy_gettext()" devicefont="false" src="./clipboard.swf" menu="false" allowscriptaccess="sameDomain" swliveconnect="true" wmode="transparent" type="application/x-shockwave-flash" height="20" width="100"></span> [...]

2010年4月13日14:48 | 2 条评论

转载时请标明文章原始出处和作者信息, 作者: 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/python_spider/ #coding=utf-8 import sys import urllib2 import gzip import StringIO # 页面url url = "http://china.toocle.com/company/show/pdetail--1000436--10532651.html" # 页面编码 page_encode = "gbk" request = urllib2.Request(url) request.add_header("Accept-encoding", "gzip") usock = urllib2.urlopen(request) page = usock.read() # 处理gzip过的页面 if usock.headers.get('content-encoding', None) == 'gzip': page = gzip.GzipFile(fileobj=StringIO.StringIO(page)).read() # 转unicode(gbk/utf8) if not isinstance(page, unicode): page = unicode(page, page_encode) print(page) -- [...]

2010年2月1日14:34 | 没有评论
标签: ,

转载时请标明文章原始出处和作者信息, 作者: lostsnow.http://www.lsproc.com/blog/ajax_char_lose/ 采用Ajax传递数据时,通常会将数据整理为data="var1=abc&var2=def"。而当数据中存在加号(+)或是连接符(&)时,服务器端接收数据时会有部分数据丢失现象。分析一下Ajax传递数据的格式与Javascript的语法不难发现: 1. "+"号:JavaScript解析为字符串连接符,所以服务器端接收数据时"+"会丢失。 2. "&":JavaScript解析为变量连接符,所以服务器端接收数据时&符号以后的数据都会丢失。 解决办法也相当简单,只需要为+与&符号编码即可: function vchar(str) { str = str.replace(/\+/g, "%2B"); str = str.replace(/\&/g, "%26"); return str; } var1 = "abc+kef"; var2 = "abc&kef"; var1 = vchar(var1); var2 = vchar(var2); alert(var1); alert(var2); 使用jquery的话可以使用如下方式提交 var params = $('input, textarea').serialize(); $.ajax({ type: 'post', url: 'xxxx.php', data: params, success: function(response){ ...... } }); [...]

2009年1月8日11:09 | 没有评论