전체 글: 185개의 글

어플리케이션 취약성 탐지

Posted by nkjok
2018. 8. 23. 18:03 보안 공격 탐지/어플리케이션 취약성 탐지
반응형

HTTP 요청 데이터를 검사하여 웹 어플리케이션의 취약점을 노리는 공격을 탐지/차단


어플리케이션 개발 당시부터 가지고 있는 자체 취약점을 직접 공격하여 이를 통해 웹 기반 공격 등 을 수행. 


공격대상 : 모든 웹 어플리케이션 (워드프레스, 제로보드 등)

공격유형 : 외부 코드 삽입 공격, 버퍼오버플로우 공격

반응형

스캐너/프록시/스팸봇

Posted by nkjok
2018. 8. 23. 17:37 보안 공격 탐지/스캐너.프록시.스팸봇 탐지
반응형

ㅁ 웹 취약점 스캐너

타겟 웹 서버에 존재하는 취약점들을 찾아내어 공격자에게 알려주는 역할을 한다.  따라서 공격자는 이를 이용하여 보다 쉽게 타겟 서버에 공격 할 수 있다.



ㅁ SQL 인젝션 스캐너

운영하는 사이트가 SQL Injection 공격에 대한 취약점이 있는지 자동으로 검사하여 이를 알려 주는 프로그램.



ㅁ 프록시 툴

Request를 받을 서버와 Client의 중간에 위치하여 브라우저 정보를 변조하거나, 

특정 매칭되는 정보가 전송될시에 값을 바꾸어 보낸다거나 할수 있다. 

웹에서 사용되는 많은 Encoding들과 Hash값들을 Encode/Decode해볼수 있고 Request를 만들어서 전송할수 있다. 

(쿠키와 POST/GET 변조 가능)



ㅁ 스팸봇

자동으로 댓글, 게시물 등을 생산하는 프로그램

인터넷 게시판과 소셜미디어에서 일반 사람들의 이메일 주소와 소셜미디어 계정 대량 수집해 사용.

정해진 구조에 맞춰 단어만 바꿔가면서 수백 만개의 댓글을 다발적으로 작성.

반응형

크로스 사이트 스크립트 (XSS)

Posted by nkjok
2018. 8. 23. 16:26 보안 공격 탐지/크로스 사이트 스크립트
반응형

XSS (Cross Site Scripting)

JAVA나 HTML언어 등을 사용하여 악의적인 스크립트를 작성해 특정 웹 브라우저에 심어놓고 불특정 다수에게 공격.


Stored XSS (저장 XSS)

게시글, 쪽지, 댓글 등에 JAVA, HTML언어로 악의적인 코드를 작성하여 공격.

 


예)

게시글

안녕 난 alert라고해.

<script> alert('xss'); </script> 


게시글에 스크립트를 포함해 작성. 해당게시글을 열람한 사용자는 script 코드를 통해 alert() 함수가 실행된다.


스크립트 코드는 열람한 사용자에게 보여지지 않음. 사용자는 공격당한것을 인지하지 못함.


공격의 결과로 피해자 웹 브라우저에서 악성 스크립트를 실행시키거나, 세션을 가로채어 해당 피해자 권한을 획득하거나, 악의적인 웹 사이트로 리다이렉트 시킬 수 있다.


- 쿠키 하이재킹 (Cookie Hijacking)

- 피싱 사이트 유도

- 악성 코드 유포


반응형

i2sec _ 국비 통해 IT 보안기술 수강가능

Posted by nkjok
2018. 8. 23. 15:48 일상/나의 관심 정보
반응형

네이버에 i2sec 검색

부산이 본점

반응형

SQL 인젝션 보고서 -1

Posted by nkjok
2018. 8. 23. 14:02 보안 공격 탐지/SQL인젝션
반응형

IBM에서 만든 온라인 뱅킹 데모 사이트 방문.

http://demo.testfire.net/


로그인 입력창에서

ID : 'or'1'='1'--

PW : 123


로그인 입력창에서

ID : 'or 1=1 --

PW : 123 

로그인성공


ID: admin

PW: password 'or 1=1 --

로그인성공


컴퓨터에서 "1=참", "0=거짓"




SQL 인젝션의  사전적 의미

SQL 삽입(영어SQL Injection, SQL 인젝션, SQL 주입)은 응용 프로그램 보안 상의 허점을 의도적으로 이용해, 악의적인 SQL문을 실행되게 함으로써 데이터베이스를 비정상적으로 조작하는 코드 인젝션 공격 방법이다.

[편집]

다음과 같이 사용자의 아이디와 비밀번호를 확인하고 일치하면 로그인을 하는 PHP 프로그램이 있다고 하자.

$username = $_POST["username"];
$password = $_POST["password"];

