web37笔记(include命令执行+过滤flag)

<?php

/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date:   2020-09-04 00:12:34
# @Last Modified by:   h1xa
# @Last Modified time: 2020-09-04 05:18:55
# @email: h1xa@ctfer.com
# @link: https://ctfer.com
*/

//flag in flag.php
error_reporting(0);
if(isset($_GET['c'])){
    $c = $_GET['c'];
    if(!preg_match("/flag/i", $c)){
        include($c);
        echo $flag;
    
    }
        
}else{
    highlight_file(__FILE__);
}

相⽐于之前,这⼀次给的就不是eval直接来执⾏命令,⽽是使⽤的include来进⾏命令执⾏。

因为不能带有flag,所以php伪协议来读是不⾏的(因为必须打完整的flag.php)

伪协议:

总:

file:// 协议

php:// 协议

zip://

bzip2://

zlib:// 协议

data:// 协议

http:// 协议

https://协议

phar:// 协议

分:

file:// 协议:

条件 allow_url_fopen:off/on allow_url_include :off/on

作⽤:⽤于访问本地⽂件系统。在include()/require()等参数可控的情况下,如果导⼊⾮php⽂件也会被解析为php

⽤法:

1.file://[⽂件的绝对路径和⽂件名]

2.[⽂件的相对路径和⽂件名]

3.[http://⽹络路径和⽂件名]

php:// 协议:

条件 allow_url_include :仅php://input php://stdin php://memory php://temp 需要on allow_url_fopen:off/on

作⽤:php:// 访问各个输⼊/输出流(I/O streams),在CTF中经常使⽤的是php://filter和php://input,php://filter⽤于读取源码,php://input⽤于执⾏php代码 php://filter参数详解:resource=(必选,指定了你要筛选过滤的数据流) read=(可选) write=(可选) 对read和write,可选过滤器有string.rot13、string.toupper、string.tolower、string.strip_tags、convert.base64-encode & convert.base64-decode

⽤法举例:php://filter/read=convert.base64-encode/resource=flag.php

zip:// bzip2:// zlib:// 协议:

条件:allow_url_fopen:off/on allow_url_include :off/on

作⽤:zip:// & bzip2:// & zlib:// 均属于压缩流,可以访问压缩⽂件中的⼦⽂件,更重要的是不需要指定后缀名

⽤法:zip://[压缩⽂件绝对路径]%23[压缩⽂件内的⼦⽂件名] compress.bzip2://file.bz2 compress.zlib://file.gz 其中phar://和zip://类似

data:// 协议:

条件:allow_url_fopen:on allow_url_include :on

作⽤:可以使⽤data://数据流封装器,以传递相应格式的数据。通常可以⽤来执⾏PHP代码。

⽤法:data://text/plain, data://text/plain;base64,

举例:data://text/plain,<?php%20phpinfo();?>

data://text/plain;base64,PD9waHAgcGhwaW5mbygpOz8%2b

由此可⻅,web37这道题可以⽤data://伪协议来执⾏代码 组合得到payload ?c=data://text/plain,<?php%20system("tac%20f*");?>

 

posted @ 2025-03-14 22:44  justdoIT*  阅读(19)  评论(0)    收藏  举报