You cannot see this page without javascript.

메뉴 건너뛰기

WHKorea

보안 개발보안

구피천사 2017.10.31 22:29 조회 수 : 210

입력 데이터 검증 및 표현
보안기능
시간 및 상태
에러처리
코드오류
캡슐화
API 오용 


1. 입력 데이터 검증 및 표현

SQL 삽입 : SQL Injection
경로조작 및 자원 삽입
크로스사이트스크립트: XSS
운영체제 명령어 삽입
위험한 형식 파일 업로드
신뢰되지 않는 URL 주소로 자동 접속 연결 : CSRF
XQuery 삽입
XPath 삽입
LDAP 삽입
크로스사이트 요청 위조
HTTP 응답분할 - http header 에 개행문자 존재, 제거한다
정수 오버플로우
보안기능 결정에 사용되는 부적절한 입력값
메모리 버퍼 오버플로우
포맷 스트링 삽입

2. 보안기능

적절한 인증 없는 중요기능 허용
부적절한 인가
중요한 자원에 대한 잘못된 권한 설정
취약한 암호화 알고리즘 사용 : AES 써라
중요정보 평문저장
중요정보 평문전송
하드코드 된 비밀번호
충분하지 않은 키 길이 사용 : 비대칭키 RAS 2048bit, ECC 160bit, 대칭키 128bit, 해쉬 256bit
적절하지 않은 난수 값 사용
하드코드 된 암호화 키
취약한 비밀번호 허용
사용자 하드다스크에 저장되는 쿠키를 통한 정보노출
주석문 안에 포함된 패스워드 등 시스템 주요정보
솔트 없이 일방향 해시 함수 사용 : slat
무결성 검사 없는 코드 다운로드
반복된 인증시도 제한 기능 부재

3. 시간 및 상태 : 스텍 오버플로어, 경쟁조건

경쟁조건 : 검사시점과 사용시점(TOCTOU)
제어문을 사용하지 않는 재귀함수

4. 에러처리

오류메시지통한 정보노출
오류상황 대응 부재
적절하지 않은 예외처리

5. 코드오류

Null 포인터 역참조
부적절한 자원 해제
해제된 자원 사용
초기화되지 않은 변수 사용

6. 캡슐화

잘못된 세션에 의한 정보 노출
제거되지 않고 남은 디버그 코드
시스템 데이터 정보노출
Public 메소드부터 반환된 Private 배열
Private 배열에 Public 데이터 할당

7. API 오용 (Application Programming Interface)

DNS lookup 에 의존한 보안 결정
취약한 API 사용

 

  • SQL Injection 예방 예제
try
{
String tableName = props.getProperty("jdbc.tableName");
String name = props.getProperty("jdbc.name");
String query = "SELECT * FROM ? WHERE Name= ? ";
stmt = con.prepareStatement(query);
stmt.setString(1, tableName);
stmt.setString(2, name);
rs=stmt.executeQuery();
}
catch (SQLException sqle) {}
finally {}
Blind SQL Injection - substring 을 이용하여 참과 거짓을 구분할수 있는 구문을 만들어 테이터를 알아내는 방법
Mass SQL Injection - 한 번의 공격으로 대량의 DB 값이 변조되어 서비스에 치명적인 악영향을 끼침, cookie 통해 데이터 전달
Union SQL Injection - union 을 입력해서 공격자가 select 문을 붙여서 실행
Code Injection
DLL Injection
Time base SQL Ingection
  • XSS (cross Site Scriptiong)
<%
String id = request.getParameter("id");
if id != null )
{
id = id.replaceAll("<"."&lt");
id = id.replaceAll(">"."&gt");
id = id.replaceAll("&"."&amp");
id = id.replaceAll("""."&quot");
}
else return;
%>
필터 해야되는 테크 
<SCRIPT>
<APPLET>
<OBJECT>
<EMBED>
<FORM>
<IMG>
<IFRAME>
  • XSS
Stored XSS 방식 (Client to Client) : 스크립트를 서버에 저장하고 사용자가 열람시 발생
Reflective XSS (Client to itself) : 공격자가 메일로 링크 정보를 전달하고 링크를 클릭시에 스크립트 실행

CSRF - Cross Site Request Forgery , 크로스 사이트 요청 위조
       사용자가 인식하지 못한 상황에서 의도하지 않은 공격행위를 수행하게 하는 공격
       공격이 사용자를 통해 이루어 지기 때문에 공격자 추적이 불가능
       대응 : 패스워드 변경시 현재 패스워드 추가적으로 입력 받는다.
             세션 값 이외에 CSRF Token 값으로 추가적인 재인증을 자동을 확인
             CAPTCHA 는 특정 이미지를 화면에 보여 주고 해당 이미지의 값을 사용자에게 직업 입력하게 하는것
             입력폼을 POST 방식으로 사용



대응방안 
XSSFilter(); 함수사용
Reflected XSS 반사
CSRF_Token : 사람인지 자동인지
capwha : 이미지로 번호표기 입력확인

 

 

 

1. SQL Injection 공격 대응
입력값(사용자)에 대한 검증을 수행한다
SQL Injection 관련 특수 문자들을 치환한다(php.ini - magic_quotes_gpc=On,
mysql_real_escape_string())
prepared statement 활용 ? , ?
블랙리스트 기반의 필터링을 통해 실행차단

 

 

퍼센트 인코딩, url 인코딩

%3C  -> <
%3D  -> =
%3E  -> >

 

 

한줄 주석
mysql  :  #
oracle  : --
mssql : --

 

select id,pass from member where id='$id';

id='' or 1=1#' (mysql)

id='' or 1=1--' (mssql,oracle)

id='' or 'a'='a'; (모든디비)

 


입력값에 대한 검증
특수문자(',") -> 일반문자로 치환
=> 백슬러시
=> 처리안함
php.ini 파일에 magic_quotes_gpc 설정 (On) : php5.4 이하만해당
mysql_real_escape_string()

prepared statement(선처리 질의문)
? 로 인자값 바인드처리, 쿼리는 미리 컴파일 되서 바뀌지 않고 인자값만 넣는형식

 

Union SQL Injection

쿼리의 결과로 나오는 패스워드를 조작
union select 문

위로