变量覆盖

题目界面如下:
第一反应肯定是点进source.php看一眼

<?php if ($_SERVER["REQUEST_METHOD"] == "POST") { ?>
    <?php
    extract($_POST);
    if ($pass == $thepassword_123) { ?>
        <div class="alert alert-success">
            <code><?php echo $theflag; ?></code>
        </div>
    <?php } ?>
<?php } ?>

注意到有extract函数,该函数默认若新的变量与已有变量重名,则已有变量的值被覆盖.因此我们只需要post值相同的pass和thepassword_123即可.

伪装者

要求本地登录,用xff不知道为什么不行,在burp里用client-ip拿到的flag.

SQL注入1

直接给了源码:

<?php
if($_POST[user] && $_POST[pass]) { 
     mysql_connect(SAE_MYSQL_HOST_M . ':' . SAE_MYSQL_PORT,SAE_MYSQL_USER,SAE_MYSQL_PASS);      mysql_select_db(SAE_MYSQL_DB);
     $user = trim($_POST[user]); 
     $pass = md5(trim($_POST[pass])); 
     $sql="select user from ctf where (user='".$user."') and (pw='".$pass."')"; 
         echo '</br>'.$sql; 
     $query = mysql_fetch_array(mysql_query($sql)); 
     if($query[user]=="admin") { 
          echo "<p>Logged in! flag:******************** </p>"; }
     if($query[user] != "admin") {
      echo("<p>You are not admin!</p>"); 
     } 
} 
echo $query[user]; 
?>

阅读源码,在题目的表单第一处填入admin’)# 密码随便填都行,填好后按提交即可.

pass check

源码已给出:

$pass=@$_POST['pass'];
$pass1=***********;//被隐藏起来的密码 
if(isset($pass)) { 
if(@!strcmp($pass,$pass1)){ echo "flag:nctf{*}"; 
}else{ 
    echo "the pass is wrong!"; 
} 
}else{ 
    echo "please input pass!"; 
} 
?>

利用strcmp函数的漏洞,使用strcmp函数比较两个字符串时,若两字符串相等则返回0,但当数组和字符串进行比较时函数也会返回0,而源码告诉我们strcmp返回0时即可获得flag,那我们post一个pass[]过去就可以了.

起名字真难

源码:

<?php 
function noother_says_correct($number)
{ 
           $one = ord('1'); 
           $nine = ord('9'); 
           for ($i = 0; $i < strlen($number); $i++) 
           { 
                      $digit = ord($number{$i}); 
                      if ( ($digit >= $one) && ($digit <= $nine) ) 
                      { 
                                return false;
                      } 
            } 
                return $number == '54975581388'; 
} 
$flag='*******'; 
if(noother_says_correct($_GET['key'])) 
    echo $flag; 
else 
    echo 'access denied'; 
?>

源码要求传入的key值必须和54975581388相等,但是又要求key的每个字符的ascii值都不能在49-57之间,那就考虑通过进制转换来获得flag,2和8进制肯定不可能,于是将54975581388转成16进制,结果为0xccccccccc,令key=0xccccccccc,获得flag.(flag的内容,让我有那么亿点点受鼓舞.)

常规的废话时间:颓废太久了连自己上次写到哪一题都忘记了,跟一条咸鱼一样,罪过罪过.

 

Categories:

Tags:

2 Responses

发表评论

电子邮件地址不会被公开。 必填项已用*标注

闽ICP备19027300号