进来一个登录框,先试试sql注入,不太行
扫目录扫到www.zip,拿到源码
先看一下index.php
对username和password的长度进行判断,需要在3-16之间
再看一下class.php,在class.php看到过滤,将上面那些字符串改为hacker,可能用到的思路就是字符串逃逸,而且上面还有一些增删改查的函数
public function filter($string) {
$escape = array('\'', '\\\\');
$escape = '/' . implode('|', $escape) . '/';
$string = preg_replace($escape, '_', $string);
$safe = array('select', 'insert', 'update', 'delete', 'where');
$safe = '/' . implode('|', $safe) . '/i';
return preg_replace($safe, 'hacker', $string);
}
update.php
<?php
require_once('class.php');
if($_SESSION['username'] == null) {
die('Login First');
}
if($_POST['phone'] && $_POST['email'] && $_POST['nickname'] && $_FILES['photo']) {
$username = $_SESSION['username'];
if(!preg_match('/^\d{11}$/', $_POST['phone']))
die('Invalid phone');
if(!preg_match('/^[_a-zA-Z0-9]{1,10}@[_a-zA-Z0-9]{1,10}\.[_a-zA-Z0-9]{1,10}$/', $_POST['email']))
die('Invalid email');
if(preg_match('/[^a-zA-Z0-9_]/', $_POST['nickname']) || strlen($_POST['nickname']) > 10)
die('Invalid nickname');
$file = $_FILES['photo'];
if($file['size'] < 5 or $file['size'] > 1000000)
die('Photo size error');
move_uploaded_file($file['tmp_name'], 'upload/' . md5($file['name']));
$profile['phone'] = $_POST['phone'];
$profile['email'] = $_POST['email'];
$profile['nickname'] = $_POST['nickname'];
$profile['photo'] = 'upload/' . md5($file['name']);
$user->update_profile($username, serialize($profile));
echo 'Update Profile Success!<a href="profile.php">Your Profile</a>';
}
在这个页面我们要输入phone,要求是11为的数字。email格式要求类似于1@qq.com。nickname要求不能为数字字母下划线或者长度大于10
然后下面就是将填写完的信息进行序列化
profile.php
<?php
require_once('class.php');
if($_SESSION['username'] == null) {
die('Login First');
}
$username = $_SESSION['username'];
$profile=$user->show_profile($username);
if($profile == null) {
header('Location: update.php');
}
else {
$profile = unserialize($profile);
$phone = $profile['phone'];
$email = $profile['email'];
$nickname = $profile['nickname'];
$photo = base64_encode(file_get_contents($profile['photo']));
?>
先反序列化刚才生成的字符串,然后再将上传的photo中的内容用base64表示。
看到file_get_contents,所以我们需要将photo中的文件名换成config.php
config.php中有flag
分析一波
如果原本的photo给丢弃,则需要在nickname的值后写入";}s:5:"photo";s:10:"config.php";},但nickname却在被序列化前,被strlen函数限制只能小于10长度。该函数可以用数组来进行绕过,只需要在提交前把nickname写成数组即可绕过。
我们先访问register.php注册一个账号,注册完之后登录,然后需要我们填写信息
在nickname写入
wherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewhere";}s:5:"photo";s:10:"config.php";}
点击Your_Profile
将页面源代码的src进行base64解码即可