前言
这次网鼎杯的拉垮说明了很多问题,还是懒和蠢的问题。除了这些个人觉得还得对一些对学习方法进行检讨。不过在此前,先记一下复现的几道赛题。
网鼎杯
Notes
这是个比较简单的node题,但是我还是没做出来。
考点
- nodejs审计
有问题的包是undersafe,这个包主要用于递归读取对象的属性。
参考demo
1 | var object = { |
化简后有问题的代码
1 | var parts = split(path); |
这段代码的逻辑大概是这样的,递归取到倒数第二个元素作为parent,最后一个是obj,如果存在value就把value的值赋给parent.xxx=value,xxx是形如a.b.c中的c,parent是b。如果我们传入proto.a的话,就能给所有对象增加一个a属性,a属性的值是可控的。
简单地浏览下所有有undersafe的地方,发现问题出在editnote上。
1 | edit_note(id, author, raw) { |
再结合这边的命令执行
1 | app.route('/status') |
我们可以很容易构造出以下payload
1 | post /edit_note |
最后
如果在buu上复现弹bash会失败,改成perl就好了。
filejava
一道常规的java题,,,然而就是没做出来,flag在根目录
考点
- 任意文件下载
- xxe(已知漏洞的复现能力)
filename=../../../../../../../../../../../../../etc/passwd(不行就多来几次)
逐步调整确认
filename=../../web.xml
然后根据该结果依次下载所有.class文件并反编译。
downloadServlet
1 |
|
大意就是除了flag啥都能读,别想着用大小写绕。
uploadServlet
1 | public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { |
很明显的poi的洞,估计是xxe
参考 https://xz.aliyun.com/t/6996
用法比较简单,修改[Content_Types].xml,添加外部实体引入。这里需要注意,mac下直接解压再压缩改后缀名会有问题,所以,可以使用一款ezip的软件,直接将原来的文件移除,再导入修改后的文件既可使用。
添加的payload
1 |
eval.dtd
1 |
buu复现成功,需要自己开个linux。
虎符ctf
easy_login
考点
- jwt伪造
- koa项目结构的一些了解
- js弱类型
首先有事没事扫一下
发现一个app.js
找下有用的代码
1 | const rest = require('./rest'); |
看controller.js
1 | const fs = require('fs'); |
看到addControllers,发现controllers下存在文件,经过一些试探,发现api.js是我们需要的东西。
1 | const crypto = require('crypto'); |
要拿到flag的要求是用户名为admin,但尝试注册后发现不能注册admin,而这里使用jwt验证,我们想到了jwt空算法。
这里的登录,直接使用和jwt中的参数做比较
1 | const status = username === user.username && password === user.password; |
对sid的验证是这样的
1 | if(sid === undefined || sid === null || !(sid < global.secrets.length && sid >= 0)) { |
这里使用[]数组来绕过。
最后使用python的jwt模块来生成验证token。
1 | jwt.encode({'username':'admin','password':'admin','secretid':[]},'',algorithm='none') |
先注册个账号,然后登录抓包
把设置的token填上就可以上flag了
babyupload
考点
- php session file_hander存储机制的了解
- file_exists的绕过
1 |
|
这里我根据自己本地改了下,但是基本不影响
这里主要有两个功能上传和下载功能,但是这边对../做了现在所以是无法跨目录的。
这里getflag的条件有二,第一success.txt存在,第二username为admin。
先来说说第二个
我们还发现session文件的存储目录和文件的上传目录是同一个,也就是说,如果我们能够上传一个形如sess_xxx的文件就可以通过session_start来伪造username。
经过分析我们发现:
如果我们上传名为sess的文件便可满足需求。
1 | $file_path = $dir_path . "/" . $_FILES['up_file']['name']; |
我们可以使用download功能来确定session file的存储类型为php_binary。由于php_binary可能存在不可视字符的问题,最好直接采用代码生成。
1 |
|
将生成的代码上传改名即可。
第二的问题就是success.txt的问题,这里经过查阅文档后发现file_exist判断的不只有文件,还包括了文件夹,所以我们可以通过attr来添加一个success.txt的文件夹来绕过这一步。
最后流程如下。
总结
现在自己的一个很大的毛病就是只想着如何做,对一些基本的原理的学习有些轻视,这导致很大的问题。有时候按照别人的wp复现了半天出了啥问题也不知道咋处理,感觉有些地方需要理一理的时候还是要花时间来做下沉淀的。另外一个就是被懒癌拖了很久的代码审计的工作不管咋样也要开始搞了,看代码看不得要领这点很致命。