CTF论剑场-(web21)一道很有质量的web题、反序列化

2019年8月3日23:18:36 评论 1,421

这个题的writeup我准备认认真真的写一下,因为这道题我觉得还是很有质量的,有文件包含,代码审计和反序列化的一些东西。。。

打开页面,出现了一行提示,说我不是admin,然后查看页面源代码。

图片 1.png

发现了一行代码,猜测这道题是个审计题,从代码中可以看到,后端接收到user=admin时,会包含class.php的文件,直接访问class.php后发现什么都没有,一片空白。然后仔细观察上面的代码

图片 2.png

发现这个的file_get_contents函数竟然读取的是前端发送的数据,正常来讲这个函数是读取文件的,还有就是它通过GET接收了一个file,然后把class.php包含进去了,然后我们试试文件包含,给user传一个admin,才能使文件包含成立,然后试一下文件包含漏洞,看看能不能爆出源码。

图片 3.png

爆出了index.php的源码,然后转码看一下。发现和提示中的代码还是有区别的,当然我们以这个为准,因为这才是index.php里面真正的代码。

图片 4.png

然后我们再看下class.php的源码

图片 5.png

代码分析:
index.php中接收三个参数的值,分别是user、file、pass,还有一个提示,说明flag在f1a9.php这个文件中,由于存在文件包含,可以直接爆出代码,所有用文件包含尝试查看f1a9.php中的代码时发现,是不能成功的,只能用其他办法了。
再来看class.php,里面是一个PHP类,但是查看所有的代码发现没有调用这个类,而这个类才是拿到flag的关键。所以要想办法调用这个class.php中的类。发现index.php中有包含这个class.php文件的代码,前提是要满足如下的判断语句:

图片 6.png

有两个if语句,先满足第一个,让$user的值为admin,然后再让第二个if为False,就能成功的包含class.php了,于是构造如下:

图片 7.png

然后我们再来看看这个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";}
这串序列号进行反序列之后就等于:

图片 8.png

然后将payload代入到pass参数传入后端,查看返回结果。

图片 9.png

查看页面源代码:

图片 10.png

成功拿到flag。。。

http://www.oniont.cn/index.php/archives/61.html

高性能云服务器2折起

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: