南邮CG-CTF Web记录

MYSQL(利用精度,传参为小数)

robots.txt中的代码:

<?php
if($_GET[id]) {
   mysql_connect(SAE_MYSQL_HOST_M . ':' . SAE_MYSQL_PORT,SAE_MYSQL_USER,SAE_MYSQL_PASS);
  mysql_select_db(SAE_MYSQL_DB);
  $id = intval($_GET[id]);
  $query = @mysql_fetch_array(mysql_query("select content from ctf2 where id='$id'"));
  if ($_GET[id]==1024) {
      echo "<p>no! try again</p>";
  }
  else{
    echo($query[content]);
  }
}
?>

只有传参为1024的时候,不输出查询内容,那么很可能这里就有flag。

怎么保证我们能传进去1024,又能不被检测到,而且在查询的时候使用的又是1024呢?

我们看到有一个intval()函数,它会把其余类型的值转换为整型,且不遵守四舍五入,那么我们就在1024~1025间随便输入一个小数,就能拿到flag了。

 

层层递进

查看源码:

 点击这个S0.html,一直点,最后到404.html。

flag在这:

单身二十年

点击页面中的“_到这里找key__”后,会发现url会跳转两次,先到search_key.php,再到no_key_is_here_forever.php。

no_key_is_here_forever.php这里是没有flag的,抓包抓到search_key.php,在repeater里发包,拿到flag。

php decode

<?php
function CLsI($ZzvSWE) {
 
    $ZzvSWE = gzinflate(base64_decode($ZzvSWE));
 
    for ($i = 0; $i < strlen($ZzvSWE); $i++) {
 
        $ZzvSWE[$i] = chr(ord($ZzvSWE[$i]) - 1);
 
    }
 
    return $ZzvSWE;
 
}
eval(CLsI("+7DnQGFmYVZ+eoGmlg0fd3puUoZ1fkppek1GdVZhQnJSSZq5aUImGNQBAA=="));
?>

把eval改成echo,跑一下就出来了。

/x00(特殊字符要进行url编码)

源码:

    if (isset ($_GET['nctf'])) {
        if (@ereg ("^[1-9]+$", $_GET['nctf']) === FALSE)
            echo '必须输入数字才行';
        else if (strpos ($_GET['nctf'], '#biubiubiu') !== FALSE)   
            die('Flag: '.$flag);
        else
            echo '骚年,继续努力吧啊~';
    }

ereg()函数有漏洞的,%00截断,%00被识别为尾部,对其后面的字符不予理睬。

传递nctf=222%00%23biubiubiu,拿到flag。

file_get_contents

源码:

<!--$file = $_GET['file'];
if(@file_get_contents($file) == "meizijiu"){
    echo $nctf;
}-->

我们要做的就是传递一个内容为meizijiu的文件名,我们并无法知道哪个文件里有这串字符。

这里用到PHP的一个伪协议:php://input,读取post当做输入流

 综合题

打开页面,js编码,解码得1bc29b36f623ba82aaf6724fd3b16718.php,进入该页面没有什么有用信息,抓包得到tip:

 给的提示是history of bash,就是命令行的历史命令呗,访问一下/.bash_history得到:

zip -r flagbak.zip ./*

访问这个压缩文件将其下载,解压得flag。

伪装者

Client-IP伪装成127.0.0.1拿flag。

pass check

贴上代码:

<?php
$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($pass,$pass1),即是strcmp返回值为0,需要上传pass且其值和pass1相等,数组绕过即可,上传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不在字符1~9之间,而且满足$number == '54975581388',传递54975581388的十六进制0xccccccccc即可。

密码重置

进去网页是重置ctfuser 的密码,但题目要求重置admin的密码,抓包,将url传递的参数改成admin的base64,吧post 的user改为admin,密码随意,发包即拿到flag。

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值