MiniLCTF2022 - Web
0x01 checkin
访问/home提示Only admin can get the secret!,可以猜想本题采取了验证token的方式来判断是否为admin
1 | func HomeController(c *gin.Context) { |
查看源码可以知道token经过解密后判断user.Name
字段是否为admin,如果为admin就直接打开flag
源码中的token加密
1 | func TokenEncrypt(user []byte) (string, error) { |
可以看出是aes加密,cbc模式,最后将iv和密文拼接后得到token
到了这一步可以联想到aes算法的cbc翻转攻击,通过改变上一组的密文来使当前组的密文解密结果发送变化
1 | func IndexController(c *gin.Context) { |
继续在源码中获取到明文的格式{Name: "guest", CreateAt: time.Now().Unix(), IP: c.ClientIP()}
只用把guest
翻转为admin
即可,以下为解题脚本
1 | import base64 |
0x02 mini_sql
一道简洁的sql注入题目,目的明确,注出用户名密码登陆后即可得到flag
注释中给出sql语句 <!-- select * from users where username='$username' and password='$password'; -->
,本题过滤了#注释符和单引号,无法将语句提前闭合,可以在用户名处以反斜杠\
结尾,将username之后的单引号注释,从而让password处的内容全部连接到sql语句中,这是常规注入方式
or被过滤 =>||
代替
#被过滤 =>;%00
代替
substr被过滤 =>mid
代替
1 | ||ascii(mid(version(),{i},1))={j};%00 |
但本题的盲注由于select被过滤,所以无法继续,尝试大小写和截断均无法绕过
select被过滤一般只有在堆叠注入的情况下才可以绕过,除了极个别不需要select可以直接用password或者flag进行查询的情况
- 预编译注入
- Handler查询
但经过尝试后均失败,本题无法堆叠注入
1 | ||ascii(mid(username,{i},1))={j};%00 |
MYSQL8.0注入新特性
当所有的常规方法用完后,终于发现了一条新路线,利用mysql8.0的新特性进行注入,
出现了两个新的关键字table和values
1 | def dump(): |
类似于无列名注入,得到账号密码后登录获取flag
0x03 include
一个简洁的文件上传,当尝试上传时为显示Only members of Lteam can use it.,那么一定与user有关
将user解码后修改为Lteam即可正常使用上传功能
成功传入一句话木马,直接蚁剑连接getshell,根目录下得到flag
本题为非预期
出题人upload.php写错了,直接把php传上去了
1 |
|
stristr($file_name, $deny_ext)
函数碰到数组爆错了,设置的黑名单也就无效了,导致这个题被狠狠的非预期