通过扫描后台目录获得了源码(www.zip)。解压出来发现出了登录之外还有注册和其他的目录。在config.php中发现了flag变量,看来题目目的是让我们读取config.php了。 我们来看下每个页面: 1 index.php,register.php: 这两个个是登录页面和注册页面,要求我们输入的用户名和密码的长度都在3-16内。 2 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);
}
除此之外还有增删改查等等。 3 update.php 在这个页面我们要输入phone,要求是11为的数字。email格式要求类似于1@qq.com。nickname要求为数字字母下划线并且长度要小于等于10。但这里应该是出题人故意留的,前两个都是不满足正则则退出,但是nickname是满足才退出,我们可以用数组绕过正则,比如 nickname=a!
会die出去但是nickname[]=a!
则会成功执行下面的语句。
if(preg_match('/[^a-zA-Z0-9_]/', $_POST['nickname']) || strlen($_POST['nickname']) > 10)
die('Invalid nickname');
再往下便到了本题最关键的代码了,序列化再反序列化,序列化是在上传完电话邮箱等信息后,将数组进行序列化。 4 profile.php 在这个里面是将反序列化刚才生成的字符串。然后再将上传的photo中的内容用base64表示。对于我们来说,如果能讲photo中的文件名换成config.php则达成了我们的目的。 在反序列化中有个有趣的现象,我这里举个例子来看一下。对于这段代码,正常的输入如下。但是如果我们修改一下,变成这样,反序列化出来就会把后面的忽略掉。
关注
打赏
最近更新
- 深拷贝和浅拷贝的区别(重点)
- 【Vue】走进Vue框架世界
- 【云服务器】项目部署—搭建网站—vue电商后台管理系统
- 【React介绍】 一文带你深入React
- 【React】React组件实例的三大属性之state,props,refs(你学废了吗)
- 【脚手架VueCLI】从零开始,创建一个VUE项目
- 【React】深入理解React组件生命周期----图文详解(含代码)
- 【React】DOM的Diffing算法是什么?以及DOM中key的作用----经典面试题
- 【React】1_使用React脚手架创建项目步骤--------详解(含项目结构说明)
- 【React】2_如何使用react脚手架写一个简单的页面?