$mysqli->query("SELECT * FROM users WHERE username='{$username}' AND password='{$password}'");

위의 코드는 사용자로부터 아이디와 비밀번호를 입받아서 일치하는 행을 선택하고 있다. 하지만 공격자가 만약 유저네임에 admin, 패스워드에 password' OR 1=1 -- 을 입력하면 쿼리문은 아래와 같이 된다.

SELECT * FROM users WHERE username='admin' and password='password' OR 1=1 --'

1=1은 항상 참이므로 이 방법으로 공격자는 비밀번호를 입력하지 않고 로그인할 수 있게 된다.

- 위키백과 인용





1. 개요[편집]

SQL 인젝션(SQL 삽입, SQL 주입으로도 불린다)은 코드 인젝션의 한 기법으로 클라이언트의 입력값을 조작하여 서버의 데이터베이스를 공격할 수 있는 공격방식을 말한다. 주로 사용자가 입력한 데이터를 제대로 필터링, 이스케이핑하지 못했을 경우에 발생한다. 공격이 쉬운 데 비해 파괴력이 어마어마하기 때문에 시큐어 코딩을 하는 개발자라면 가장 먼저 배우게 되는 내용이다. 이러한 injection 계열의 취약점들은 테스트를 통해 발견하기는 힘들지만 스캐닝툴이나 코드 검증절차를 거치면 보통 쉽게 발견되기 때문에 탐지하기는 쉬운 편이다. 보안회사 Imperva가 2012년에 발표한 보고서에 따르면 월평균 4회가량의 SQL 인젝션 공격이 일어난다고 한다. OWASP에서도 수년 동안 인젝션 기법이 보안 위협 1순위로 분류되는 만큼 보안에 각별한 주의가 필요하다.

2. 공격 방법[편집]

2.1. 방법 1[편집]

로그인 폼에 아이디와 비밀번호를 입력하면 입력한 값이 서버로 넘어가고, 데이터베이스를 조회하여 정보가 있다면 로그인에 성공하게 된다. 이때 데이터베이스에 값을 조회하기 위해 사용되는 언어를 SQL이라고 하며 다음과 같이 생겼다고 가정하자.

SELECT user FROM user_table WHERE id='입력한 아이디' AND password='입력한 비밀번호';


여기서는 패스워드를 평문으로 비교하는데 사실 이는 예제를 간단히 하기 위한 거고 실제로 이런 식으로 짜면 개인정보보호법 29조 위반[2]으로 과태료 폭탄을 맞을 수 있다. 패스워드는 반드시 PBKDF2 이상의 보안성을 가지는 해시 함수로 해싱해야 한다.

일반적인 유저라면 이렇게 로그인할 것이다.

아이디:

무냐

비밀번호:

 나무 

SELECT user FROM user_table WHERE id='무냐' AND password='나무';


이때 악의적인 유저가 다음과 같이 입력했다.

아이디:

세피로트

비밀번호:

' OR '1' = '1

SELECT user FROM user_table WHERE id='세피로트' AND password=' ' OR '1' = '1';

비밀번호 입력값과 마지막 구문을 자세히 살펴보자. 따옴표를 올바르게 닫으며 password=' '를 만들어 버림과 동시에 SQL 구문 뒤에 OR '1' = '1'을 붙였다. WHERE 뒤에 있는 구문을 간단히 축약하면 false AND false OR true로 정리할 수 있는데, 논리학에 따르면 AND 연산은 OR보다 연산 우선순위가 빠르기 때문에 해당 구문 전체는 true가 되어 올바른 값으로 판단하고 실행하게 된다. 즉 아이디와 비번을 제대로 매치하지 못했어도 ' OR '1' = '1 구문 때문에 로그인에 성공하게 되는 것이다.

로그인뿐만 아니라 JOIN이나 UNION 같은 구문을 통해 원하는 코드를 실행하게 할 수도 있다.

SQL injection이 되는지는 ' 나 " 를 로그인 창에 넣어서 SQL 에러를 뿜어내는지 확인하면 된다.

Warning: mysql_fetch_array():

Warning: mysql_fetch_assoc():

Warning: mysql_numrows():

Warning: mysql_num_rows():

Warning: mysql_result():

Warning: mysql_preg_match():


보통은 이렇게 나올 것이다.

2.2. 방법 2[편집]

로그인 폼도 결국엔 서버에 요청을 해서 받는 것이다. HTTP 헤더를 보면 응답 헤더에 서버의 종류와 버전이 나온다. Apache 서버는 MySQL 서버, IIS는 MS SQL 같은 방식으로 데이터베이스의 종류를 추측할 수 있다. DB엔진을 알아내서 해당 시스템에 맞는 명령어를 이용해 데이터를 뽑아내거나 할 수 있다.

