标签 ctf 下的文章

Code-Breaking Puzzles — javacon WriteUp

刷微博正好看到P神的活动,学习了。

简单记录下jar分析一般步骤:
源码下载后,JD-GUI反编译,或者到IDEA中放进lib便可以查看反编译class源码。
如果需要调试,IDEA打断点后,配置Remote如下
屏幕快照 2018-11-25 下午6.31.18

命令启动

再点击IDEA右上角的DEBUG即可。

程序结构:
屏幕快照 2018-11-25 下午6.34.08

首先我们可以从SpringBoot的配置 application.yml看起

主要就是一个黑名单,一个用户的提供。

其他文件 :
SmallEvaluationContext 继承 StandardEvaluationContext,主要是提供一个上下文环境,相当于一个容器。
ChallengeApplication 用于启动
Encryptor 加密解密工具类
KeyworkProperties 使用黑名单时需要
UserConfig 用户模型,可以看到在RemberMe时使用了Encryptor

主要看MainController
屏幕快照 2018-11-25 下午6.41.24

我们从登录看起

判断用户名密码,如果勾选了remberMe则浏览器存入加密后的cookie。
最后跳转hello.html

屏幕快照 2018-11-25 下午6.45.23

打开页面后其中比较敏感的一个操作就是对Cookie的处理,如下

程序判断rememberMeValue存在后,直接对其进行解密,然后将其setAttribute,接下来可以看到this.getAdvanceValue(username.toString())
我们来看这个方法。

其实就是与其跟黑名单做正则匹配,如果匹配成功则抛出HttpStatus.FORBIDDEN,如果没有匹配到则进行正常流程,在SmallEvaluationContext进行SpEL表达式解析。注意,这里就存在El表达式注入的问题了。
在JAVA中我们可以通过

来执行命令,但在这个题目中使用了黑名单。
所以这里我们需要使用反射来构造一条调用链,这样就可以在关键字处使用字符串拼接来达到绕过黑名单的效果。
不熟悉反射的小伙伴可以先学习一下,这里我直接给出POC 还有一些注意的点。

我们选择利用curl来配合执行命令,所以如下,字符串拼接很好理解,很容易绕过了正则匹配。

运行一下,可以看到我们成功接受到了请求。
屏幕快照 2018-11-25 下午7.04.58

接下来我们需要将其构造为SpEl的解析格式,主要就是改一个T() 。在SpEL中,使用T()运算符会调用类作用域的方法和常量。
需要注意的一个点,在JAVA中Runtime中exec对复杂一点的linux命令执行不了…我们需要将其参数改成如下才可以

所以我们构造如下POC 来执行命令并获取结果,这里一个小技巧就是使用base64来传数据。

获取目录
之后cat flag,如下,再像上面一样加密后存入cookie中即可。

屏幕快照 2018-11-25 下午6.44.00
屏幕快照 2018-11-25 下午6.17.31
屏幕快照 2018-11-25 下午6.17.42

最后,师傅们Tql,感谢p神的题目。
屏幕快照 2018-11-25 下午6.33.22

ZJCTF Final 部分WP

浙江首届大学生CTF比赛,大型网友线下见面活动,主要过来和师傅们学习下。
分享下比赛时候做出的题目和复现时放出的隐藏题目的做法以及思路。

1-1

Name

netsec

Title

知法懂法

Category

web

Describe

请认真阅读网络安全法

Score

200

Location

1-1

Solution

得到大家一致评论很坑的签到题….
注入得到一些网络安全法条目,查看发现第二十九条明显不属于网络安全法。

安全法.png

但是题目并没有给出详细提示,尝试10,二十九均无效,最后直接在搜索框输入条文内容得到flag。

netsecflag.png

1-2

Name

zq_web

Title

回味童年

Category

web

Describe

你能达到2018分吗

Score

400

Location

1-2

Solution

俄罗斯方块.png

一个没有游戏结束判定的俄罗斯方块游戏,用jd-gui打开逆向查看源码。

基本逻辑是达到一定分数,程序就会根据当前时间戳构建认证请求发送给服务器,获取flag。

直接构造发送请求:

 

2-1

Name

circle

Title

圆圈圈圆

Category

misc

Describe

一张普通的纸

Score

300

Location

2-1

Solution

图片隐写,先用binwalk分析

binwalk.png

foremost提取出其中的各种文件,中途晕头转向的过程就不提了,最后结果是:

在ole文件中得到假flag:

ole.png

用这个字符串当作密码解密rar压缩包,得到一张图片,二进制分析图片得到真flag:

zjctf{C1r_u_f1n0}

Ps:在无外网环境下给出一个不常见的ole格式文件,迷惑性还是很大的。

