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

     

  • 相关阅读:
    jsp转向
    什么是 XDoclet?
    tomcat中的几点配置说明
    mysql5问题
    POJ 3734 Blocks
    POJ 2409 Let it Bead
    HDU 1171 Big Event in HDU
    POJ 3046 Ant Counting
    HDU 2082 找单词
    POJ 1286 Necklace of Beads
  • 原文地址:https://www.cnblogs.com/WhiteHatKevil/p/10228335.html
Copyright © 2011-2022 走看看