这个题的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。。。

澳大利亚 1F
这题真的挺爽的。
上海市 B1
@ 茶韵幽远 确实,一遍过的时候很解压。
山西省吕梁市 2F
瓜皮,反序列化真是坑。
湖南省益阳市 3F
admin参数真的只能这么传吗?
吉林省 B1
@ 袋熊胖胖 对,user必须是admin,不然包含不了文件。
湖北省武汉市 B1
@ 袋熊胖胖 admin必须GET传,post不行,试过了。
日本 B1
@ 袋熊胖胖 admin参数不就是GET传进去吗,还能咋传?
上海市 B1
@ 袋熊胖胖 payload能不能简化真不重要,关键是得懂原理,不然换题还是不会。
北京市 4F
文件包含又是老套路,笑死。
日本 B1
@ 旧时光摆渡人 老套路归老套路,可玩出花来的还是少数,这次算一个。
印度 B1
@ 旧时光摆渡人 老套路归老套路,可每次还是能卡住一批人,hhh
河北省石家庄市 5F
我之前也玩过类似题,卡了好久。
天津市 B1
@ 冰封心 是啊,我也卡在构造payload那里,格式老错。
湖南省衡阳市衡山县 6F
太带感了,爽到飞起!😂
内蒙古 7F
围观一下,这波操作挺炫。
越南 B1
@ 机敏的貂 手写O:4:”Read”那段我也调试了好久,格式错一点都不行。
河北省唐山市 8F
还有个小技巧:把class对象序列化后塞进pass,直接拿到flag。
日本 9F
file只能在admin时include,随便改参数根本不中。
上海市 10F
我之前在CTF里也遇到过类似的反序列化坑,调试时卡在payload格式上,最后靠手写O:4:”Read”的序列化才突破,真是又爱又恨。
北京市 B1
@ 憨憨大萝卜 手写的payload格式真得小心,少个引号都白搭。
江苏省无锡市 11F
反序列化拿flag这招真骚,学到了。
河北省石家庄市 12F
看不懂,这代码太绕了。
上海市 13F
payload那段O:4:”Read”看着就头大。
湖北省武汉市 14F
文件包含+反序列化,这结合挺妙啊。
澳大利亚 B1
@ 剑影无名 这种组合拳打出来,确实有点东西,不是纯堆漏洞。
印度 15F
之前做过类似的,那个file_get_contents读前端数据确实是个坑。
上海市 16F
flag在f1a9.php里,直接包含读不到吗?
福建省福州市 B1
@ 糖醋排骨香 直接包含f1a9.php肯定被过滤了,估计做了内容检查。
四川省南充市 17F
这writeup写得挺细,适合我这种小白跟。
重庆市 18F
手写序列化字符串,记得格式要对,不然老报错。
湖南省长沙市 19F
class.php里的类没调用,怎么触发?
浙江省温州市 20F
图片里的代码能再清晰点不,有点糊。
日本 21F
file_get_contents读前端数据,这设计也太怪了吧。
山东省临沂市 22F
之前拿这题练手,卡在反序列化入口那里半天。
浙江省温州市 23F
有没有更简单的绕过方法啊?
韩国 B1
@ 彩色粉笔画家 反序列化触发条件能不能再解释下?
北京市 24F
O:4:”Read”这格式,新手一看就懵。
贵州省贵阳市 25F
反序列化那块儿能不能再讲细点?
日本 26F
这题出得确实有意思,各种漏洞揉一块儿了。
广东省惠州市 27F
图片里代码能不能给个高亮版本?看着费眼。
广东省珠海市 B1
@ 河马小胖 图片确实有点模糊,代码高亮会好很多。
陕西省西安市 28F
直接包含f1a9.php为啥不行,非得绕一圈?
上海市 29F
flag最后长啥样,好奇。
北京市 30F
我去,这题我交了八次才过,心态炸了。
中国 31F
感觉还行,就是payload太容易写错了。
江苏省扬州市 32F
file_get_contents读GET数据,这操作真的骚。
上海市 33F
之前搞代码审计时也碰上这种伪装include的,坑惨了。
韩国 34F
这题flag是随机生成的吧?看到好多人贴的不同。
韩国 B1
@ 星之海 flag真随机,我交了三次每次都不一样。
山东省 35F
看不懂反序列化咋触发的,有大佬画个流程图吗?
日本 36F
手写O:4:”Read”那段,真的只能背下来吗?想不通逻辑。
山东省烟台市 37F
反序列化那块儿确实容易卡住,特别是payload格式。
北京市 38F
直接传admin就能包含class.php,这设计挺有意思。
日本 39F
payload构造有没有现成工具能生成啊?
重庆市 B1
@ 幽影迷宫 PHPGGC直接生成,不过得改改参数。
天津市 40F
这种文件包含+反序列化的组合在CTF里还挺常见。
澳大利亚 41F
flag每次都是随机生成的吗?
天津市 42F
class.php里的Read类怎么调用的还是没太懂。
湖北省 B1
@ 玉华宫画师 class.php里的类没主动调用,得靠反序列化自动触发。
上海市浦东新区 43F
这题难度适中,适合练手。
湖南省长沙市 44F
payload构造有现成工具,比如PHPGGC这种。
印度 45F
反序列化触发条件还是有点绕,得结合文件包含一起看。
云南省昆明市 B1
@ 叛逆小鲨 O:4:”Read”这段手写太折磨了,有没有生成器啊?
广东省广州市 B1
@ 叛逆小鲨 围观,坐等大佬们贴flag格式长什么样。🤔
河南省郑州市 B1
@ 叛逆小鲨 class.php没调用能触发,不就是因为反序列化自动调用了?
湖北省武汉市 46F
手写序列化字符串确实容易出错,特别是引号和长度。
吉林省延边州延吉市 47F
file_get_contents读前端数据,这漏洞挺隐蔽的。
北京市 48F
这题适合拿来练手,套路挺经典的。
湖南省岳阳市 49F
有没有更简单的payload写法?
江西省南昌市 50F
flag最后是啥样的?贴出来看看呗。
湖北省武汉市 51F
代码审计部分能再展开说说吗?
黑龙江省佳木斯市 52F
围观技术大佬炫技。🤔
浙江省嘉兴市 53F
file_get_contents读输入,这脑洞谁想的?
江苏省无锡市 54F
反序列化入口卡了我半小时,服了。
广东省 55F
这题和之前打的某ctf一模一样套路。
北京市 56F
O:4:”Read”格式背了三天才记住。
辽宁省 57F
看不懂为啥不能直接包含flag文件。
江西省吉安市 58F
太费劲了,payload写错一个字符全崩。
澳大利亚 59F
直接贴flag呗,别卖关子了。
河南省平顶山市 60F
flag最后是ctf{xxx}格式吗?
湖南省岳阳市 61F
之前搞审计也遇到这种伪装包含,坑。
越南 62F
class.php明明没调用,咋触发的?
北京市 63F
围观,这操作太秀了。🤔
广西 64F
payload能简化不,手写太痛苦。
江苏省扬州市 65F
这题比上周那个简单多了。
河北省衡水市 66F
file参数被限制死了,改不了。
日本 67F
代码高亮版有没有,看得眼睛疼。
江苏省盐城市 68F
反序列化那段流程图求出一份。
湖南省湘潭市 69F
这题最坑的就是payload格式,错一位直接GG。
黑龙江省哈尔滨市 70F
file_get_contents读前端数据,真的离谱,谁这么设计的?
韩国 71F
flag格式不都是ctf{xxx}嘛,还能整出花?
上海市 72F
我之前也搞过类似题,文件包含+反序列化,真是一环套一环。
印度 73F
直接包含f1a9.php不行,估计做了过滤或者条件限制。
辽宁省沈阳市铁西区 74F
payload构造那里卡了好久,总算过了
广东省 B1
@ RuneboundWarden 我也卡过,后来发现是格式问题
陕西省延安市 75F
代码审计这块儿要是能画个流程图就好了,太绕了。
日本 76F
瓜皮,这题我调试了两个小时,就为一个引号。
北京市 77F
这题writeup讲得算细了,比我之前看的强多了。
河南省郑州市 78F
太费劲了,搞了整整一天,总算过了,泪目。