Pss:没太理解这个假flag和压缩包密码的联系。

Psss:主办方很坏的在内网提供了压缩包爆破工具,是个狠人.jpg

4-1

Name

pig_peppa

Title

小猪佩奇

Category

misc

Describe

小猪佩奇身上纹,掌声送给社会人

Score

300

Location

4-1

Solution

得到一个png文件和一个docx文档,binwalk检查发现都隐写了很多文件,提取出来查看,发现png文件中有一个mp3文件,文档中有一个二维码。

file.png

qr.png

解析二维码,得到:

password:APIG

思考有密码的音频隐写,尝试MP3Stego

会在当前目录生成一个peppa.mp3.txt,得到base64编码后的flag,解码得到flag。

E57C2C63583D3656E0DBF3E4028016B4.png

4-2

Name

yurisqli_final

Title

盲人摸象

Category

web

Describe

just inject it!

Score

500

Location

4-2

Solution

从题名可以看出,本题考察盲注,跑了一波sql关键词发现一些被过滤(单引号也被过滤了,但双引号没有)
以下是部分没被过滤的关键词

比赛时候poc是选择 < 来注入的,

赛后和Liano师傅交流发现他们是用in进行注入,这里在复现时候专门使用in编写了个脚本:

这里注意 in 不区分大小写,所以最后的b需要大写

B8F827C77B1EC12007091F8E500CB4F7.png

f1-1

Name

more_fast

Title

你得快点

Category

web

Describe

你需要尽快的提交flag

Score

300

Location

f1-1

Solution

查看源码,提示

让我们POST一个东西,所以得先找到这玩意。查看网络请求,在返回的请求头中发现了一个flag值:

flaginheaders.png

base64解码查看:

每次请求flag都会不同,把flag字符串用POST提交回去,发现提示不够快:

尝试多次发送请求,无果,最后发现随意POST一个字符串也会返回“不够快”,于是检查是不是POST的数据出现了问题,最后发现给出的字符串依旧是base64编码过的,还需要一次解密再提交。最终payload:

f1-2

Title

心有猛虎

Description

“心有猛虎,细嗅蔷薇”是英国诗人西格里夫·萨松代表作《于我,过去,现在以及未来 》的经典诗句。原话是“In me the tiger sniffs the rose.”诗人余光中将其翻译为:心有猛虎,细嗅蔷薇。意思是,老虎也会有细嗅蔷薇的时候,忙碌而远大的雄心也会被温柔和美丽折服,安然感受美好。讲的是人性中阳刚与阴柔的两面。(不要碰撞平台,谢谢!!!)

Category

WEB

Score

500

Solution

思路:哈希算法碰撞,查看robots.txt能看到/flag和/code,前者是提交请求的接口,后者为验证码接口,发现后端是python,于是查看有无源码泄漏,得到flag.pyc,逆向出源码后进行哈希函数碰撞。

f2-1

Name

god_blame

Title

无量寿佛

Category

web

Describe

你能得到神的保佑吗?

Score

300

Solution

点进链接页面,查看源码:

 

AAencode,解码得到:

 

发现一段base64,解码后得到flag:

zjctf{1_aM_He2e_aaaa}

安恒杯一月赛部分题目writeup

首先感谢下安恒举办的比赛,还有大神们的讲解,学习了


再来个友情链接

发现.git泄漏,拿到源码

发现上传文件,代码审计

发现upload.php里面的条件竞争漏洞,先上传文件再删除文件。但是程序开头会检查权限,需要登录后才能操作。因此解题思路为结合CSRF+条件竞争。

因为程序添加友情链接时候会先去访问这个文件

所以我们可以写个自动上传文件的js,利用csrf去上传绕过user判断,然后利用时间差,在还没删除temp文件时快速去访问/temp上传成功的php,并自动创建一个一句话shell

poc:

阅读剩余部分 –

pwnable入门题笔记

fd

ssh连上

找到fd的源码

首先,程序接收一个参数argv[1],转换为整数型之后减0x1234 ,读入buf ,比较是否与LETMEWIN相同,如果相同则get flag

 

read函数

read()会把参数fd所指的文件传送nbyte个字节到buf指针所指的内存中。若参数nbyte为0,则read()不会有作用并返回0。返回值为实际读取到的字节数,如果返回0,表示已到达文件尾或无可读取的数据。错误返回-1,并将根据不同的错误原因适当的设置错误码。

linux文件描述符

Integer value <stdio.h> file stream
0 stdin
1 stdout
2 stderr

也就是我们可以令fd=0 使得标准输入,buf的值就可以键入了

又因为

所以我们令fd=0x1234的10进制4660然后键入LETMEWIN

 

collision

先看代码

分析源码,首先输入长度为20的字符然后与关键函数check_password比较

p强制转化为指针,32位下指针一般与char的大小相同,所以相当于分成5组(char1个字节,int4个字节

然后把每四个字符看成一共int型的数字,进行5次循环相加,结果放入res中

最后符合hashcode = 0x21DD09EC; 拆分一下符合20长度限制,如下

注意下是小端模式

 

bof

给的源码:

key == 0xcafebabe 即可拿到shell但实际传的key为0xdeadbeef

又看到gets 可以溢出

IDA打开编译好的c

发现char s //[sp + 1Ch] [bp – 2Ch]说明,这个字符串s 是从[bp – 2Ch]处开始进入栈缓冲区的,所以我们只要覆盖2C字节,再加上EBP和EIP的8个字节,总共52个字节就可以成功覆盖第一个变量,也就是func里面的参数覆盖为0xcafebabe

这里盗个图方便理解

所以EXP为

拿到flag

百度杯ctf二月场几道web题 writeup

include

比较经典的文件包含题,记录一下

首先看phpinfo里allow_url_include为On

所以可以使用php://input包含执行命令

 

 

关键文件在dle345aae.php

配合

读取源码

爆破1

这里用到PHP超全局变量

$GLOBALS — 引用全局作用域中可用的全部变量

$GLOBALS 这种全局变量用于在 PHP 脚本中的任意位置访问全局变量(从函数或方法中均可)。

PHP 在名为 $GLOBALS[index] 的数组中存储了所有全局变量。变量的名字就是数组的键。

 

payload:

http://4687f7fdd5d64157a0dea153446a49728bbc8a7ce1bd49c6.game.ichunqiu.com/?hello=GLOBALS

 

爆破2

代码注入一下就ok

看来只有flag.php

然后我们直接输出源码就行

比较坑的是i春秋带了waf…我们改成post再传个值绕过

水过..

程序逻辑问题 writeup

最近准备刷一下实验吧的题,抽空做个小记录

题目连接:http://ctf5.shiyanbar.com/web/5/index.php


题目就是登陆成功用户后获得flag

首先获得php源码

其中

显然可以注入

接着往下看

这里把sql语句执行得到的数据放到row 并且判断其中的pw是否与输入的md5($_POST[pass]);相等

因为这里把用户和密码的判断分开 所以我们没法按常规注释掉密码的sql判断

但是因为row的数组结果是之前$sql的语句,所以我们其实可以通过sql注入生成一个密码来绕过

那就好办了,首先先试出来用户名为username

接下来构造sql语句

密码处填写123 成功拿到flag

压缩包文件损坏类型题

一般是缺少文件头,也有情况缺少头和尾…

zip的数据信息:

 

维吉尼亚密码小记

维吉尼亚密码(Vigenère Cipher)是在单一恺撒密码的基础上扩展出多表代换密码,根据密钥(当密钥长度小于明文长度时可以循环使用)来决定用哪一行的密表来进行替换,以此来对抗字频统计.

密表:

阅读剩余部分 –

(WEB)ping也能ping挂 writeup

最近又水了一个CTF,分享一道web题

打开界面可以看到需要输入一个ip地址 会返回ping结果 所以可以尝试 | 来执行下一个命令 但发现被过滤了

换一个方法

找到上传入口

可以看到一个上传和查看源码

查看源码利用的

base64解密

首先可以看到后端对文件后缀做了白名单验证 加上php版本都没有解析漏洞 最后试了好多方法 半夜想到可以试试伪协议,因为下面可以用文件包含来使用绕过,两种问题必须配合用才可以(感觉好多web题都涉及开伪协议了)

常见php伪协议:

* file:// — 访问本地文件系统

* http:// — 访问 HTTP(s) 网址

* ftp:// — 访问 FTP(s) URLs

* php:// — 访问各个输入/输出流(I/O streams)

* zlib:// — 压缩流

* data:// — 数据(RFC 2397)

* glob:// — 查找匹配的文件路径模式

* phar:// — PHP 归档

* ssh2:// — Secure Shell 2

* rar:// — RAR

* ogg:// — 音频流

* expect:// — 处理交互式的流

所以我们可以写一个读取flag的1.php

然后压缩为zip

上传时修改后缀为.png 但type的zip类型不要改

上传成功,继续往下看代码

设置了一个文件名的随机数

学长帮写了一个爆破程序

爆破出来 文件名假设最后为305005900_1.png

然后..

继续看代码

一个文件包含,最后会自动加上.php,这也是比较纠结的一个点,最后的解决办法就是上面说的可以配合伪协议使用

(题目的难点就是只能上传图片后缀的文件,但却只能读取.php的文件)

所以最后利用phar解里面的1.php

构造的payload为: