BY-SA 4.0(除特别声明或转载文章外)
一段遇到多次的代码
buuctf web方面的第一题,是这样一段代码
做的时候就感觉莫名的眼熟,想了想好像之前做题也遇到过,在二面的时候给的cms中也出现过,就记录一下,或许这就是现cms中经常出现的一个漏洞呢~
P.S.(后来经搜索发现确实是CVE漏洞,编号为CVE-2018-12613)
这里把二面的代码也给贴出来
自己博客不嫌字多,看该文件中定义的checkFile,几乎和上面那道题类似,都设置了读取白名单,进行了多个if的检验,并在检验返回true后去包含那个文件。
这里注意他的检验方法,先在参数后面加上一个?,再去截断第一个?前的内容进行白名单的比较;我们很容易想到构造
但其实这个payload是不行的(不知道为什么这个payload在那道题里适用…理论上来说是行不通的),因为它无法去读取到后面那个文件。这时候我们继续看if验证还有个先url解码,再加上一个?,再去对比第一个?前的内容进行白名单比较(为了防止后面还有传参),于是我们得到payload:
他会只截取到source.php拿去进行白名单比较。而后面去读取flag的时候涉及到一个文件包含中的问题,即如果前一个文件不存在的话。他会忽视前一个文件。例子如下,大家可以试一下: 这是用于包含的文件
然后再去用类似payload包含文件
%253f是?的二次编码
从上面的例子可以看到,这三个payload读取的都是cookie.txt这个文件,因为前面的12.txt%253f,12,12.txtfdaohuithroh并不存在,于是就被忽略掉了。 而这里我们为了通过验证 这时他包含的会是后一个文件,因为它将前一个文件视为了目录。 再说编码的问题,两次url编码,会在url传过去时一次解码。并在urldecode那里解码为?,就完成了隔断。然后就通过了验证,返回了true,去包含了我们想要的那个文件。
学到的东西,对那两个函数mb_substr,mb_strpos,有了更深的印象,了解到了上文提到的文件包含所包含的文件名的那个机制。还有../../../../../../这种遍历目录的方法。主要就这些。
P.S.(就像我上面补充的,这是个CVE,所以说下结合的方法,个人觉得还是应该配合的文件上传传上去的马进行利用。)
CVE-2018-12613 影响phpMyAdmin 4.8.0和4.8.1
payload:/phpmyadmin/index.php?target=db_sql.php%253f/../../../../../../../../etc/passwd