关注这个靶场的其它相关笔记:Authentication Lab —— 靶场笔记合集-CSDN博客
0x01:User Agent Strings 前情提要
在某些特殊的场景中,服务端会假定客户端可以信任,并根据客户端告知它的内容做出身份验证的决策。
然而,我们知道的,客户端并不可信。所以上述逻辑,很容易就会出现安全漏洞。
0x02:User Agent Strings Write UP
访问靶场,从题目描述来看,它们的开发人员创建了一个桌面程序和一个 Web 程序来访问公司的数据库,这两个程序使用的是相同的 API,但桌面程序可能是由于是它们内部使用的,所以可以直接访问它们公司内部的数据库。而 Web 程序则需要通过用户名和密码登录后,才能访问:
我们先下载桌面程序,解压后会得到一个 Shell 脚本,内容如下:
#!/usr/bin/env bash
echo "Pinging server to check it is up."
echo
ret=`curl -s -A "authlab desktop app" https://authlab.digi.ninja/UserAgentPing`
if [[ $ret =~ "Pong" ]]; then
echo "The server is up"
else
echo "The server is not up"
fi
逻辑比较简单,就是如果 ret 获取的值为 Pong,则打印 “The server is up”,否则打印 “The server is not up”,我们可以直接运行 curl
命令看看服务端返回的内容:
curl -s -A "authlab desktop app" https://authlab.digi.ninja/UserAgentPing
通过上图的对比,我们可以很明显发现,问题出在了 -A
参数传递的值上,下面是 curl
命令 -A
与 -s
的作用:
-
-s
或--slient
:该选项会让 curl 在运行时保持静默模式,即不显示进度条或错误消息。 -
-A
或--user-agent
:该选项允许用户指定一个(User-Agent)字符串,该字符串会包含在 HTTP 请求的头部中发送给服务器。
通过上面的介绍,我们了解到,-A
是指定 HTTP 请求头 User-Agent 字段的值,那么我们是不是可以通过修改 Web 客户端发送给后端的包的 User-Agent 字段,就可以直接登录,而不需要密码呢(因为它们两个使用的是同一个 API)?
这里笔者使用的是 HackBar 插件,直接修改 User-Agent 值为 “authlab desktop app” 并发包:
从上图可以看到,服务端误认为我们是通过桌面程序访问的,所以认为我们是可信的,导致我们成功实现无密码登录。