php前端后缀名绕过,有关上传webshell文件绕过的总结

本文分享了2017年作者在遭遇上传漏洞时的实践,包括前端脚本检测、Content-Type绕过、%00截断、特殊字符利用、SQL注入等策略。详细介绍了如何通过技术手段绕过服务器的各种安全检测,适用于IT安全和渗透测试人员。
摘要由CSDN通过智能技术生成

2017-08-15

下午碰到一个站,有两处上传漏洞,通过一个点获取了webshell,尝试另一个点获取shell,还使用了白盒测试,然而并没有绕过。

总结一下,碰到文件上传的好事,应该如何绕过后缀名

1. 前台脚本检测扩展名

由于是客户端脚本的检测,任何的逻辑都可以通过burpsuit抓包,直接更改报文内容,替换文件扩展名

2. Content-Type检测文件类型-绕过

Content-Type检测是对http报文中的MIME类型进行检测,服务端逻辑是检测Content-Type的内容,无论是黑名单,还是白名单,都可以通过burpsuit更改Content-Type字段,改成不被阻拦的MIME类型。主要是由于服务端对于文件的解析,并不依靠于Content-Type字段,而是通过文件的后缀类型,所有Content-Type检测并没什么用。

3. 文件系统%00截断—绕过

假设需要上传的文件为:eval.php,服务端的白名单允许.jpg的格式,则修改文件名为:eval.php%00.jpg。因为文件系统读到%00会认为文件已经结束,但是利用%00截断也需要根据服务端具体逻辑,需要判断服务端是否会对上传的文件进行重命名

服务端检测文件后缀名的逻辑是通过lastIndexOf(“.”)实现,这种情况.jpg会会被服务器放行,但是!如果服务器对文件进行重命名

那除去.jpg部分其他部分都会被重命名,%00字段也会被覆盖,这种情况即使文件内容是php代码,但文件会变成20170815123012.jpg,即便能够访问上传的文件,系统的解析方式会是jpg而不是php,绕过失败,如下面的服务端逻辑:FileItemFactory factory = new DiskFileItemFactory();

ServletFileUpload upload = new ServletFileUpload(factory);

upload.setHeaderEncoding("UTF-8");

List items = upload.parseRequest(request);

Iterator itr = items.iterator();

while (itr.hasNext()) {

FileItem item = (FileItem) itr.next();

String fileName = item.getName();

long fileSize = item.getSize();

if (!item.isFormField()) {

//检查文件大小

if(item.getSize() > maxSize){

out.println(getError("上传文件大小超过限制。"));

return;

}

//检查扩展名

String fileExt = fileName.substring(fileName.lastIndexOf(".") + 1).toLowerCase();

if(!Arrays.asList(extMap.get(dirName).split(",")).contains(fileExt)){

out.println(getError("上传文件扩展名是不允许的扩展名。n只允许" + extMap.get(dirName) + "格式。"));

return;

}

SimpleDateFormat df = new SimpleDateFormat("yyyyMMddHHmmss");

String newFileName = df.format(new Date()) + "_" + new Random().nextInt(1000) + "." + fileExt;

try{

File uploadedFile = new File(savePath, newFileName);

item.write(uploadedFile);

}catch(Exception e){

out.println(getError("上传文件失败。"));

return;

}

JSONObject obj = new JSONObject();

obj.put("error", 0);

obj.put("url", saveUrl + newFileName);

out.println(obj.toJSONString());

}

}如果服务器不对文件进行重命名

这种情况,%00可以完美绕过,服务器检查了.jpg,验证通过。直接将该文件存在服务端,服务器读到%00会停止,将文件写入eval.php中。

服务端不存在%00截断漏洞

对于asp,jsp,php不同的版本可能会有不同的截断漏洞,一般低版本会存在%00截断漏洞(%00截断只在php3,5之前,并且GPC关闭的情况下,才会存在漏洞),高版本%00截断漏洞会无效,这种情况就无法绕过,但是对于某些服务器,又会存在%00空字节执行漏洞,如Nginx版本:0.5., 0.6., 0.7 <= 0.7.65, 0.8 <= 0.8.37。URL里面在遇到%00空字节时与FastCGI处理不一致,导致可在非php文件中嵌入php代码,通过访问url+%00.php来执行其中的php代码。如:http://local/robots.txt%00.php会把robots.txt文件当作php来执行。

4. “.”和”/”截断-绕过

在windows7系统下,长于226个英文句号会出现截断效果。情况同%00,改漏洞在php3.5以后版本已经修复

5. “?”截断漏洞

该漏洞不是在传shell时使用,”?”漏洞发生在文件包含的情况下,在php中,打开远程文件包含许可,即“allow_url_include = On

利用方式不受版本限制,如http://127.0.0.1/test/t1.php?name=http://127.0.0.1/test/secret.txt,这里?后面会看做一个参数,导致文件包含。

6. 服务端扩展名检测黑名单-绕过

服务端会对上传的文件进行黑名单检测,这种情况可以使用eval.php.abc形式绕过。Apache如果无法解析.abc扩展名,会继续向前解析,即解析成.php

7. 重写解析规则-绕过

上传覆盖.htaccess文件,重写解析规则,将上传的带马图片以脚本的方式解析。上传的.htaccess文件覆盖原先的.htaccess文件,如:

SetHandler application/x-httpd-php

8. 检测文件头信息-绕过

比如要求上传的文件为图片,服务端进行后缀检测时,先检测.jpd .png,再读取文件头exif信息,判断是否为图片。

如果服务端存在%00截断的漏洞,可以先以此绕过.jpg的检测,exif头信息的检测可以采用copy a.jpg/b+eval.php/a eval.php合并图片和php文件。访问改文件时,以php的格式解析,只会读取php标签里的内容,图片的内容不会影响解析。

9. 其他方式-绕过1. 后缀名大小写绕过

用于只将小写的脚本后缀名(如php)过滤掉的场合;

例如:将Burpsuite截获的数据包中的文件名【evil.php】改为【evil.Php】

2. 双写后缀名绕过

用于只将文件后缀名,例如"php"字符串过滤的场合;

例如:上传时将Burpsuite截获的数据包中文件名【evil.php】改为【evil.pphphp】,那么过滤了第一个"php"字符串"后,开头的'p'和结尾的'hp'就组合又形成了【php】。

3. 特殊后缀名绕过

用于检测文件合法性的脚本有问题的场合;

例如:将Burpsuite截获的数据包中【evil.php】名字改为【evil.php6】,或加个空格改为【evil.php 】等。

10. 上传shell的其他方式:

sql注入写入木马文件。列举这种方式的限制条件:sql语句执行时需要写入权限,一般mysql.ini文件会有参数secure_file_priv=”c:/wamp64/tmp”,

指定sql语句执行时,只能写到secure_file_priv指定的目录下。

需要sql注入漏洞。

写入shell的路径是绝对路径,因此也要获取web站点的绝对路径,以此获取shell相对web站点根目录的相对路径,通过webbrowser访问到shell

secure_file_priv指定的目录如果超出网站根目录的范围,web上将无法访问到(如果没有访问控制,也许可以通过../../../到达)

sql写入方式:union all select 1,’php木马’,3,4,5,6 into outfile ‘D:/www/t.php’

secure_file_priv=”c:/wamp64/tmp”。

以上只是自己肤浅的总结,后面还有很多知识需要更新和添加,希望自己不断成长!

corener

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值