原理
在文件上传的功能处,如果服务端的脚本语言没有对上传的文件进行严格的验证和处理,导致恶意用户上传恶意脚本时,就有可能获取执行服务端命令的能力,这就是文件上传漏洞
那在服务器中,webshell怎么才能运行呢?
以LAMP环境为例,想要运行PHP脚本有两个要求:
1、路径。脚本要在网站目录中,如果不在目录中就无效
2、后缀名。能够使服务端解析的后缀名,Apache用来解析后缀并能够设置可解析的文件后缀
在代码中,PHP是怎么用来接收文件的呢
$_FILES['file']:文件
$_FILES['file'][]:文件名称
$_FILES['file']['temp_file']:临时文件
$_FILES['file']['type']:文件内容
$_FILES['file']['size']:文件大小
在将一句话木马上传后,我们又应该怎么连接呢
在一句话木马上传后,我们可以使用中国菜刀、蚁剑等webshell连接工具进行连接
要想连接上我们上传上去的一句话木马,首先就要找到文件上传后所存放的位置
举个栗子:
目标网址:http://192.168.11.221/upload_1.php
(1)一句话木马文件为404.php,上传后显示存放路径:
/var/www/html/uoloads/404.php
在连接时的地址就是:http://192.168.11.221/uploads/404.php
(2)若上传后显示存放路径为:
./uploads/404.php
那在连接时的地址就是:http://192.168.11.221/admin/uploads/404.php
(3)又或者上传后显示存放路径为:
../uploads/404.php
在连接时的地址又会变成:http://192.168.11.221/uploads/404.php
有时我们在将一句话木马上传上去之后,发现网站并没有将存放的路径显示给你,直接提示上传成功
这时我们就要结合功能来判断上传后的存储路径了
1、首先上传一张正常无害的图片
2、去首页找到图片获取到路径
3、再上传webshell,根据已有的路径进行分析
文件上传测试内容
其实应该说,如何判断上传点对上传文件进行那种过滤
首先我们要知道,文件上传测试,主要是测试三个方面:
1、内容
2、类型
3、后缀
我们使用burp抓包,来看看上传时抓包的内容
从抓包的内容我们来看,能看到上传文件的名称和文件类型,还能看到文件内容。
在了解测试时要测试的三个方面后,我们再来了解下文件上传的检测分类
文件上传检测分类
首先我们要知道相册、头像;视频、照片分享;附件上传;文件管理器都是文件上传漏洞的高危触发点
既然都是高危的触发点,那在网站开发者编写网站时,就会对这些高危的点进行一些防护,以防止恶意用户破坏网站。在做防护时就会有一下几种方法
##分类
直接上传
前端JS过滤
MIME-TYPE(文件类型)检测
文件头检测
基于黑名单的文件件拓展名检测
基于白名单的文件件拓展名检测
直接上传
如果网站开发者没有对上传处进行校验,任意用户可以上传任意文件的话,100%可能这个网站就会被getshell,最后GG
前端JS过滤
如果这时网站开发人员发现了上传处没做过滤,因为这个原因自己的网站被黑了无数次,最终对网站进行了修改。但是虽然对用户上传进行了校验,可是通过前端JS代码来完成的。
这时黑客又发现这个漏洞,非常嚣张的使用了3种方法进行绕过
1、禁用前端JS选项
使用火狐浏览器,打开web控制台设置禁用JavaScript
2、直接前端删除JS代码
F12打开开发者工具,删除前端过滤代码
3、使用burp抓包上传
抓取数据,将filename改为所允许的文件名
MIME-TYPE(文件类型)检测
这时网站开发人员抓狂了,气急败坏的又对文件的类型进行检测。但是对于黑客来说还是小菜一碟
继续使用burp抓包来修改文件的类型来绕过检测
文件头检测
在找到问题原因后,网站的开发人员发现问题所在,又将文件头进行了过滤,禁止PHP文件的上传。这依然没有难倒这位黑客,随手就生成了一张图片马,点击上传,getshell
制作一张图片马
首先准备一张图片和一个一句话木马文件
yjh.php中的一句话木马内容为
<?php @eval($_POST[yjh]);?> |
打开DOS命令窗口写入copy tp.jpg/b+yjh.php tpyjh.jpg
就会新生成一个叫tpyjh.jpg的图片一句话木马
基于黑名单的文件拓展名检测
网站开发者的怒气值之线上升,一气之下,又使用黑名单禁止:.php|.php5|.php4|.php3|.php2|php1|.html|.htm|.phtml|.pHp|.pHp5|.pHp4|.pHp3|.pHp2|pHp1|.Html|.Htm|.pHtml|.jsp|.jspa|.jspx|.jsw|.jsv|.jspf|.jtml|.jSp|.jSpx|.jSpa|.jSw|.jSv|.jSpf|.jHtml|.asp|.aspx|.asa|.asax|.ascx|.ashx|.asmx|.cer|.aSp|.aSpx|.aSa|.aSax|.aScx|.aShx|.aSmx|.cEr|.sWf|.swf 后缀文件进行上传!
心里还想着:这下你这个黑客没办法上传了吧!
黑客尝试了一些方法:
1、通过大小写进行绕过。如:1.php改为1.PHP
注意:这是最简单的方法,由于Windows系统不区分大小写所以无效,但是Linux系统区分大小写所以是有作用的。
但是黑客发现开发者想到这点,几乎过滤了所有有问题的文件名。
但对于这个黑客来说依然不是问题,虽然开发者几乎过滤了所有有问题的文件名,除了.htaccess,于是首先上传一个.htaccess内容如下的文件
SetHandler application/x-httpd-php |
这样所有文件都会解析为php,然后再上传图片马,就可以进行解析 。
就这样,开发者和黑客之间就开始进行了较量:这边开发者使用黑名单疯狂禁止黑客的攻击,那边黑客则从容应对各种过滤
基于白名单的文件拓展名检测
在一番攻防对战后,开发者明显抵挡不了黑客的攻击,于是翻开武林秘籍《PHP是世界上最好的语言》,发现基于白名单的文件检测,秘籍上说:白名单的文件检测是只有名单中存在的文件后缀才可绕过,是现在网站中通用的,最为安全的一种方式,于是开发者学会此招再次与黑客交手
此时黑客发现,虽然白名单非常的安全,但也是有破绽所在:拦截漏洞是基于PHP5.2的 特性,只有在PHP5.2版本中存在此漏洞,对于此漏洞,可以使用00截断的方式来进行绕过
00截断
首先打开burp进行抓包
在filename处修改名字为1.php.jpg。uplloadimg处添加1. php注意一定要加空格,因为我们要修改的就是这里
选择Hex选项,在里面把刚才的空格进行修改,空格为%20,这里要修改为00
放出所有数据包,我们会发现一句话已经上传上去了
来源:freebuf.com 2020-07-24 09:24:20 by: hahali
请登录后发表评论
注册