文章目录
- 搭建环境
- 启动环境
- 漏洞复现
- 漏洞原理
前提条件:
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
如图,里面有两个镜像文件的配置信息,还有容器名字和端口:
然后使用下面命令,搭建docker-compose并启动:
sudo docker-compose up -d && sudo docker-compose up -d
如图:
启动环境
等待安装完成后,环境就搭建成功了,在浏览器中输入本机地址加之前配置文件中的端口10.9.75.45:8000进入环境:
漏洞复现
漏洞原理
在使用Postgres数据库并触发异常的时候,psycopg2会将字段名和字段值全部抛出。那么,如果字段值中包含我们可控的字符串,这个字符串其实就会被设置成
__cause__
,最后被显示在页面中。所以我们假设有如下场景:
- 用户注册页面,未检查用户名
- 注册一个用户名为
<script>alert(/xss/)</script>
的用户- 再次注册一个用户名为
<script>alert(/xss/)</script>
的用户- 触发重复键异常,导致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输入下面代码,创建一个用户名为<script>alert(/xss/)</script>的用户:
/create_user/?username=<script>alert(/xss/)</script>
创建成功后弹出一段提示成功的信息:
再次创建相同名称的用户,让他们键相同,触发异常,出现xss弹窗:
回显的这段错误信息是说违反了键唯一的规定:
duplicate key value violates unique constraint "xss_user_username_key"
DETAIL: Key (username)=(<script>alert(1)</script>) already exists.
错误信息拼接到The above exception ({{ frame.exc_cause }}) was the direct cause of the following exception: