漏洞介绍
AppWeb是Embedthis Software LLC公司负责开发维护的一个基于GPL开源协议的嵌入式Web Server。他使用C/C++来编写,能够运行在几乎先进所有流行的操作系统上。当然他最主要的应用场景还是为嵌入式设备提供Web Application容器。
AppWeb可以进行认证配置,其认证方式包括以下三种:
- basic 传统HTTP基础认证
- digest 改进版HTTP基础认证,认证成功后将使用Cookie来保存状态,而不用再传递Authorization头
- form 表单认证
其7.0.3之前的版本中,对于digest和form两种认证方式,如果用户传入的密码为null(也就是没有传递密码参数),appweb将因为一个逻辑错误导致直接认证成功,并返回session。
漏洞范围
Appweb 版本 <= 7.0.2
漏洞靶场
使用vulhub的靶场:
vulhub-master/appweb/CVE-2018-8715
使用环境为AppWeb 7.0.1
启动靶场环境:
1 | docker-compose up -d |
服务启动后,访问http://your-ip:8080即可查看到登录页面。
漏洞原理
由于身份验证过程中的逻辑缺陷,知道目标用户名后,可以通过构建的 HTTP POST 请求完全绕过表单和摘要类型身份验证的身份验证。
文件 http/httpLib.c – 函数 authCondition()
此函数负责调用负责身份验证的两个函数:getCredentials 和 httpLogin。请注意,缺少对 httpGetCredentials 的检查,它稍后会很有用。
1 | 14559 static int authCondition(HttpConn *conn, HttpRoute *route, HttpRouteOp *op) |
http/httpLib.c#L14559-L14595
文件 http/httpLib.c – 函数 httpGetCredentials()
此函数接收两个指向 char 数组的指针,这些数组将包含从请求中解析的用户名和密码。由于 authCondition 中没有检查,因此 “parseAuth” 函数失败并不重要,这意味着我们可以在 WWW-Authenticate 标头或用于身份验证的 post 数据中插入我们想要的任何字段:
1 | 1640 /* |
http/httpLib.c#L1640-L1674
文件 http/httpLib.c – 函数 httpLogin()
此函数将检查用户名是否不为 null,当已经有关联的会话时,密码指针可以为空。
1 | 1686 PUBLIC bool httpLogin(HttpConn *conn, cchar *username, cchar *password) |
http/httpLib.c#L1686-L2056
为了能够绕过身份验证,我们需要能够传递一个空密码指针,幸运的是,无论是表单还是摘要式身份验证,用于解析身份验证细节的函数(第 1666 行)将允许我们设置一个空密码指针,即使返回错误,最终也不会被 authCondition 检查, 允许我们完全绕过身份验证,利用这一点的唯一条件是知道 HashMap 中的用户名。
漏洞复现
访问http://127.0.0.1:8080进入靶场页面

抓包

修改Authorization,改为Authorization: Digest username="admin"


成功绕过认证
参考
https://www.cnblogs.com/zovt/p/16341890.html
SSD 公告 - AppWeb 身份验证绕过(摘要和基本) - SSD 安全披露 (ssd-disclosure.com)