XSS漏洞复现(CVE-2017-12794)

文章目录

  • 搭建环境
  • 启动环境
  • 漏洞复现
    • 漏洞原理

前提条件:

1.安装docker

docker pull medicean/vulapps:j_joomla_2

2.安装docker-compose

docker run -d -p 8000:80 medicean/vulapps:j_joomla_2

3.下载vulhub

搭建环境

进入vulhb目录下的joomla,复现CVE-2017-12794漏洞:

cd /vulhub/django/CVE-2017-12794

查看docker-compose的配置文件:

cat docker-compose.yml

如图,里面有两个镜像文件的配置信息,还有容器名字和端口:

XSS漏洞复现(CVE-2017-12794)_第1张图片

然后使用下面命令,搭建docker-compose并启动:

sudo docker-compose up -d && sudo docker-compose up -d

如图:

XSS漏洞复现(CVE-2017-12794)_第2张图片

启动环境

等待安装完成后,环境就搭建成功了,在浏览器中输入本机地址加之前配置文件中的端口10.9.75.45:8000进入环境:

XSS漏洞复现(CVE-2017-12794)_第3张图片

漏洞复现

漏洞原理

在使用Postgres数据库并触发异常的时候,psycopg2会将字段名和字段值全部抛出。那么,如果字段值中包含我们可控的字符串,这个字符串其实就会被设置成__cause__,最后被显示在页面中。

所以我们假设有如下场景:

  1. 用户注册页面,未检查用户名
  2. 注册一个用户名为的用户
  3. 再次注册一个用户名为的用户
  4. 触发重复键异常,导致XSS漏洞

查看该网站的源码:

def __exit__(self, exc_type, exc_value, traceback):
    if exc_type is None:
        return
    for dj_exc_type in (
            DataError,
            OperationalError,
            IntegrityError,
            InternalError,
            ProgrammingError,
            NotSupportedError,
            DatabaseError,
            InterfaceError,
            Error,
    ):
        db_exc_type = getattr(self.wrapper.Database, dj_exc_type.__name__)
        if issubclass(exc_type, db_exc_type):
            dj_exc_value = dj_exc_type(*exc_value.args)
            dj_exc_value.__cause__ = exc_value
            if not hasattr(exc_value, '__traceback__'):
                exc_value.__traceback__ = traceback
            # Only set the 'errors_occurred' flag for errors that may make
            # the connection unusable.
            if dj_exc_type not in (DataError, IntegrityError):
                self.wrapper.errors_occurred = True
            six.reraise(dj_exc_type, dj_exc_value, traceback)

exc_value是上一个的错误信息,traceback是上一个错误信息的回溯。这个函数其实就是关联了上一个错误信息和当前的错误信息。

在下面这段if语句中,实际上关联了两个相同类型的报错,将它们拼接到The above exception ({{ frame.exc_cause }}) was the direct cause of the following exception:

if issubclass(exc_type, db_exc_type):
            dj_exc_value = dj_exc_type(*exc_value.args)
            dj_exc_value.__cause__ = exc_value
            if not hasattr(exc_value, '__traceback__'):
                exc_value.__traceback__ = traceback

尝试在URL输入下面代码,创建一个用户名为的用户:

/create_user/?username=

创建成功后弹出一段提示成功的信息:

XSS漏洞复现(CVE-2017-12794)_第4张图片

再次创建相同名称的用户,让他们键相同,触发异常,出现xss弹窗:

XSS漏洞复现(CVE-2017-12794)_第5张图片

回显的这段错误信息是说违反了键唯一的规定:

duplicate key value violates unique constraint "xss_user_username_key"
DETAIL:  Key (username)=() already exists.

错误信息拼接到The above exception ({{ frame.exc_cause }}) was the direct cause of the following exception:

XSS漏洞复现(CVE-2017-12794)_第6张图片

你可能感兴趣的:(漏洞复现,网络安全,xss,网络,安全)