周末刚刚结束的LCTF,我们队一共做出了4道web,一道misc还有一道问卷调查(好气啊没抢到一血换pwnhub邀请码),感谢吃饭去
大佬带飞~
前言
对本渣渣而言,本次比赛质量还是不错的,我们队做出的四道web就涉及到了CBC字节翻转攻击
、PaddingOracle攻击
、sprintf格式化注入
、sql报错注出库名表名
、join注入出列名
、orderby无表名注入数据
、SSRF绕过
、条件竞争
、7个字符内getshell
等知识,收获颇丰
下面是4道web的WriteUp
Simple blog
A simple blog .To discover the secret of it.
http://111.231.111.54/
0x00获取源码
扫一下发现存在.login.php.swp
和.admin.php.swp
泄露vim -r login.php
恢复后可以查看源码
login.php
admin.php
可以看到这道题分为两个部分,第一部分管理员登录,第二部分大概率是个注入
0x01管理员登录
测试发现admin=123&password[]=111
或者直接弱口令admin、admin
可以直接登录并跳转到admin.php
,但是却提示不是真正的admin,查看admin.php源码,发现只有$_SESSION['isadmin']
存在时,才算真正的管理员
而login.php中有关session的操作,就涉及到get_identity()
和test_identity()
两个函数
这两个函数和2017NJCTF的一道cbc字节翻转题几乎一模一样,这里我参考了Pr0ph3t大佬的文章,通过构造特定的token(IV)进行CBC字节翻转攻击
,使得服务器解出来的明文为admin
,
但是这里不知道 id
的值
再参考FreeBuff的这篇文章,通过构造特定的token,也就是IV,利用test_identity()
函数导致的页面返回不同进行PaddingOracle攻击
,从而推导出中间值,然后求出明文,也就是id
总结一下,第一部分我们要做的有以下这几步
PaddingOracle攻击脚本如下
其中token和cookie要修改成第一步登录成功后的token和cookie,最后能求出14位id和一位0x01,可以爆破最后一位
CBC字节翻转攻击脚本
然后去burpsuite里爆破token就好,即可登录为管理员
0x02sql注入
这部分的核心代码主要是这几句
看到用了sprintf格式化字符串,想到省赛的注入题
测试了一下%1$'
可以成功逃逸单引号,构造盲注脚本如下,在web1.key的f14g字段找到flag
|
|
“他们”有什么秘密呢?
一个简单到不能再简单的……
http://182.254.246.93/
index.php
0x00各种注入骚操作得到下一关文件名
entrance.php存在报错注入
构造1 and linestring(pro_id)
得到表名product_2017ctf
和数据库名youcanneverfindme17
通过join注入得到字段名d067a0fa9dc61a6e
但是这个字段名被ban了,只好通过order by来得到d067a0fa9dc61a6e字段的内容,脚本如下
得到的内容和字段名拼接得到d067a0fa9dc61a6e7195ca99696b5a896.php
0x01七个字符getshell
d067a0fa9dc61a6e7195ca99696b5a896.php是个类似上传的页面,可以在服务器的一个专属文件夹生成指定文件名和内容的文件,一开始以为可以通过content[]
绕过长度限制,无果,然后google到了原题
http://c.colabug.com/article-2421-1.html
传三个文件
z.php
中的<?=`*`;
刚好7个字符,访问后能把当前目录下的所有文件按字母顺序列出,然后执行。
传好上面3个文件后,当前文件夹就有4个文件了,按字母排序如下
访问z.php后,相当于执行了bash bb index.php z.php
所以我们只需要通过修改bb来执行7个字符以内的命令
bb的内容分别为ls /
和cat /3*
萌萌哒报名系统
天依花了一整天的时间用IDE开发了一个报名系统,现在她睡着了,难道你们不想做点什么嘛XD?
http://123.206.120.239/
0x00下载源码
提示了IDE开发
扫到了http://123.206.120.239/.idea/workspace.xml
下载到了源码
login.php
member.php
register.php
0x01竞争绕过身份检测
一开始一直以为要预测str_shuffle()
打乱的字符串,无果,分析代码发现注册的时候是先将用户名密码插入数据库
,再判断注册码是否正确,然后插入用户身份,而member.php中判断用户身份的逻辑用的是
只要不为GUEST
即可执行后面的代码
想到通过竞争,在GUEST
还没更新进数据库的时候就登录并访问member.php,从而跳过身份验证
这里我的操作是
要注意的是三个操作的cookie必须相同,1和3中的账号密码要相同,这样在注册的同时就完成了登录操作并且访问了member并绕过身份检测可以执行下一部分代码
emmmmmmmm,看了操作和flag的内容,感觉我用了非预期解,预期解应该是通过输入超长的xdsec###
开头的字符串让regiest.php中的正则匹配函数崩溃,从而无法注入用户GUEST身份,后面的就都一样了
0x02文件包含读取config.php
关键代码如下
这里构造
因为x文件夹不存在,所以就能绕过is_file()
读取到config.php
,flag就在里面
签到题
这是一个拼手速抢邀请码的题
http://211.159.161.162/test.php
hint: 本地
这道题相对没前面的复杂,fuzz发现只能提交协议名://www.baidu.com
这样的值,否则error
构造
成功读取/etc/passwd
,发现lctf用户,再用相同方法读取/home/lctf/flag
得到flag
总结
周末打了两天还是学到了很多骚操作,但是没有逆向和pwn的分数所以分数差很多,最后还是膜一下各位大佬们~