• phpcms头像上传漏洞


    经典版

    漏洞原理:我们上传一个zip的压缩包,它会解压然后删除其中不是.jpg .gig .png的文件

    1. function check_dir($dir):这是一个PHP函数的定义,它接受一个参数 $dir,代表要检查的目录路径。

    2. $handle = opendir($dir);:使用 opendir 函数打开指定目录,并将返回的目录句柄赋值给变量 $handle

    3. while (($f = readdir($handle)) !== false):使用 readdir 函数循环读取目录中的文件,每次循环将文件名赋给变量 $f

    4. if (!in_array($f, array('.', '..'))) { ... }:在每次循环中,检查当前文件名是否为当前目录(.)或父目录(..),如果不是,则执行下面的操作。

    5. $ext = strtolower(substr(strrchr($f, '.'), 1));:使用 strrchr 函数找到文件名中的最后一个 .,然后使用 substr 截取文件扩展名,并用 strtolower 将其转换为小写。

    6. if (!in_array($ext, array('jpg', 'gif', 'png'))) { unlink($dir . $f); }:如果文件的扩展名不是jpg、gif或png,则使用 unlink 函数删除该文件。

    1. header("Content-Type:text/html; charset=utf-8");
    2. require_once('pclzip.lib.php');
    3. $file = $_FILES['file'];
    4. if ($file['size'] == 0) {
    5. exit("请勿上传空文件");
    6. }
    7. $name = $file['name'];
    8. $dir = 'uploads/';
    9. $ext = strtolower(substr(strrchr($name, '.'), 1));
    10. function check_dir($dir)
    11. {
    12. $handle = opendir($dir);
    13. while (($f = readdir($handle)) !== false) {
    14. if (!in_array($f, array('.', '..'))) {
    15. $ext = strtolower(substr(strrchr($f, '.'), 1));
    16. if (!in_array($ext, array('jpg', 'gif', 'png'))) {
    17. unlink($dir . $f);
    18. }
    19. }
    20. }
    21. }
    22. if (!is_dir($dir)) {
    23. mkdir($dir);
    24. }
    25. $temp_dir = $dir . 'member/1/';
    26. if (!is_dir($temp_dir)) {
    27. mkdir($temp_dir);
    28. }
    29. if (in_array($ext, array('zip', 'jpg', 'gif', 'png'))) {
    30. if ($ext == 'zip') {
    31. $archive = new PclZip($file['tmp_name']);
    32. if ($archive->extract(PCLZIP_OPT_PATH, $temp_dir, PCLZIP_OPT_REPLACE_NEWER) == 0) {
    33. exit("解压失败");
    34. }
    35. check_dir($temp_dir);
    36. exit('上传成功!');
    37. } else {
    38. move_uploaded_file($file['tmp_name'], $temp_dir . '/' . $file['name']);
    39. check_dir($temp_dir);
    40. exit('上传成功!');
    41. }
    42. } else {
    43. exit('仅允许上传zip、jpg、gif、png文件!');
    44. }

    如果我们把图片和php一句话木马文件一起压缩,上传后就会发现php被删除了。

    绕过方法:我们把php文件单独放在一个文件夹中,然后将这个文件夹和图片一起压缩成zip,然后上传

    这个bbb文件夹里面的111.php就没有被删除了,然后就可以连接蚁剑了

    升级版

    上面主要是没有进行递归删除导致的绕过,后面进行了递归删除

    1. header("Content-Type:text/html; charset=utf-8");
    2. require_once('pclzip.lib.php');
    3. $file = $_FILES['file'];
    4. if ($file['size'] == 0) {
    5. exit("请勿上传空文件");
    6. }
    7. $name = $file['name'];
    8. $dir = 'uploads/';
    9. $ext = strtolower(substr(strrchr($name, '.'), 1));
    10. function check_dir($dir)
    11. {
    12. $handle = opendir($dir);
    13. while (($f = readdir($handle)) !== false) {
    14. if (!in_array($f, array('.', '..'))) {
    15. if (is_dir($dir . $f)) {
    16. check_dir($dir . $f . '/');
    17. } else {
    18. $ext = strtolower(substr(strrchr($f, '.'), 1));
    19. if (!in_array($ext, array('jpg', 'gif', 'png'))) {
    20. unlink($dir . $f);
    21. }
    22. }
    23. }
    24. }
    25. }
    26. if (!is_dir($dir)) {
    27. mkdir($dir);
    28. }
    29. $temp_dir = $dir . 'member/1/';
    30. if (!is_dir($temp_dir)) {
    31. mkdir($temp_dir);
    32. }
    33. if (in_array($ext, array('zip', 'jpg', 'gif', 'png'))) {
    34. if ($ext == 'zip') {
    35. // $zip = new ZipArchive;
    36. // if(!$zip->open($file['tmp_name'])) {
    37. // echo "fail";
    38. // return false;
    39. // }
    40. // if(!$zip->extractTo($temp_dir)) {
    41. // // check_dir($temp_dir);
    42. // exit('fail to zip');
    43. // }
    44. $archive = new PclZip($file['tmp_name']);
    45. if ($archive->extract(PCLZIP_OPT_PATH, $temp_dir, PCLZIP_OPT_REPLACE_NEWER) == 0) {
    46. exit("解压失败");
    47. }
    48. check_dir($temp_dir);
    49. exit('上传成功!');
    50. } else {
    51. move_uploaded_file($file['tmp_name'], $temp_dir . '/' . $file['name']);
    52. check_dir($temp_dir);
    53. exit('上传成功!');
    54. }
    55. } else {
    56. exit('仅允许上传zip、jpg、gif、png文件!');
    57. }

    我们发现,bbb中的111.php就被删除了

    但是代码逻辑是先解压,后删除,我们就用条件竞争来绕过

    因为我发现,同时使用burp上传和访问,经过多次尝试没有成功,我换了个操作,使用手动上传zip,burp访问php,多次手动上传之后,成功了

    在我们的uploads下面生成了一句话木马文件,直接连蚁剑

    至此,phpcms告一段落

  • 相关阅读:
    几种常用XML文档解析方案的使用操作
    读了很多书,学了很多语言,专业知识远超普通大众,程序员1024依然要送外卖
    2023年中国智能电视柜产量、需求量、市场规模及行业价格走势[图]
    【C语言】指针和数组的深入理解(第二期)
    SVG图形
    苹果图片heic格式怎么转化成jpg?两种方法解决它
    client-side-rendering: 客户端渲染CSR优化案例
    前端面试题---事件循环机制和异步编程
    【网络安全篇】PHP文件与目录操作(一文带你手撕迷茫)
    李迟2022年8月工作生活总结
  • 原文地址:https://blog.csdn.net/m0_70349048/article/details/136610799