在写这个WP的时候,我只是明白了这道题的原理,试试我并没有做出来,
所以我决定,一边记录,一边做题。
这道题的基本思想并不难,只是不容易想到解题方法。
打开网站:
随便登录一下,也没有什么反应,正常这种情况下会用一些扫描器,对网站进行扫描,在我的WP中不止一次提到这个问题,BUUCTF平台是不许扫描的,这也让我很烦,几乎所有的源码泄露,敏感文件泄露都是我手动测试的。
不管了,www.zip可以得到网站的源码。
有这么些个文件,都尝试访问一下,profile.php会提示需要我们登录
另外还有一个register.php注册页面
随便注册一个:
会有一个这样的页面
我们继续跟进这个页面:
然后,一开始我们登陆进去的时候,数据库里面肯定是没有我们的传入文件信息的,因此要经过update.php,我们继续跟进update.php
看到别人的WP说第三个判断可以控制nickname为数组绕过
这样的话两个条件是flase或null,故不会die出
接着往下,看看又进行了哪些操作
好了,现在如果我们想读取文件,
就要通过update.php中的这个函数获得photo参数
在profile.php的这个函数中读取文件
所以update.php的文件上传就是$photo变量唯一的来源,无法实际利用,到这里就是这道题的核心考点:PHP序列化长度导致字符逃逸
在大佬们的WP中了解到,PHP反序列化中读取字符的多少,是由表示长度的数字控制的,而且如果整个字符串的前一部分成功反序列化,字符串后面剩下的那些就会被丢弃。
我们来好好学习一下这个知识点:
我们想把第二个变成第一个就需要把红色框选的部分,需要PHP序列化逃逸
因此如何去增加他的长度,在读取字符串之后,她会有一个非法字符替换的过程,就是将单引号替换成no,这样一个字符就变成了两个字符,每替换一个长度就增加1。为了给我们需要插入的字符空出地方,就需要给它足够长度,把他自己读取出来,增加的长度是46-13=33,因此在username的地方加入33个单引号,造成字符串逃逸
这就成功改变了sign的值
这里有一个疑问就是,单引号变成no,长度确实是改变了,但是单引号按道理也都变成了no呀,这是如何给我们要填进去的字符腾地方的呢,就不太明白。
根据题目猜测:
替换之后:那个长度扩大了,但是字符没变还是单引号,所以才有机会把我们的字符插入进去???
有师傅明白还请告知,这篇文章我会继续修改。
构造payload:
adminwherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewhere";}s:5:"photo";s:10:"config.php";}
然后放数据包
查看源码;
base64解密就得到了flag
请发表评论