第五十二题——[0CTF 2016]piapiapia

题目地址:https://buuoj.cn/challenges

解题思路

第一步:进入题目,一个登陆页面,输入语句1'or 1=1#之后报错,尝试注册登录

第二步:了解网页业务流程

  1. 由于没有注册页面,在URL访问register.php进入到注册页面
  2. 注册后给一个超链接让我们去登陆
  3. 登陆后跳转到update页面,让我们输入手机号,邮箱,nikename以及上传一张照片
  4. 上传后给出一个提示,让我们访问profile页面,profile页面展示update输入的信息

第三步:代码审计

  1. 使用dirsearch扫描到www.zip目录,下载下来发现有class,config,index,profile,register,update

  2. 在class.php里面发现需要使用mysql操作

  3. 在config.php里面发现flag字段,但是为空,猜想因该是在mysql里面去查
    在这里插入图片描述

  4. 在profile里面发现photo字段执行了file_get_contents操作,猜想从数据库查了后将flag存放在config,在使用photo获取config.php得到flag
    在这里插入图片描述

  5. 在update里面发现photo就是在上传页面上选择的文件名,并引入了class.php执行函数update_profile,update_profile函数在class.php中执行filter函数,将’select’, ‘insert’, ‘update’, ‘delete’, 'where’字段变成hacker

  6. 可以看到在执行update_profile函数前,还将profile这个类进行了序列化。
    在这里插入图片描述

第四步:构建漏洞

  1. 在第三步得出要让profile这个类的photo值为config.php,而photo的值我们无法指定,但是可以通过序列化之后的过滤函数让photo指向config
  2. 由于filter函数将’select’, ‘insert’, ‘update’, ‘delete’, 'where’字段变成hacker,出了where是五个字符,其他都是与hacker一样是6个字符,由此,可以得出序列化漏洞
  3. 由于profile.php中使用了反序列化,反序列化会按照序列化给的字符串长度读取键名与值,在经过filter函数是where值会变成hacker增加一个字符,导致序列化读取时出错
  4. 原本的序列化是:O:4:"Test":4:{s:5:"phone";i:12345;s:5:"email";s:12:"12345@qq.com";s:8:"nikename";i:123;s:5:"photo";s:4:"xxxx";},而我们想要的是:O:4:"Test":4:{s:5:"phone";i:12345;s:5:"email";s:12:"12345@qq.com";s:8:"nikename";i:123;s:5:"photo";s:10:"config.php";}需要将photo后的值修改,在nikename后面的值输入wherewheres:5:“photo”;s:10:“config.php”;},构成闭合,由于要添加s:5:"photo";s:10:"config.php";}32个字符需要输入33个where,但是update对nikename的长度进行了限制
    在这里插入图片描述
  5. 我们可以让nike变成数组来让过此限制,因为正则在处理数组是返回flase,false>10也会变成false从而绕过
  6. 由于输入了数组,而数组在序列化时增加了一个},所以nikename里面的是";}s:5:“photo”;s:10:“config.php”;}34个字符

第五步:获取flag

  1. 在update使用burpsuite抓包后修改流量包
    在这里插入图片描述

  2. 提交后给出profile超链接
    在这里插入图片描述

  3. 点击后,在img标签中发现base64编码
    在这里插入图片描述

  4. 解码后得到flag
    在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值