[SK shieldus Rookies 16기][취약점 진단] 동적진단과 정적진단, 소스코드 진단 실습, 취약점진단 보고서 피드백, 클라우드 진단

Jina·2023년 12월 13일
0

SK shieldus Rookies 16기

목록 보기
37/59
post-custom-banner

1. 모의해킹 vs 취약점진단

정보를 처음부터 알고 공격을 하는가?

모의해킹취약점진단
시나리오 기반취약점 항목 기반
화이트박스 기반 점검블랙박스 기반 점검
Zero Base → 공격수행담당자 정보 요청 → 정보수령 → 공격수행
동적진단소스코드(정적)진단
1개 서비스1개 URL
시간 소요↑(수 개월~수 년까지)상대적으로 시간소요↓

2. 동적진단과 정적진단

  • 동적진단
    • 장점 : 상대적으로 진단 요소기간이 적다.
    • 단점 : 누락의 가능성이 상대적으로 높다.
  • 정적진단
    • 장점 : 보다 Depth있고 상세한 진단이 가능하다.
    • 단점 :
      • 시간이 오래 걸린다.
      • 진단자의 역량에 따라 결과 산출물의 품질이 달라진다. ⇒ 소스코드 방법론(Data Tracing) : 결과물에 대한 편차를 최대한 줄여보고자하는 방법

3. 소스코드 진단

3.1. 진단목적

소스코드를 활용하여 애플리케이션 내 모든 입출력 값에 대에 Data Tracing을 통해 취약점 누락을 최소화 및 상세 취약점 점검을 수행하여 보안 수준을 향상하는데 목적을 둔다.

3.2. 특징

  1. 소스코드 자동화 도구(App Scan/Fortify) 대비 과/오탐비율이 적다. ⇒ 결과보고서 자동으로 나온다.
    수동진단(사람) ⇒ 편차가 큰 결과물이 나온다.
  2. 개발 언어에 구애받지 않고 모든 분석 가능하다. (입출력 Data Tracing)
  3. 취약점 다포인트 리스트 업 방식을 통한 누락 최소화할 수 있다.
  4. 입출력 분석을 통한 상세 서비스 분성이 가능하다.
  5. 진단자의 역량에 따라 산출물 품질이 결정된다.

3.3. 진단과정

  1. 대상 서비스 정보 수집/획득 - 소스코드
  2. 소스코드 기반 환경분석(서비스 분석)
  3. 입출력 트레이싱(분석) - 개발유형 파악
  4. 취약점 분석
  5. 보고서 작성
  6. 취약점 조치 및 이행점검 수행

3.4. 환경분석

  • 서버 유무
  • IP
  • OS
  • WEB
  • WAS
  • DBMS
  • Open Port
  • Default Page
  • Framework
  • Editor - FCKeditor
  • 개발언어
  • Open Source

4. 자동화 솔루션(반자동화)

  • 장점
    • 간편하다.
    • 시간이 적게 든다.
  • 단점
    • 과/오탐 비율이 크다.
    • 솔루션을 잘 이해하고 있는 엔지니어(진단자)가 필요하다.

5. 수동진단

  • 장점
    • 도출한 취약점에 대한 결과가 명확하다.
  • 단점
    • 시간이 오래 걸린다.
    • 진단자에 대한 결과물 품질의 편차가 크다.

6. RAWDATA

6.1. 정의

전달받은 모든 소스 코드를 확인하여 분석할 경우 오래 걸리기 때문에 빠른 시간 내 전체 입출력 데이터를 식별/분석하기 위함

6.2. 목적

  • 개발 유형 파악을 통해 개발자가 의도한 입출력 및 환경 구성을 빠르게 파악하기 위해 고안된 방법
  • 애플리케이션이 가진 모든 입출력 파악하기 위함

6.3. 키워드 추출 방법

초기 키워드 추출 시 넓은 범위의 키워드 검색하기

  • 개발자 코딩 유형 분석 : GET (입력 가져온다), SET(초기화, 변수세팅, 출력), IN(입력), OUT(출력) 등
  • SQL DB 공통 정의 : SELECT / INSERT / UPDATE / DELETE
  • 웹 프레임워크 : MVC 구조 파악 (Model, View, Controller, request, response)

6.5. 소스코드 분석방법

입력 → 입력처리 → DB처리 → 출력처리 → 출력

7. MyBatis

#

  • SQL쿼리문에서 변수나 파라미터 나타냄
  • MyBatis에서 자동으로 JDBCPreparedStatement 매개변수로 바인딩
  • SQL쿼리가 값을 안전하게 처리하고, SQL Injection 공격방지 가능
SELECT * FROM users WHERE id = #{userId}

Prepared Statement의 원리
1. 컴파일
- PreparedStatement를 생성할 때 SQL 쿼리는 먼저 데이터베이스 측에서 컴파일됨.
- SQL 문장 구조를 데이터베이스가 분석→실행계획 준비
2. 파라미터화
- SQL쿼리에 파라미터를 사용하여 값을 넣을 수 있는 형태로 작성
- 여기서 파라미터는 ? 와 같은 Placeholder를 통해 지정됨.
3. 재사용
- 한 번 컴파일된 후 동일한 쿼리를 반복해서 실행할 때 재사용됨.
- 쿼리가 실행될 때마다 파라미터 값만 변경되고 실행 계획은 미리 준비되어 있어 빠른 실행 가능

$

  • SQL쿼리문에서 변수나 파라미터를 삽입하는 역할
  • 단순히 문자열 치환되기 때문에 값이 SQL쿼리문에 직접 들어감
  • 동적쿼리문을 생성하는데 사용 ⇒ 보안에 취약
SELECT * FROM users WHERE id = ${userId}

동적으로 조작한다는 것은 프로그램이 실행되는 동안에 쿼리나 데이터를 변형하거나 조작하는 것을 의미. 외부 입력값이 쿼리에 바로 삽입되어 SQL Injection 같은 보안 취약점 발생할 수 있음.

블랙리스트 검증보다 화이트리스트 검증

8. 정/오탐 판별

실습문제1

String fileName = request.getParameter("P")
BufferedInputStream bis = null
BufferedOutputStream bos = null
FileInputStream fis = null