2.3. 블라인드 SQL 인젝션[편집]

에러 메시지가 정보가 아무런 도움이 되지 않거나 아예 에러 페이지를 보여주지 않을 때 사용한다. 대표적인 기술로는 시간 지연 공격이 있다. 간단하게 몇 초 정도의 time for delay를 이용해 원하는 시간 만큼 데이터베이스가 움직여 준다면 취약하다고 볼 수 있다.

3. 방어 방법[편집]

아마도 XSS와 상당 부분 겹치겠지만 기본적으로 유저에게 받은 값을 직접 SQL로 넘기면 안 된다. 어린애 마냥 주는 대로 다 받아먹으면 안 된다는 뜻이다. 요즘에 쓰이는 거의 모든 데이터베이스 엔진은 유저 입력이 의도치 않은 동작을 하는 걸 방지하는 escape 함수와 prepared statement[3]를 제공한다. prepared statement 자체 내에 escape가 내장돼서 한 겹 감싸진 형태.

또한 DB에 유저별로 접근 권한과 사용 가능한 명령어를 설정하면 최악의 경우에 SQL injection에 성공하였다고 하더라도 그나마 피해를 최소화할 수 있다. 혹자는 SQL injection은 데이터베이스 스키마를 알아야 가능한 공격기법이라고 하지만 그 스키마 자체를 SQL injection으로 알아낼 수가 있다. 그리고 데이터베이스를 변조하려는 게 아니라 파괴하려는 거라면 와일드카드를 사용해서 그냥 싹 다 지워버리는 공격이 가능.

DB엔진별로 문법이 다 다르기 때문에 개발자가 그걸 다 고려해서 코딩하는 방법은 매우 비추천된다. 엔진에서 제공하는 prepared statement를 사용하는 게 최선. escape_string 같은 함수를 사용하면 몇몇 군데에서 빼먹거나 하는 실수로 보안 구멍이 생길 수 있다. 그리고 prepared statement는 사용 전에 일부 컴파일돼서 DB쿼리를 가속시켜주므로 적극적으로 사용하자. 다만 컴파일하는 시간이 있다 보니 변수만 다른 같은 쿼리를 반복적으로 하는 작업에서야 유의미한 속도 향상이 있다.

추천되는 방어법은 클라이언트 측 자바스크립트로 폼 입력값을 한 번 검증하고(이때의 폼 검증은 사용자에게 인젝션 관련 특수문자 사용을 불가능하다고 알리는 용도로 방어방법과는 관련이 없다는 걸 유의), 서버 측은 클라이언트 측 필터가 없다고 가정하고(공격자가 자바스크립트를 꺼버리거나 폼 페이지를 다운받아 마개조하면 그만) 한 번 더 입력값을 필터한다. 이때 정규표현식으로 필터하는게 가장 강력하고 좋다. 그다음 SQL 쿼리로 넘길 때 해당 파라미터를 prepared statement로 입력한다. 다음, 쿼리의 출력값을 한 번 더 필터하고(XSS 공격 방어의 목적이 강하다) 유저에게 전송한다. 이렇게 하면 해당 폼에 대해서는 SQL injection 공격이 완전히 차단된다. 물론 이것이 공격 기법의 전부가 아니므로(스푸핑이나 맨 인 미들 공격, 키 로거등 아직 많다) 정보 유출에 민감한 사이트를 운영할 생각이라면 보안 회사에 컨설팅을 꼭 받아야 한다.

[1] DROP 구문이므로 진짜로 먹히면 차량 등록 데이터베이스 전체가 날아간다.(...)[2] 개인정보처리자는 개인정보가 분실·도난·유출·위조·변조 또는 훼손되지 아니하도록 내부 관리계획 수립, 접속기록 보관 등 대통령령으로 정하는 바에 따라 안전성 확보에 필요한 기술적·관리적 및 물리적 조치를 하여야 한다. (출처: 법제처 국가법령정보센터)[3] 직역하면 '준비된 서술'로, 명령문을 사전에 컴파일한 뒤 변수만 따로 우겨넣는 것이다.- 나무위키 인용


참고 사이트https://blog.lael.be/post/55-   having절 참고
결론- "특정 ID, PW 또는 ID, PW 생략하고 참이다" - 때문에 로그인이 되는 것 같다.

ID: admin

PW: password 'or 1=1 --

위처럼 Login 창에 ID, PW 입력하면 

"SELECT * FROM users WHERE username='admin' and password='password' OR 1=1 --" 쿼리가 날라가게되고 쿼리를 해석하면 username가 admin 그리고 password가 password 또는 참이다 (--를 통해 이하는 주석처리 되므로 유효성이 입증 되는듯)
내가 이해한 내용이 틀릴 수도 있다.


반응형