🐳博客主页:举杯同庆 – 生命不息,折腾不止
🌐订阅专栏:『Web安全』
📰如觉得博主文章写的不错,或对你有所帮助的话,请多多支持呀! 👉关注✨、点赞👍、收藏📂、评论。
话题讨论中国经济周刊-2022-07-08 新闻 万豪国际集团证实了近期一起数据泄露事件,一个月前黑客进入了马里兰州一家万豪酒店的服务器,在获得约20GB数据后试图敲诈万豪,但万豪拒绝付款。被泄漏的数据包括客人的信用卡信息及客人和员工的机密信息
对此,网友们怎么看?可以留言讨论。
索引
文件上传漏洞是指用户上传了一个可执行的脚本文件,并通过此脚本文件获得了执行服务器端命令的能力。常见场景是web服务器允许用户上传图片或者普通文本文件保存,而用户绕过上传机制上传恶意代码并执行从而控制服务器。
需要说明的是上传文件操作本身是没有问题的,问题在于文件上传到服务器后,服务器怎么处理和解释文件。
这种攻击方式是最为直接和有效的,如果服务器的处理逻辑做的不够安全,则会导致严重的后果。
要完成这个攻击,要满足以下几个条件:
前面说过web安全攻防的测试靶场很多都是基于php服务器的,所以举例也是依.php文件为例,这个漏洞与开发语言无关。

1. nginx解析漏洞
漏洞原理:
Nginx默认是以CGI(服务器运行php文件的接口协议common gateway interface)的方式支持PHP解析的,普遍的做法是在Nginx配置文件中通过正则匹配设置SCRIPT_FILENAME。当访问www.xx.com/info.jpg/test.php这个URL时,$fastcgi_script_name会被设置为“info.jpg/test.php”,然后构造成SCRIPT_FILENAME传递给PHP CGI,最终PHP会将info.jpg作为PHP文件解析,为什么呢?
这就要说到fix_pathinfo这个选项了,这是php配置文件中的一个关键选项,默认是开启的, 如果开启了这个选项,那么就会触发在PHP中的如下逻辑:
PHP会认为SCRIPT_FILENAME是info.jpg,而test.php是PATH_INFO,所以就会将info.jpg作为PHP文件来解析了
PHP官方给出的建议是将fix_pathinfo参数设置为0,对此bug态度消极。
漏洞文件形如:
www.xxxx.com/UploadFiles/image/1.jpg/1.php
www.xxxx.com/UploadFiles/image/1.jpg%00.php
www.xxxx.com/UploadFiles/image/1.jpg/%20\0.php
另外一种手法:上传一个名字为test.jpg,然后访问test.jpg/.php,在这个目录下就会生成一句话木马shell.php。

