카테고리 없음

[JAVA] Secure Coding with Sparrow

고로이 2018. 11. 22. 15:26
반응형

Sparrow 사용을 통해 보안 :) 코딩을 하는 법



- 외부에서 들어올 수 있는 입력값은 오염된 값이라 판단하고 입력값 및 출력값 검증필터링을 수행

- 문자열 필터링 사용시 단어는 우회가 가능할 수 있으므로, 한글자씩 처리 하거나 의미 없는 문자 로 변경 replaceAll("<script>", " ");

- 사용자 추가 및 수정시 비밀번호는 영문자 , 숫자 , 특문 들을 최소 2개 이상 조합 하고 최소 자리 수 8자 이상

- 무작위 공격에 대비하기 위해 로그인 연속 실패시 로그인 잠금 , 캡챠 등의 제한 기능 을 추가

- 제어 (권한체크 , 파일업로드, 확장자체크등 )는 클라이언트(Java Script) 단은 무조건 우회가 가능하므로 반드시 서버단에 서 처리

- 404, 500 HTTP 에러 등은 WAS설정 을 통해 에러페이지로 리다이렉트하여 정보 제공 하지 말것

- 저장에 이용하는 해시함수는 반드시 솔트를 적용해야 하며 , 솔트는 사용자마다 다르게 랜덤값 적용

- 파일 업로드 확장자 체크는 화이트 리스트로 검사하며 , 부득이 하게 블랙 리스트로 검사시 , Uppercase, Lowecase 등을 이용 하여 대소문자 조합 확장자 공격을 방지

- 소스코드에 민감한 정보를 넣지 말아야 하며 , JSP 에서 주석사용시 <! -- -- >는 브라우저 소스보기로 확인이 가능하기 때 문에 <% -- -- %> 로 사용




Sparrow Eclipse PlugIn



1. Burp Suite

- 웹 애플리케이션 애플리케이션 동적 테스트 (웹 취약점 진단 )를 수행하기 위해 사용되는 프록시 도구로서 , Paros, OWASP ZAP, SuiteBurp Suite등이 있음

- 프록시 서버 , 웹 스파이더 , 인트루더 등 다양한 도구로 구성

- 프록시 서버 : 웹 어플리케이션에 전송되는 트래픽 (Request, Response) 을 조작할 수 있음

- 웹 스파이더 : 쿠키 정보를 검사하고 페이지에 전달되는 파라미터 정보를





*INTERCEPT ON 

GET /download.do?filepath=/1485.1234.JSP HTTP/1.1



해당 파일패스 부분을 아래와 같이 바꿔준뒤 Forward

../WEB-INF/classes/DBConnection.class




2. JAD

Java 디컴파일러 (Decompiler DecompilerDecompiler Decompiler )

- .class 파일을 .java 파일로 변환

- Java 라이브러리 등 으로부터 소스를 추출하거나 역분석 시 사용


- 커맨드라인 기반으로 동작(exe)

- 디컴파일 결과로 java 파일이 생성됨



ex) 디컴파일 전 DBConnection.java
龕봅   2 ? E F G H
 I J K L M N O P Q P R S T U S V W X Y
  E S Z
  [ \ P ]
 out Ljava/io/PrintStream; 
getColumnName (I)Ljava/lang/String; append -(Ljava/lang/String;)Ljava/lang/StringBuilder; getString toString ()Ljava/lang/String; java/io/PrintStream println (Ljava/lang/String;)V close printStackTrace !          ! "   /    *? ?    #        $        % &    ' ! "  ?   NLMN:? L+? M,? N-? :-? 
? U6? ? C ? 
? /? ? Y? ? ? ? -? ? ? ? ??랫?? +? ? 
:? ,? ,? ? 
:? -? ?? ? ?? ? ?? +? +? ? 
:? ,? ,? ? 
? , - ? , - ? , - ? , - ? , - ? , - , - , - 1 , - E , -   N % &   L . / J 0 1 H 2 3  
D 4 5 6   x  , 7 8 9 : ; <  ? ? E? ? L =L =L =I =S =L =L =I > 7 8 9 : ;  > =L =L =? ? @ "   9    ? Y? ? ?    #   
    8 
 : $        A B    C    D




