标题: [wargames] Natas 18 解答 分类: 安全测试 创建: 2022-12-04 17:35 修改: 链接: http://0x2531.tech/testing/202212041735.txt -------------------------------------------------------------------------------- OverTheWire 设计了一系列 wargames,Natas 是其中之一,主要关注基本的服务端 Web 安全问题。 最近抽空玩了下,还挺有趣。 Natas 项目地址:https://overthewire.org/wargames/natas/ Natas 18 主要考察代码审计方面的能力,具体知识点是 HTTP 会话和暴力破解。 主要的后端代码如下: ========== "; } } function my_session_start() { if(array_key_exists("PHPSESSID", $_COOKIE) and isValidID($_COOKIE["PHPSESSID"])) { if(!session_start()) { debug("Session start failed"); return false; } else { debug("Session start ok"); if(!array_key_exists("admin", $_SESSION)) { debug("Session was old: admin flag set"); $_SESSION["admin"] = 0; // backwards compatible, secure } return true; } } return false; } function print_credentials() { if($_SESSION and array_key_exists("admin", $_SESSION) and $_SESSION["admin"] == 1) { print "You are an admin. The credentials for the next level are:
"; print "
Username: natas19\n";
        print "Password: 
"; } else { print "You are logged in as a regular user. Login as an admin to retrieve credentials for natas19."; } } $showform = true; if(my_session_start()) { print_credentials(); $showform = false; } else { if(array_key_exists("username", $_REQUEST) && array_key_exists("password", $_REQUEST)) { session_id(createID($_REQUEST["username"])); session_start(); $_SESSION["admin"] = isValidAdminLogin(); debug("New session started"); $showform = false; print_credentials(); } } if($showform) { ?>

Please login with your admin account to retrieve credentials for natas19.

Username:
Password:
========== 提交表单后,使用 session_id 函数创建会话 id,审计代码可知,该会话 id 介于 1~640 之间。 $maxid = 640; function createID($user) { global $maxid; return rand(1, $maxid); } 补充说明下,会话也是一种 cookie,只是其值保存在服务端,客户端通过 PHPSESSID 只保存会话 id。 当 cookie 传递到服务端后,后端代码通过会话 id 获取到会话实体。如:当前会话是否属于 admin 用 户。 当会话属于 admin 时,即可获取到下一关的密码。 if($_SESSION and array_key_exists("admin", $_SESSION) and $_SESSION["admin"] == 1) { print "You are an admin. The credentials for the next level are:
"; print "
Username: natas19\n";
    print "Password: 
"; } 如何知道哪个是 admin 会话 id呢?考虑到总共只有 640 个会话,直接暴力破解看页面响应即可。 可以直接使用 Burp Suite 的 Intruder 模块,能方便的生成这些会话 id。 首先,payload type 选择 Numbers,然后设置 payload options,从1到640步长为1生成640个会 话 id 序列。最后,设置命中 admin 会话的内容特征,可以是“You are an admin”,也可以不设置, 待所有 payload 跑完后,对响应结果排序也可以。 最后,获取到 natas19 的密码:8LMJEhKFbMKIL2mxQKjv0aEDdk7zpT0s。