漏洞描述
在CTFd v2.0.0-v2.2.2的注册过程中,错误的用户名验证会允许攻击者接管任意帐户,前提是用户名已知并且在CTFd实例上启用了电子邮件。要利用此漏洞,必须使用与受害者的用户名相同的用户名进行注册,但在用户名之前和/或之后插入空格。这将使用与受害者相同的用户名注册该帐户。在为新帐户启动密码重置后,由于用户名冲突,CTFd将重置受害者的帐户密码。
在CTFd v2.0.0-v2.2.2的注册过程中,错误的用户名验证会允许攻击者接管任意帐户,前提是用户名已知并且在CTFd实例上启用了电子邮件。要利用此漏洞,必须使用与受害者的用户名相同的用户名进行注册,但在用户名之前和/或之后插入空格。这将使用与受害者相同的用户名注册该帐户。在为新帐户启动密码重置后,由于用户名冲突,CTFd将重置受害者的帐户密码。
在学习Java的时候,泛型作为Java的一个重大特性,是一个不可避及的知识点.但在学习过程中发现子类对象存到ArrayList<父类>里面,读出来的时候,子类特有属性还在
,这也就是说,当元素存储进ArrayList时,并不是将子类对象强制转换成父类对象(舍弃特有属性存储的).而Java支持<? super A类>
,<? extends A类>
(这是一个A类泛型或者其子类泛型)也加深了我这一疑惑.
最近肺炎爆发,被迫宅在家。闲来无事,做了道web题,正巧碰到了盲点,记录一下。
题目允许用户输入一个图片url,并通过curl发起请求返回图片给用户。
源码如下:
1 | <?php |
一条源码审计,访问source.php后可查看源码。查看源码可发现后端将传进来的file参数进行修改,然后查看是否属于白名单,但通过后require的却还是原值。所以要做的就是绕过验证。
分析源码
1 | $_page = mb_substr( |
显然,构造一个hint.php?*
类似这样的payload即可绕过。
查看php文档中对include函数有如下解释
如果定义了路径——不管是绝对路径(在 Windows 下以盘符或者 \ 开头,在 Unix/Linux 下以 / 开头)还是当前目录的相对路径(以 . 或者 .. 开头)——include_path 都会被完全忽略。例如一个文件以 ../ 开头,则解析器会在当前目录的父目录下寻找该文件。
即当file=hint.php?/*
时,它会将这个文件名当作文件路径,然后忽略其。至此,便可构造file=hint.php?/../../../../../ffffllllaaaagggg
拿到payload