728x90
package secure.ch03.ex01.controller;
import java.io.IOException;
import java.io.InputStream;
import java.util.Scanner;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller
@RequestMapping("/ch03/ex01/os")
public class OSController {
@RequestMapping(method=RequestMethod.GET)
public void main(){}
@RequestMapping(method=RequestMethod.POST)
@ResponseBody
public String testCommandInjection(HttpServletRequest request, HttpSession session){
String job=request.getParameter("job");
if(job != null && job.equals("type")) {
job = job + " "
+ session.getServletContext().getRealPath("/WEB-INF/views/ch03/ex01/")
+ "hello.txt";
System.out.println("ch03.ex01: " + job);
}
Process process;
String osName = System.getProperty("os.name");
String[] cmd;
if(osName.toLowerCase().startsWith("window")) {
cmd = new String[]{"cmd.exe", "/c", job};
System.out.print("ch03.ex01: ");
for(String s : cmd) System.out.print(s+" ");
System.out.println();
}else cmd = new String[]{"/bin/sh",job};
StringBuffer buffer=new StringBuffer();
try {
process = Runtime.getRuntime().exec(cmd);
InputStream in = process.getInputStream();
Scanner sc = new Scanner(in,"utf-8");
buffer.append("<b>RESULT: </b>");
while(sc.hasNextLine() == true)
buffer.append(sc.nextLine());
}catch(IOException e){
buffer.append("ERROR!");
e.printStackTrace();
}
return buffer.toString();
}
}
/WEB-INF/views/ch03/ex01/hello.txt
Hello, I love You.
/WEB-INF/views/ch03/ex01/os.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<script src="//code.jquery.com/jquery-3.1.1.min.js"></script>
<script>
$(function(){
$("button").bind("click", function() {
var formArr = $("form").serializeArray();
$("#result").empty();
$.ajax({
data: formArr,
method: "post",
success: function(result){
$("#result").append(result);
},
error: function(a, b, errMsg){
$("#result").append(errMsg);
}
});
});
});
</script>
<form>
작업선택:
<select name="job">
<option value="type">-- type hello.txt --</option>
<option value="dir">-- dir --</option>
</select>
<button type="button">제출</button>
</form>
<p id="result"></p>
package secure.ch03.ex02.controller;
import java.io.IOException;
import java.io.InputStream;
import java.util.Scanner;
import javax.servlet.http.HttpSession;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller("ch03.ex02.osController")
@RequestMapping("/ch03/ex02/os")
public class OSController {
@RequestMapping(method=RequestMethod.GET)
public void main(){}
@RequestMapping(method=RequestMethod.POST)
@ResponseBody
public String testCommandInjection(String job, HttpSession session){
String result = "REJECTED.";
String[] allowedCmds = {"type", "dir"};
boolean isAllowed = false;
for(String cmd:allowedCmds) if(cmd.equals(job)) isAllowed = true;
if(isAllowed){
if(job != null && job.equals("type")) {
job = job + " "
+ session.getServletContext().getRealPath("/WEB-INF/views/ch03/ex01/")
+ "hello.txt";
System.out.println("ch03.ex01: " + job);
}
Process process;
String osName = System.getProperty("os.name");
String[] cmd;
if(osName.toLowerCase().startsWith("window")) {
cmd = new String[]{"cmd.exe", "/c", job};
System.out.print("ch03.ex01: ");
for(String s : cmd) System.out.print(s+" ");
System.out.println();
}else cmd = new String[]{"/bin/sh",job};
StringBuffer buffer=new StringBuffer();
try {
process = Runtime.getRuntime().exec(cmd);
InputStream in = process.getInputStream();
Scanner sc = new Scanner(in,"utf-8");
buffer.append("<b>RESULT: </b>");
while(sc.hasNextLine() == true)
buffer.append(sc.nextLine());
}catch(IOException e){
buffer.append("ERROR!");
e.printStackTrace();
}
result = buffer.toString();
}
return result;
}
}
/WEB-INF/views/ch03/ex02/os.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<script src="//code.jquery.com/jquery-3.1.1.min.js"></script>
<script>
$(function(){
$("button").bind("click", function() {
var formArr = $("form").serializeArray();
$("#result").empty();
$.ajax({
data: formArr,
method: "post",
success: function(result){
$("#result").append(result);
},
error: function(a, b, errMsg){
$("#result").append(errMsg);
}
});
});
});
</script>
<form>
작업선택:
<select name="job">
<option value="type">-- type --</option>
<option value="dir">-- dir --</option>
<option value="del">-- del --</option>
</select>
<button type="button">제출</button>
</form>
<p id="result"></p>
728x90
'SKILL > Security' 카테고리의 다른 글
LETSENCRYPT 에서 SSL 인증서를 무료로 발급 받아 웹 서버에 적용하기 (0) | 2018.05.17 |
---|---|
SSL 보안 인증서 발급 - CSR 발급 (0) | 2018.05.17 |
[SPRING] ch04. 로그인 (0) | 2017.09.21 |
[SPRING] ch02. SQL Injection - 방어 (0) | 2017.09.21 |
[SPRING] ch01.SQL Injection - 공격 (0) | 2017.09.21 |
댓글