首页 > 编程语言 >java审计-RCE/SSRF

java审计-RCE/SSRF

时间:2023-03-14 15:00:09浏览次数:35  
标签:java SSRF ProcessBuilder exec url new RCE Runtime String

java开发语言中可以执行命令的函数有Runtime.getRuntime.exec和ProcessBuilder.start 

java1.5之前用Runtime.getRuntime.exec   1.5后用ProcessBuilder类构造进程       

1.ProcessBuilder命令执行漏洞

ProcessBuilder执行命令的方式如下:

ProcessBuilder pb = new ProcessBuilder("command","param");

Process process = pb.start();

例如ProcessBuilder执行ls -al命令

public class exec{
public static void main(String[] args ) throws IOException {
    //执行系统命令
    ProcessBuilder p = new ProcessBuilder("ls","-al");
  //ProcessBuilder p = new ProcessBuilder("ping","-t","3",ip); #这里不能用分号链接 127.0.0.1;id 会报错
  //ProcessBuilder p = new ProcessBuilder("bash","-c",exec);  #这里调用了bash才可以链接命令执行
Process pb = p.start(); //获取执行完成命令后的结果并输出 String line; BufferedReader reader = new BufferedReader(new InputStreamReader(pb.getInputStream(),"GBK"));  #缓冲区读取输入流 while((line= reader.readLine())!=null){    #并读取输入流后逐行写入字符串中 System.out.println(line); } reader.close(); } }

tips:直接使用ProcessBuilder进行命令执行的时候是不支持用;号或者&来连接命令一起执行,这些需要使用linux管道之类的功能,必须得使用shell程序来执行

2.Runtime exec 命令执行漏洞

Runtime exec 执行字符串参数和数组参数

Process proc = Runtime.getRuntime(),exec("ping 127.0.0.1");是正常的

当执行 Process proc = Runtime.getRuntime(),exec("ping 127.0.0.1;id")是没有返回值的

因为在exec调用的过程中会对通过StringTokenizer进行处理,它会对传入的字符串进行分割再返回

结论

所以要通过数组类型的传参才能进行多个命令执行

String command ="/bin/sh -c \ "ping -t 3 ip;id \"";   \\exec执行字符串参数

String[] command = { "/bin/sh","-c","ping -t 3 ip;id"}`  \\执行数组参数   

Runtime exec 不以参数的形式来传命令执行
Process proc = Runtime.getRuntime(),exec(cmd);
cmd = sh -c ls ;cat /etc/passwd
#因为stringTokenizer对空格处理拆分导致命令无法执行 可以用${IFS},${IFS}$9等替换空格 cmd = sh -c ls ;cat${IFS}/etc/passwd #修改之后会有以下报错 Invaild character found in the request target . The valid characters are defined in RFC 7230 and RFC 3986 RFC规范中url只允许包含 a-z A-Z 0-9 -_.~ !*'();:@&=+$,/?#[]共84个 因此要进行url编码 修改前:cmd = sh -c ls ;cat${IFS}/etc/passwd 编码后:cmd = sh%20-c%20ls;cat$%7BIFS%7B/etc/passwd

SSRF

ssrf通常出现在社交分享,远程图片下载,图片或文章收藏,转码,通过网址在线翻译,网站采集,从远程服务器请求资源等功能点处

java中的SSRF只支持sun.net.www.protocal下所有的协议 file/ftp/http/https/jar/mailto/netdoc

特别留意能够发起http请求的类和函数

URLConnection

URL

HttpURLConnection

HttpClient

OkHttpClient.newCall.execute

1.urlConnection

String url = request.getParameter("url");
URL u = new URL(url);
URLConnection urlConnection = u.openConnection();    #urlConnection获取资源 BufferedReader in = new BufferedReader(new InputStreaReader(urlConnection.getInputSream()));  #输入流读取urlconnection对象 String inpuLine; StringBuffer html = new StringBuffer(); while((inputLine=in.readLine())!= null){ html.append(inputLine); } in.close(); return html.toString();

2.HttpURLConnection

继承于URLConnection 用于向指定网站发送GET请求与POST请求.

HttpURLConnection httpUrl = (HttpURLConnection)urlConnection;
BufferedReader in = new BufferedReader(new InputStreaReader(urlConnection.getInputSream()));

 3.Request

request与python中的request对象类似,主要用来发http请求

String url = request.getParameter("url");
return Request.Get(url).execute(),returnContent().toString();

4.openStream

通过url对象的openStream()方法,能够得到指定资源的输入流.

String downLoadImgFileName = Files.getNameWithoutExtension(url)+"."+Files.getFileExtension(url);
URL u = new URL(url);
inputStream = u.openStream();//send request
outputStream = response.getOutputStream();
while((length = inputStream.read(bytes))>0){
 outputStream.write(bytes,0,length);

 5.HttpClient

client.execute(httpGet);
BufferedReader rd = new BufferedReader(new InputStreamReader (client.execute(httpdGet).getEntity().getContent()));
StringBuffer result = new StringBuffer();
String line="";
while((line = rd.readLine())!=null) {
result.append(line);
}

 

 

 

标签:java,SSRF,ProcessBuilder,exec,url,new,RCE,Runtime,String
From: https://www.cnblogs.com/lisenMiller/p/17214587.html

相关文章

  • OSCAR Open Source Industry Conference
    2022.9.16国家会议中心为了推动我国开源生态安全合规、可持续发展,中国信通院自2015年筹备国内首个开源联盟,提出“可信开源”理念,通过产业研究、标准评估、企业/项目级开......
  • java 中文繁简体转换工具 opencc4j 使用介绍 1.8.0
    Opencc4jOpencc4j支持中文繁简体转换,考虑到词组级别。在线体验Features特点严格区分「一简对多繁」和「一简对多异」。完全兼容异体字,可以实现动态替换。......
  • [LeetCode] 62. 不同路径 java 动态规划解法
    classSolution{publicintuniquePaths(intm,intn){//确定dp数组以及下标的含义//dp[i][j]:表⽰从(0,0)出发,到(i,j)有dp[i][j]条不同的路径......
  • 剑指 Offer 68 - II. 二叉树的最近公共祖先(java解题)
    (剑指Offer68-II.二叉树的最近公共祖先(java解题))1.题目给定一个二叉树,找到该树中两个指定节点的最近公共祖先。百度百科中最近公共祖先的定义为:“对于有根树T......
  • JAVA字符串格式化-String.format()的使用
    JAVA字符串格式化-String.format()的使用https://blog.csdn.net/lonely_fireworks/article/details/7962171/常规类型的格式化String类的format()方法用于创建格式化的......
  • 【JavaScript】44_DOM编程初步
    1、初识要使用DOM来操作网页,我们需要浏览器至少得先给我一个对象才能去完成各种操作所以浏览器已经为我们提供了一个document对象,它是一个全局变量可以直接使用document代表......
  • JavaScript
    变量:区分大小写,不把一个值保存到新的变量,这个变量就是一次性的(就是丢了这个数据地址)//驼峰命名var变量名;常量:不可改变的值用常量//全部单词大写,用_分割单词 数......
  • Java面向对象
    方法:packagestudy1;publicclassDemo1{ publicstaticvoidmain(String[]args){ //调用方法 doubleaa=sjx(10,2); System.out.println("三角形的面积......
  • java.security.KeyStoreException: problem accessing trust store
    发送邮件,使用了ssl认证,配置了相关代如下: 相同的配置在本地能发送邮件,在测试环境发送出现了下面的异常: 网上找了一些解决办法,说是把\jre\lib\security下的两个jar包......
  • java操作excel文件——POI
    简述在开发者经常会涉及和excel的交互,如将数据库的数据导出到内存中,如将excel的数据导入到内存中。常用的方式有两种——poi和javaexcel,其中常用的是poiPO......