先注册一个账号,然后发现http://ede1e494b5d64ab8adc945efde6138b168f86c65a30e4a4f.game.ichunqiu.com/view.php?no=1存在注入
联合查询中union会被拦截,于是用注释符绕过 http://ede1e494b5d64ab8adc945efde6138b168f86c65a30e4a4f.game.ichunqiu.com/view.php?no=22 union/*!*/ select 1,2,3,4%23并且在报错中发现返回字段要进行反序列化
并且请求网页进行了base64编码输出,所以判断后端php用了file_get_contents函数,但是在join.php对博客地址做了限制,不可以用file://域
于是想到两个思路
1.直接导出一个shell,因为在报错的时候得到了绝对路径(需要写入权限)
2.通过反序列化,请求本地文件获得flag(需要序列化后的字符串)
经过测试发现方法1的权限不够,于是开始查询表的内容
union select 1,2,3,4中,其中2这个点是可以直接输出的,是用户名,于是在这个点直接注入,先找出数据库、表、字段名等信息(可以参考从零开始写安全脚本系列)
得到数据库名 fakebook
得到表名 users
字段名 no,username,data
于是想到在join.php文件的注册中我是输入了密码年龄和博客地址的,分别为passwd,age,blog。推测这三个数据序列化后存放于data中
构造注出一行data用来构造反序列化
通过如上注出的data,构造一下语句访问本地文件
<?php
$flag = "flag{d2b2881c-02d7-417f-ab87-690ee2b9a065}";
exit(0);