* 디컴파일 후
// Decompiled by Jad v1.5.8g. Copyright 2001 Pavel Kouznetsov.
// Jad home page: http://www.kpdus.com/jad.html
// Decompiler options: packimports(3) 
// Source File Name:   DBConnection.java

import java.io.PrintStream;
import java.sql.*;

public class DBConnection
{

    public DBConnection()
    {
    }

    public void test()
    {
        Connection conn;
        Statement stmt;
        ResultSet rs;
        String url;
        conn = null;
        stmt = null;
        rs = null;
        url = "jdbc:postgresql://localhost:4440/nest";
        conn = DriverManager.getConnection(url, "root", "1111");
        stmt = conn.createStatement();
        rs = stmt.executeQuery("SELECT * FROM project");
        ResultSetMetaData rsmd = rs.getMetaData();
 



3. WebShell

개요

- 웹 페이지에서 웹 서버로 명령어를 실행하기 위해 만들어진 프로그램

-원격에서 웹 서버에 명령을 수행할 수 있도록 작성한 ASP, PHP, JSP, HTML JSP, HTML 등 웹 스크립트 형태를 가짐

- 웹쉘이 서버에 업로드되어 실행되면 공격자가 서버 명령을 실행가능

- 시스템 정보 파악 , 웹 서버 파일 열람 및 수정 , DB 접속 , 시스템 명령어 수행 등


• Oracle 모든 DB 테이블 정보 조회 : SELECT * FROM USER_TABLES;

• MySQL 모든 DB 테이블 정보 조회 : SHOW TABLES;

• MS -SQL 모든 DB 테이블 정보 조회 : SELECT * FROM information_schema.TABLE_CONSTRAINTS ;

• PostgreSQL 모든 DB 테이블 정보 조회 : select  * from pg_tables  ;



4. Hashtool Kit
http://hashtoolkit.com/

온라인 hash 변환 사이트에서 , 입력한 값은 자동 으로 사전데이터로 등록되기 때문에 , 실제 사용 하는 비밀번호를 온라인사이트에서 hash 로 변경 하지 말것 





SQL injection


ex) 로그인 시 유저에 admin'-- 이라고 입력할 때 true를 반환한다.


*잘못된 예

query = "Select * from " +tableName + " Where name = "+name;

stmt = con.createStatement (query)



*조치 방법

query = "Select * from ? Where name = ? ";

stmt = con.createStatement (query);

stmt.setString(1, tableName);

stmt.setString(2, name);



크로스사이트 스크립트

검증되지 않은 외부 입력 값을 응답의 일부로 사용하는 경우 

사용자 브라우저에서 악의적인 스크립트가 실행될 수 있는 보안약점


쿠키 정보를 탈취, 불법 광고 사이트로 이동



<script> : 스크립트 코드를 실행

<object> : Active-X 컨트롤을 실행

<applet> : 자바 애플릿 실행

<embed> : 객체(동영상, 음악) 등을 포함

<form> : 태그를 사용해 기존 폼을 수정하여 사용자의 민감정보 빼돌림

<img> : 이미지를 브라우저 상에서 로드

<iframe> : 웹문서 내에 특정 페이지를 로드



1. Reflected XSS


2. Stored XSS

<script>alert(1)</script>

<!-- 네이버로 이동 -->

<script>location.href ='http://naver.com'</script>


조치

 - 단어보단 문자열 필터링

 - 주석 공격 방지를 위해 !, - 문자열 필터링

 - 단어들의 문장을 필터링하는 경우 의미없는 문자로 변경


param = param.replaceAll("<script>", "<scr(X)ipt>");



3.신뢰되지 않은 URL주소로 자동 접속 연결



반응형