일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- sampling theory
- Race condition
- 게임개발
- pdlc
- 유스케이스
- dirty cow
- DP
- MLFQ
- MAC
- 운영체제
- ret2libc
- stride
- AINCAA
- linear difference equation
- Double free
- Rr
- dtft
- 배경 그림
- STCF
- 메카님
- Unity #Indie Game
- 게임 개발
- TSet
- DSP
- CTF
- RBAC
- 언리얼엔진
- frequency-domain spectrum analysis
- 유니티
- Security
- Today
- Total
다양한 기록
[모의 해킹] Blind SQL Injection 본문
기본적으로 SQL 인젝션이 무엇인지에 대해 이해가 필요하다.
입력 폼을 받는 곳, 특히 로그인 폼에서 ID 혹은 패스워드를 입력하는 곳에
쿼리를 조작할 수 있게 입력을 하여 데이터베이스에 접근하는 방법이다.
ID 입력 부분에 인젝션을 할 경우 [ " or userid = "admin" # ]으로 작성해서 관리자 아이디를 찾고, 비밀번호 입력은 무시하는 것이 가능하다. 비밀번호 입력 부분에 인젝션을 할 경우 [ " or "1" = "1 ]과 같은 방식으로 항상 참으로 만들어서 비밀번호가 틀려도 접근할 수 있게 만드는 것이 가능하다. 물론 양쪽으로 접근하는 것도 가능하다. ID에서 [ admin"/* ] 패스워드에서 [*/ and "1" = "1] 과 같이 중간에 " and password = 부분을 주석처리해서 없애버리는 것 또한 가능하다.
이러한 테스트를 하기 위해서는 필터링을 어떻게 우회해야 하는지 알아야 한다. 어떻게 우회할 수 있는지 알아보고 풀이를 시작할 것이다. 처음 과제를 시작했을 때는 실습에 필터링이 되어 있는 줄 모르고 우회방법을 알아보지 않아서 많은 시간을 허비하였다. [공백: /**/, (), +, %0b, %0c, %0a, %0a, %09, %0d], [OR : ||], [AND : &&], [=: LIKE] 과 같이 필터링을 우회 가능하다. 혹은 replace 함수를 우회하기 위해 adadminmin, \ 문자를 이용해서 쿼리의 " 를 문자로 인식시키기, ' 가 금지되었다면 " 사용하기, admin 필터링을 16진수값 0x61646D696E로 변경해서 사용하기, 주석 --, #, /**/ 중 금지되지 않은게 있다면 조건 무효화시키기 등의 우회법이 존재한다.
이런식의 다양한 페이로드가 생긴다
이런 식으로 입력 폼이 존재하는데, 실제 입력은 다음과 같다
id - [ admin"/* ]
passwd - [ */and/**/"5"/**/=/**/"5 ]
주석 중 /**/이 필터링 되어 있지 않았다.
다음과 같이 플래그를 얻을 수 있었다.
방어 기법
입력을 받는 것을 그대로 받지 않고, 매개변수에 받은 다음에 그 매개변수의 값을 필터링해야 한다. 동적 쿼리로 사용하지 말고 정적 쿼리를 사용해야 한다는 것이다. 예를 들어 and 나 or 같은 쿼리에서 사용할 법한 단어들은 필터링해야 할 것이다. [ ‘ or “1” = “1 ] 같은 경우, or 라는 단어는 필터링 해야 한다. #, --. /* */와 같은 주석들을 넣지 못하게 하고, admin이라는 단어를 사용하는 것을 막는 등의 대처가 필요하다. 여기에 추가로 우회하는 경우에 대한 대처 또한 필요하다. or 는 ||, admin은 ADmIn 과 같이 대소문자를 바꾸거나 아예 16진수로 0x61646D696E 로 작성해서 우회하는 경우가 있어서 우회하는 경우까지도 고려해야 한다.
필터링을 할 때 함수를 사용하는 경우도 있다. replace같은 함수를 사용해서 admin 같은 중요 단어를 없애버릴 수도 있다. 문제는 단순히 제거하기만 하면 adadminmin 으로 입력하면 ad min 이 되어 결국 admin이 되기에 중간에 의미없는 값으로 대체해버리는 등의 대처를 해 주어야 한다.
ORM(데이터베이스의 데이터를 객체로 다룰 수 있게 해주는 기술)을 사용하면 SQL Injection 방어를 해주는 경우가 많기는 하지만, 그래도 정적 쿼리를 사용해야 한다는 점은 변하지 않는다. 또한 ORM이 전부 알아서 해줄 거라 생각하기보단 필터링 처리를 해줘야 한다. 단순히 하나의 처리만 하고 끝내기보다는 여러가지 대처를 같이 사용해야 더욱 안전하다.
'보안개론' 카테고리의 다른 글
[모의 해킹] 파라미터 위변조 (0) | 2024.12.29 |
---|---|
[모의 해킹] XSS (0) | 2024.12.29 |
암호 기법 정리 (0) | 2024.06.08 |
PT, BBP (0) | 2024.06.08 |
Security Testing (0) | 2024.06.08 |