zoukankan      html  css  js  c++  java
  • 实验吧CTF天网管理系统

    天网你敢来挑战嘛

    格式:ctf{ }

    解题链接: http://ctf5.shiyanbar.com/10/web1/ 

    打开链接后,嗯,光明正大的放出账号密码,肯定是登不进的,查看源代码

    看来是和md5碰撞有关的了,

    PHP在处理哈希字符串时,会利用”!=”或”==”来对哈希值进行比较,
    它把每一个以”0E”开头的哈希值都解释为0,所以如果两个不同的密码经过哈希以后,
    其哈希值都是以”0E”开头的,那么PHP将会认为他们相同,都是0。

    攻击者可以利用这一漏洞,
    通过输入一个经过哈希后以”0E”开头的字符串,即会被PHP解释为0,
    如果数据库中存在这种哈希值以”0E”开头的密码的话,他就可以以这个用户的身份登录进去,
    尽管并没有真正的密码。

    0e开头的md5和原值:
    (加密后值为0)

    s878926199a

    0e545993274517709034328855841020


    s155964671a

    0e342768416822451524974117254469

     我们随便选一个,将用户名改为s878926199a

    将url改为该地址,进入后审计代码

    $unserialize_str = $_POST['password'];  

    $data_unserialize = unserialize($unserialize_str);        #unserialize() 对单一的已序列化的变量进行操作,将其转换回 PHP 的值。

    if($data_unserialize['user'] == '???' && $data_unserialize['pass']=='???') { print_r($flag); }

    伟大的科学家php方言道:成也布尔,败也布尔。 回去吧骚年

    1.需要构造序列化的password填入,代码意思是把post提交的password值经过"反序列化"得到一个数组,
    要求数组里的user和pass都等于某个值时就打印flag。
    2.bool类型的true跟任意字符串可以弱类型相等。因此我们可以构造bool类型的序列化数据 ,无论比较的值是什么,结果都为true。
     
    序列化与反序列化:
    把复杂的数据类型压缩到一个字符串中
    serialize() 把变量和它们的值编码成文本形式
    unserialize() 恢复原先变量
     
    自己实践序列化函数

    从结果可以看出,要构造bool类型的序列化数据经过反序列化后为true,user和password的值应写成  "a:2:{s:4:"user";b:1;s:4:"pass";b:1;}",
    最后我们将该值提交得到flag

     

  • 相关阅读:
    eclips搭建python开发环境
    win7下odoo服务启动又停止解决方法
    ubuntu14.04调节屏幕亮度
    在ubunut下使用pycharm和eclipse进行python远程调试
    读书笔记——乔布斯,做最好的自己,共创式教练
    压力测试工具——Galting
    番茄工作法和Bullet Journal笔记法
    Openstack Swift中间件编写
    《黑客》读书笔记
    用腻了bootstrap的可以试试semantic-ui
  • 原文地址:https://www.cnblogs.com/WhiteHatKevil/p/10228335.html
Copyright © 2011-2022 走看看