2. apache解析漏洞
漏洞原理
Apache2.x以前版本 解析文件的规则是从右到左开始判断解析,如果后缀名为不可识别文件解析,就再往左判断,直到遇见一个Apache认识的文件类型为止。比如test.php.rar,这里”.rar” 这两种后缀是apache不可识别解析,apache就会把wooyun.php.rar解析成php,然后认为这是一个.php类型的文件。至于Apache都能识别哪些文件呢?这些文件类型定义在apache的mime.types配置文件中找到。
漏洞文件名形如 www.xxxx.xxx.com/test.php.php123
Apache的这个特性,很多工程师在写应用时并不知道,写出的安全检查就可能存在缺陷,比如.rar文件是一个合法的上传请求,在应用里值判断文件的后缀是否.rar,而用户上传的文件是xxxx.php.rar.rar,从而导致脚本执行。
3. 攻击测试步骤
这个场景非常巧妙,首先假设有个一句话木马文件,上传的时候可能会被和谐掉,所以要把此木马文件转换为图片马(比如cmd命令生成、二进制文本打开后加上木马命令等好几种方式都很简单),图片马是图片格式所以很容易上传成功。另外,需要攻击的服务器包含文件上传漏洞,这里用中国菜刀或者蚁剑(webshell管理工具)测试即可。
只要web容器无法解析该目录下的文件,即使攻击者上传了脚本文件,服务器本身也不会受到影响。在实际应用中,很多大型网站或系统文件上传后会放在一个独立的存储服务器,做静态文件处理,一方面方便使用缓存加速,降低性能损耗,另一个方面也杜绝了脚本执行的可能。对于一些小应用,文件上传问题还是需要多加关注。
在判断文件类型时,可以结合使用MIME Type、后缀检查等方式。通过javascript来校验上传文件的后缀是否合法,在浏览加载文件,但还未点击上传按钮时便弹出对话框,推荐采用白名单方法,内容如:只允许上传.jpg/.jpeg/.png后缀名的文件。
注意:校验文件后缀时黑名单方法不是一种好的设计方法,容易被跳过。
此外
此外,对于图片的处理,可以使用压缩函数或者resize函数破坏图片中可能包含的HTML代码。
文件上传如果要执行代码,则需要用户能够访问到这个文件。如果应用中使用随机数改写了文件名和路径,将极大的增加攻击的成本。同时,向上面的xxxx.php.rar.rar这种文件将会因文件名被改写而无法成功实施攻击。
由于浏览器的同源策略,一系列客户端攻击将失效,比如上传包含JavaScript的XSS利用等问题将得到解决,但是能否单独设置域名,还要看具体的业务环境。
文件上传往往与代码执行联系在一起,因此对于业务中用到的上传功能,都应该由安全工程师进行严格的检查。
文件上传问题看似简单,但是要实现一个安全的上传功能要考虑很多问题,不断的发现问题,结合业务需求改进,才能设计出最合理的上传功能。
我有一个Ruby程序,它使用rubyzip压缩XML文件的目录树。gem。我的问题是文件开始变得很重,我想提高压缩级别,因为压缩时间不是问题。我在rubyzipdocumentation中找不到一种为创建的ZIP文件指定压缩级别的方法。有人知道如何更改此设置吗?是否有另一个允许指定压缩级别的Ruby库? 最佳答案 这是我通过查看rubyzip内部创建的代码。level=Zlib::BEST_COMPRESSIONZip::ZipOutputStream.open(zip_file)do|zip|Dir.glob("**/*")d
我试图在一个项目中使用rake,如果我把所有东西都放到Rakefile中,它会很大并且很难读取/找到东西,所以我试着将每个命名空间放在lib/rake中它自己的文件中,我添加了这个到我的rake文件的顶部:Dir['#{File.dirname(__FILE__)}/lib/rake/*.rake'].map{|f|requiref}它加载文件没问题,但没有任务。我现在只有一个.rake文件作为测试,名为“servers.rake”,它看起来像这样:namespace:serverdotask:testdoputs"test"endend所以当我运行rakeserver:testid时
我的目标是转换表单输入,例如“100兆字节”或“1GB”,并将其转换为我可以存储在数据库中的文件大小(以千字节为单位)。目前,我有这个:defquota_convert@regex=/([0-9]+)(.*)s/@sizes=%w{kilobytemegabytegigabyte}m=self.quota.match(@regex)if@sizes.include?m[2]eval("self.quota=#{m[1]}.#{m[2]}")endend这有效,但前提是输入是倍数(“gigabytes”,而不是“gigabyte”)并且由于使用了eval看起来疯狂不安全。所以,功能正常,
Rails2.3可以选择随时使用RouteSet#add_configuration_file添加更多路由。是否可以在Rails3项目中做同样的事情? 最佳答案 在config/application.rb中:config.paths.config.routes在Rails3.2(也可能是Rails3.1)中,使用:config.paths["config/routes"] 关于ruby-on-rails-Rails3中的多个路由文件,我们在StackOverflow上找到一个类似的问题
对于具有离线功能的智能手机应用程序,我正在为Xml文件创建单向文本同步。我希望我的服务器将增量/差异(例如GNU差异补丁)发送到目标设备。这是计划:Time=0Server:hasversion_1ofXmlfile(~800kiB)Client:hasversion_1ofXmlfile(~800kiB)Time=1Server:hasversion_1andversion_2ofXmlfile(each~800kiB)computesdeltaoftheseversions(=patch)(~10kiB)sendspatchtoClient(~10kiBtransferred)Cl
我正在寻找执行以下操作的正确语法(在Perl、Shell或Ruby中):#variabletoaccessthedatalinesappendedasafileEND_OF_SCRIPT_MARKERrawdatastartshereanditcontinues. 最佳答案 Perl用__DATA__做这个:#!/usr/bin/perlusestrict;usewarnings;while(){print;}__DATA__Texttoprintgoeshere 关于ruby-如何将脚
使用带有Rails插件的vim,您可以创建一个迁移文件,然后一次性打开该文件吗?textmate也可以这样吗? 最佳答案 你可以使用rails.vim然后做类似的事情::Rgeneratemigratonadd_foo_to_bar插件将打开迁移生成的文件,这正是您想要的。我不能代表textmate。 关于ruby-使用VimRails,您可以创建一个新的迁移文件并一次性打开它吗?,我们在StackOverflow上找到一个类似的问题: https://sta
好的,所以我的目标是轻松地将一些数据保存到磁盘以备后用。您如何简单地写入然后读取一个对象?所以如果我有一个简单的类classCattr_accessor:a,:bdefinitialize(a,b)@a,@b=a,bendend所以如果我从中非常快地制作一个objobj=C.new("foo","bar")#justgaveitsomerandomvalues然后我可以把它变成一个kindaidstring=obj.to_s#whichreturns""我终于可以将此字符串打印到文件或其他内容中。我的问题是,我该如何再次将这个id变回一个对象?我知道我可以自己挑选信息并制作一个接受该信
我正在编写一个小脚本来定位aws存储桶中的特定文件,并创建一个临时验证的url以发送给同事。(理想情况下,这将创建类似于在控制台上右键单击存储桶中的文件并复制链接地址的结果)。我研究过回形针,它似乎不符合这个标准,但我可能只是不知道它的全部功能。我尝试了以下方法:defauthenticated_url(file_name,bucket)AWS::S3::S3Object.url_for(file_name,bucket,:secure=>true,:expires=>20*60)end产生这种类型的结果:...-1.amazonaws.com/file_path/file.zip.A
我注意到像bundler这样的项目在每个specfile中执行requirespec_helper我还注意到rspec使用选项--require,它允许您在引导rspec时要求一个文件。您还可以将其添加到.rspec文件中,因此只要您运行不带参数的rspec就会添加它。使用上述方法有什么缺点可以解释为什么像bundler这样的项目选择在每个规范文件中都需要spec_helper吗? 最佳答案 我不在Bundler上工作,所以我不能直接谈论他们的做法。并非所有项目都checkin.rspec文件。原因是这个文件,通常按照当前的惯例,只