try{
  response.setHeader("Content Disposition", attachment;filename fileName+";")
  ...
  fis = new FileInputStream ("C:/datas/"+fileName);
  bis = new BufferedInputStream(fis)
  bos = new BufferedOutputStream(response.getOutputStream());
  • 취약점 명 : Directory Traversal(경로순회)
  • 양호/취약 여부 : 취약
  • 양호일 경우 양호 사유 / 취약할 경우 취약 사유 작성 : 파라미터로 받은 fileName을 검증하는 구문이 없다. 뿐만 아니라 XSS도 가능하다.

실습문제2

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "--//mybatis.org//DTD Mapper 3.0//"http://mybatis.org/dtd /mybatis-3-mapper.dtd">
...
<select id="boardSearch" parameterType ="map" resultType="BoardDto">
	select * from tbl_board where title like '%'||#{{keyword}||'%' order by pos asc
</select>
  • 취약점 명 : SQL Injection
  • 양호/취약 여부 : 양호
  • 양호일 경우 양호 사유 / 취약할 경우 취약 사유 작성 : keyword 파라미터를 #을 사용해 바인딩처리했다.

실습문제3

<% String keyword = request.getParameter ("keyword");

keyword = keyword.replaceAll ("&", "&amp;");
keyword = keyword.replaceAll ("<", "&lt;")"
keyword = keyword.replaceAll (">", "&gt;")"
keyword = keyword.replaceAll ("\", "&quot;")"
keyword = keyword.replaceAll ("'", "&#x27;")"
keyword = keyword.replaceAll ("/"", "&#x2F")"
keyword = keyword.replaceAll ("(", "&#x28;")"
keyword = keyword.replaceAll (")", "&#x29;")"

검색어 : <%=keyword%>
  • 취약점 명 : XSS
  • 양호/취약 여부 : 양호
  • 양호일 경우 양호 사유 / 취약할 경우 취약 사유 작성 : <> () '' "" & 가 모두 필터링됐기 때문에

실습문제4

if (FileUploadCtr.PostedFile.ContentType == "image/jpeg")
{
    if (FileUploadCtr.PostedFile.ContentLength < 102400)
    {
        string fn = Path.GetFileName(FileUploadCtr.FileName);
        FileUploadCtr.SaveAs(Server.MapPath("~/") + fn);
        StatusLabel.Text = "Upload status: File uploaded!";
    }
    else
    {
        StatusLabel.Text = "Upload Status: The File has to be less than 100 kb!";
    }
}
else
{
    StatusLabel.Text = "Upload Status: Only JPEG files are accepted!";
}
  • 취약점 명 : 악성 파일 업로드
  • 양호/취약 여부 : 양호
  • 양호일 경우 양호 사유 / 취약할 경우 취약 사유 작성 : 확장자 검증이 없으나 Content type을 검증하기 때문에 악성 파일이 올라가더라도 실행될 수 있는 가능성이 적다.

악성파일 업로드
최선 : 확장자 검증(화이트 리스트 기반)
차선 : Content type / 파일크기 / 파일의 실행권한 제어 / 특수문자 검증

실습문제5

String id = request.getParameter("id");
String bn = request.getParameter("bn");
String rd = request.getParameter("redirect");
if (id.length() > 0) {
    String sql = "select * from customer where customer_id = ? ";
    pstmt = conn.prepareStatement(sql);
    pstmt.setString(1, id);
    rs = pstmt.executeQuery();
    if ("0".equals(rs.getString(1)) && "0".equals(rs.getString(2))) {
        response.sendRedirect(rd);
    }
}
  • 취약점 명 : 리다이렉트 공격 / SQL Injection
  • 양호/취약 여부 : 양호
  • 양호일 경우 양호 사유 / 취약할 경우 취약 사유 작성 :
    리다이렉션될 url에 대한 검증 코드가 없다.
    pstmt.setString으로 파라미터 값을 문자열로서 쿼리문에 넣기 때문에 악성 스크립트가 들어와도 실행될 가능성이 없다.

실습문제6

String gubun = request.getParameter("gubun");
...
String sql = "SELECT * FROM board WHERE b_gubun = '"+gubun+"'";
Connection con = db.getConnection();
Statement stmt = con.createStatement();
ResultSet rs = stmt.excuteQuery(sql);
  • 취약점 명 : SQL Injection
  • 양호/취약 여부 : 취약
  • 양호일 경우 양호 사유 / 취약할 경우 취약 사유 작성 : 인자화된 질의문을 사용하지 않고 있고, Statement를 안전하게 설정하여 사용하지 않았기 때문에 취약하다.

실습문제7

public static void main(String[] args) throws IOException {
    List<String> allowedCommands = new ArrayList<String>();
    allowedCommands.add("calc");
    allowedCommands.add("notepad");
    String cmd = args[0];
    if (!allowedCommands.contains(cmd)) {
        System.err.println("Error");
        return;
    }
    Process ps = null;
    try {
        ps = Runtime.getRuntime().exec(cmd);
    } catch (Exception e) {
        e.printStackTrace();
    }
}
  • 취약점 명 : Command(OS) Injection
  • 양호/취약 여부 : 양호
  • 양호일 경우 양호 사유 / 취약할 경우 취약 사유 작성 : 화이트리스트 기반 배열을 정의하여 Command를 실행하기 때문에 양호하다. But

실습문제8

string file = Request.QueryString["path"];
if(file != null){
	if(file.IndexOf('\\') > -1 || file.IndexOf('/') > -1){
    	Response.Write("Path Traversal Attrack");
    }else{
    	File.Delete(file);
    }
}
  • 취약점 명 : Directory Traversal
  • 양호/취약 여부 : 양호
  • 양호일 경우 양호 사유 / 취약할 경우 취약 사유 작성 : 경로 순회 문자열 \/ 를 검증하기 때문에 양호하다.

실습문제9

<%
	String Param = request.getParameter("param");
    if(param != null){
    	param = param.replaceAll("<script>","");
        param = param.replaceAll("</script>","");
    }
%>
...
<p>제목 : <%=param%></p>
  • 취약점 명 : XSS
  • 양호/취약 여부 : 취약
  • 양호일 경우 양호 사유 / 취약할 경우 취약 사유 작성 : 키워드 필터링

실습문제10

<%@taglibprefix="c" url="http://java.sun.com/jsp/jstl/core"%>
<%@tagliburi="http://java.sun.com/jsp/jstl/functions" prefix="fn"%>
...
<c:out value="${param.name}" escapeXml="false" />
  • 취약점 명 : XSS(Reflected XSS)
  • 양호/취약 여부 : 취약
  • 양호일 경우 양호 사유 / 취약할 경우 취약 사유 작성 : 출력 시 출력값에 대한 필터링을 해주는 escapeXml를 false로 설정했기 때문에

실습문제 11

MultipartRequest
multi = new MultipartRequest (request, sizeLimitsizeLimit," euceuc-kr ",new DefaultFileRenamePolicy());
...
String fileName=multi.getFilesystemName("filename");
...
sql="INSERT INTO board(email, r_num, w_date, pwd, content, re_step, re_num, filename)"+"values(?,0,sysdate(),?,?,?,?,?)";

PreparedStatement pstmt = con.prepareStatement(sql);
pstmt.setString(1, stemail);
pstmt.setString(2, stpwd stpwd);
pstmt.setString(3, stcontent);
pstmt.setStringsetString(4, stre_step step);
pstmt.setStringsetString(5, stre_num );
pstmt.setStringsetString(6, fileName );
pstmt.executeUpdate();
Thumbnail.create(savePath+"/"+fileName, savePath+"/"+"s_"+fileName,150);
  • 취약점 명 : SQL Injection
  • 양호/취약 여부 : 양호
  • 양호일 경우 양호 사유 / 취약할 경우 취약 사유 작성 : PreparedStatement 를 사용하고 있고 파라미터 값을 문자열로서 쿼리문에 넣기 때문에 SQL Injection 공격 구문이 들어와도 실행되지 않는다.

실습문제 12

import java.security
import javax.crypto.Cipher
import javax.crypto.NoSuchPaddingException
public class CryptoUtils{
	public byte[] encrypt(byte[] msg , Key k){
		byte[] rslt = null;
		try {
			Cipher c = Cipher.getInstance ("DES");
			c.init(Cipher.ENCRYPT_MODE, k);
			rslt = c.update(msg);
}
  • 취약점 명 : 취약 암호 알고리즘 사용
  • 양호/취약 여부 : 취약
  • 양호일 경우 양호 사유 / 취약할 경우 취약 사유 작성 : DES(대칭키) → 대칭키 암호 알고리즘 3DES 사용

실습문제 13

import java.util.Random
...
public Static int getRandomValue(int maxValue){
	Random random = new Random(100);
	return random.nextInt(maxValue);
}
public Static String getAuthKey(){
	Random random = new Random()
	String authKey = Integer.toString (random.nextInt());
...
  • 취약점 명 : 취약한 난수 사용
  • 양호/취약 여부 : 취약
  • 양호일 경우 양호 사유 / 취약할 경우 취약 사유 작성 : 인증키를 만든다면 random보다는 SecureRandom을 쓰거나 보안상 안전한 암호화 알고리즘 키를 생성해야한다.

실습문제14

try {
	rd = new BufferedReader(new FileReader(new File(filename)));
} catch(IOException e) {
	e.printStackTrace();
}
  • 취약점 명 : 예외 처리 미흡
  • 양호/취약 여부 : 취약
  • 양호일 경우 양호 사유 / 취약할 경우 취약 사유 작성 : 예외가 발생했을 경우 별도의 에러 페이지 또는 에러 메세지를 나타나게 해야하는데 에러의 발생 근원지를 찾아 단계별로 에러를 출력하는 코드 e.printStackTrace() 를 그대로 노출하고 있다.

실습문제15

@RequestMapping(value = "/modify.do", method = RequestMethod.POST)
public ModelAndView memberModifyProcess(@ModelAttribute("MemberModel") MemberModel memberModel, BindingResult result, HttpServletRequest request, HttpSession session) {
    ModelAndView mav = new ModelAndView();
    String userId = (String) session.getAttribute("userId");
    String password = request.getParameter("oldPUserPw");
    ...
    if(service.modifyMember(memberModel)) {
        mav.setViewName("redirect:/board/list.do");
        session.setAttribute("userName", memberModel.getUserName());
        return mav;
     } else {
        mav.addObject("errCode", 2);
        mav.setViewName("/board/member_modify");
        return mav;
    }
}
  • 취약점 명 : 부적절한 사용자 검증
  • 양호/취약 여부 : 취약
  • 양호일 경우 양호 사유 / 취약할 경우 취약 사유 작성 : 게시글 수정 시 게시글 작성한 사용자와 현재 로그인한 사용자가 일치해야 수정을 할 수 있는데 이 사용자 검증을 하고 있지 않다.

9. 취약점진단 보고서 피드백

  • 공통사항
    • 문제점 작성 시 원인 문제점 영향도 구분지어 작성
    • 1.개요 / 3.1 총병 작성해보기
    • 서식 지키기(글꼴, 이미지 크기, 테두리)
    • 이미지 편집 시 강조 문구/테두리 적용
    • 스크린샷의 경우 PoC 과정이 순차적으로 적용될 수 있도록 한다.
    • 해결방한 작성 시 전반적인 관점에서의 보안 해결방안 설명 후 취약점 게이트 별 상세한(최선/차선 등) 가이드를 한다.
  • CSRF
    최선 : XSS 공격
    차선 : 토큰 검증
  • 문제점 작성 시 명확하게 작성 필요 ⇒ 인증과 권한 체크 혼용X

10. 클라우드 진단

10.1. 정의

클라우드 진단 개념 다양

  • 운영적 관점
  • 취약진단/모의해킹 관점

10.2. 특징

  • laaS(Infrastructure-as-a-Service) 기반 설정 진단
  • 유휴 리소스 점검
  • 클라우드 사용자 권한 적정 여부 점검
  • 클라우드 관리 컨설팅 요소 점검

10.3. 진단과정

  1. 대상 정보 요청
    • 고객사 담당자 협의
    • 클라우드 사용범위 산정
    • 클라우드 진단기간 산정
    • 클라우드 관리계정 발급 요청
  2. 보안진단 수행
    • 플랫봄보안 기술적 진단/관리적 진단
    • 문서(정책 등) 확인
    • 체크리스트 진단 수행
    • 담당자 인터뷰
  3. 담당자 전달
  4. 보고서 작성 및 취약점 리뷰
  5. 취약점 조치 및 이행점검 수행

Security Group VS Network ACL 차이점 및 공통점

  • 공통점 : IP/Port 기반 접근제어
  • 범위
    • Security Group : 인스턴스 기반 IP/Port 접근제어
    • Network ACL : 네트워크 기반 IP/Port 접근제어
profile
공부 기록
post-custom-banner

0개의 댓글