这个题的writeup我准备认认真真的写一下,因为这道题我觉得还是很有质量的,有文件包含,代码审计和反序列化的一些东西。。。
打开页面,出现了一行提示,说我不是admin,然后查看页面源代码。
发现了一行代码,猜测这道题是个审计题,从代码中可以看到,后端接收到user=admin时,会包含class.php的文件,直接访问class.php后发现什么都没有,一片空白。然后仔细观察上面的代码
发现这个的file_get_contents函数竟然读取的是前端发送的数据,正常来讲这个函数是读取文件的,还有就是它通过GET接收了一个file,然后把class.php包含进去了,然后我们试试文件包含,给user传一个admin,才能使文件包含成立,然后试一下文件包含漏洞,看看能不能爆出源码。
爆出了index.php的源码,然后转码看一下。发现和提示中的代码还是有区别的,当然我们以这个为准,因为这才是index.php里面真正的代码。
然后我们再看下class.php的源码
代码分析:
index.php中接收三个参数的值,分别是user、file、pass,还有一个提示,说明flag在f1a9.php这个文件中,由于存在文件包含,可以直接爆出代码,所有用文件包含尝试查看f1a9.php中的代码时发现,是不能成功的,只能用其他办法了。
再来看class.php,里面是一个PHP类,但是查看所有的代码发现没有调用这个类,而这个类才是拿到flag的关键。所以要想办法调用这个class.php中的类。发现index.php中有包含这个class.php文件的代码,前提是要满足如下的判断语句:
有两个if语句,先满足第一个,让$user的值为admin,然后再让第二个if为False,就能成功的包含class.php了,于是构造如下:
然后我们再来看看这个unserialize();这是个反序列化函数,我们可以利用这个函数,传入参数导致调用index.php中的class类,然后读取f1a9.php中的内容。
有关反序列化的知识:https://www.cnblogs.com/dragonli/p/5527414.html
反序列化漏洞的知识:https://www.cnblogs.com/perl6/p/7124345.html
于是我们来手写一个序列化,调用class.php类,然后让file=f1a9.php。
构造payload:O:4:"Read":1:{s:4:"file";s:8:"f1a9.php";}
这串序列号进行反序列之后就等于:
然后将payload代入到pass参数传入后端,查看返回结果。
查看页面源代码:
成功拿到flag。。。
免责声明:本站某些文章、信息、图片、软件等来源于互联网,由本网整理发表,希望传递更多信息和学习之目的,并不意味赞同起观点或证实其内容的真实性以及非法用途。 如设计、版权等问题,请立即联系管理员,我们会给予更改或删除相关文章,保证您的权利。
评论