chipkkang9's story

[Whois 정보보안교육] Lord of SQLInjection Review 본문

Hacking/Web

[Whois 정보보안교육] Lord of SQLInjection Review

chipkkang 2021. 9. 13. 04:14

los.rubiya.kr

 

whois 정보보안 교육 1주차의 마지막 과제로, 수업시간에 다뤘던 los.rubiya.kr에 있는

세 가지 문제를 정리하고, 어떻게 막을 수 있을지에 대해서 생각해보겠다.

 

우선, 들어가기에 앞서서 수업시간에 배운 SQL Injection 해킹기법을 막는 방법을 정리해보자.

 

 

SQL Injection 해킹 예방법 정리


 

1. Prepared Statement의 사용 (Pre-compiled된 SQL 구문)

 

- 사실상 가장 많이 사용되는 방법으로서,

prepared statement를 미리 컴파일하여 한 덩어리로 묶어두고 사용하는 방법이다.

 

- Prepared statement들은 공격자들로 하여금 쿼리를 변경할 수 없도록 하고,

SQL 명령어들이 새로이 침투할 수도 없게 한다.

 

2. Stored procedure를 사용한다.

 

- 사실상 많이 사용하지 않는다.

그 이유는 이 방법이 항상 SQL Injection에서 안전하지 않기 때문이다.

따라서 생략한다.

 

 

3. 입력값 검증 (Allow-list Input Validation)

 

- SQL 쿼리들의 대부분은 묶여있는 변수들에 사용에 대해서

표의 이름이나 나열, 소트 순서 판별자에 대해서 적절한 위치가 아니다.

 

- 만약 사용자 파라미터 값들이 서로 다른 표의 이름이나 나열을 목적화하기 위해서 사용되었다면,

파라미터 값들은 표나 나열의 이름들을 인가되지 않은 유저의 input을

쿼리로 결정하지 않기 위해서 적절히 위치시켜야만 한다

 

 

4. Escape하기! (Escaping All User-Supplied Input)

 

- 이 기술은 최종 수단으로서, 위의 어떤 방법도 실현 가능성이 없을 때 사용하는 것이다.

 

- 말 그대로, user의 input을 쿼리에 넣기 이전에 빠져나오는 기술을 의미한다.

 

 

5. DB 사용자의 권한 축소 + 사용 가능한 함수의 최소화

 

- 성공적인 SQL Injection의 잠재적인 피해를 최소화하기 위해서,

모든  데이터베이스에 존재하는 계정에 대한 권하는 제한 할당하는 방법이 있을 수 있다.

 

- 또한, 아예 DB에 접근하여 사용가능한 함수도 제한을 걸어버리면 이 또한 같은 맥락에서 방법이 될 수 이다.

 

 

6. ORM 자체 함수의 적극적인 사용

 

- ORM이란, 웹에서 쿼리를 알려주는 것을 자바로 작성해놓는 것을 ORM 기술이라고한다.

 

- 이렇게 작성을 해 놓으면, SQL Injection Attacker의 입장에서도 해석하기 어려울 것이고,

이는 곧 보안상 강화도가 올라간다는 것을 의미한다.

 

 

gremlin 정리


gremlin 문제

gremlin은 문제의 이미지를 보면,

쿼리에 대한 id와 pw를 $_GET 즉, GET Method를 통해서 입력받고 있다.

 

그래서 간단하게, 밑줄 친 부분에 id 파라미터에

?id=' or 1=1 %23

을 입력하면 id는 항상 참값이 되고

그 후는 주석 처리가 되어 문제가 해결될 것이다.

(%23은 #으로, 이후 주석을 의미한다.) 

 

그렇다면 gremlin의 SQL Injection은 어떻게 예방할 수 있을까?

 

아마 밑줄 친 부분을 한 번 컴파일 하는 과정을 통해 한 묶음으로 만들어놓으면,

그 사이에 '를 Injection을 하는 해킹 방법에 대한 우려는 사라질 것이다.

(Prepared Statement를 사용하도록 하자)

 

 

cobolt 정리


cobolt 문제

 

cobolt 문제도 germlin 문제와 마찬가지로, id와 pw를 GET을 통해 입력받고있다.

그리고 아래 밑줄을 보면 id에 받아들인 것이 admin이면 별다른 조건이 없이 문제가 풀리는 것임을 알 수 있다.

 

이는 곧, id만 admin으로 입력해주고 뒤를 주석처리를 해주면 해결일 것이다.

?id=admin'#

이렇게 입력해주면 끝이다.

 

그렇다면 cobolt의 SQL Injection은 어떻게 예방할 수 있을까?

 

이 또한 마찬가지로, where 절을 컴파일함을 통해서 한 덩어리로 묶으면 될 것이라고 생각한다.

 

 

 

goblin 정리


goblin 문제

goblin문제는 특이한 점이 따옴표가 존재하면 에러 메세지가 나온다는 것이다.

 

이를 염두해 두고 아래 밑줄을 보면, no라는 것에 GET을 통해 문자를 입력받는 것을 알 수 있다.

하지만, 앞에 있는 id='guest'를 보면, id를 바꿀 수 없기 때문에 GET을 통해 id에 입력되는 값을 갱신하여 저장해서

'admin'을 넣어주어 맨 아래에 있는 밑줄을 만족시켜야 한다.

 

그러면 문제를 풀어보자.

이론상 이미 GET에는 문자 no가 저장되어 있으므로,

no에 대하며 먼저 정의해주고 id에 대해서 admin으로 저장해주면 해결될 것이다.

 

이때 주의해야할 점은, 따옴표를 쓰면 풀리지 않으므로

Hex나 Binary 인코딩을 이용해서 admin을 바꾸어 넣어주어야 풀린다는 것이다.

 

?no=10 or id=0x61646D696E (Hex 인코딩의 경우)

/ ?no=10 or id=0b011000010110010001101101011010010110111000001010 (Binary 인코딩의 경우)

 

이렇게 넣어주면 문제는 해결이다.

(여기서 왜 no = 1 일때 해결이 되지 않는지는 의문이다.)

 

그렇다면 cobolt의 SQL Injection은 어떻게 예방할 수 있을까?

 

이 문제 역시 마찬가지로 where 이후에 컴파일을 통해 한 덩어리로 묶어버리면 해결할 수 있을 것 같다!

 

 

 

 

출처


https://los.rubiya.kr/gate.php

 

https://los.rubiya.kr/gate.php

 

los.rubiya.kr

CheatSheetSeries/SQL_Injection_Prevention_Cheat_Sheet.md at master · OWASP/CheatSheetSeries · GitHub

 

GitHub - OWASP/CheatSheetSeries: The OWASP Cheat Sheet Series was created to provide a concise collection of high value informat

The OWASP Cheat Sheet Series was created to provide a concise collection of high value information on specific application security topics. - GitHub - OWASP/CheatSheetSeries: The OWASP Cheat Sheet ...

github.com

 

Comments