Today I Learned …

[Lord of SQL Injection] 3번 goblin 풀이 본문

Wargame/Lord of SQL Injection

[Lord of SQL Injection] 3번 goblin 풀이

염베리 2021. 12. 3. 23:13

* 워게임 풀이 과정을 기록합니다.


사담

오늘은 간단히 워게임!

 

이전 문제

https://choco4study.tistory.com/50?category=1057097 

 

[Lord of SQL Injection] 2번 cobolt 풀이

* 워게임 풀이 과정을 기록합니다. 사담 백신 2차 때문인지... 너무 피곤하다... 보고서도 써야하는데 큰일...ㅠ 오늘은 정말 간단히!! 2번 문제 cobolt를 다뤄볼까 한다. 이전 문제 https://choco4study.tist

choco4study.tistory.com


3번 문제 goblin 분석

 

 

3번 문제는 다음과 같다.

 

 

preg_match를 살펴보면, 쿼터를 필터링해주고 있음을 알 수 있다.

sql 삽입 시 쿼터를 사용하지 않는 우회 방법을 택해주어야 한다.

 

쿼리문을 보겠다.

$query = "select id from prob_goblin where id='guest' and no={$_GET[no]}"

id가 guest인 동시에 no 조건을 충족하는 레코드를 뽑아옴을 알 수 있다.

 

no의 정체를 알기 위해 no=1을 시도해봤다.

아래처럼 guest 레코드가 정상 fetch된다.

 

 

다음으로는 no=2를 시도해봤다.

아래처럼 아무 결과도 뜨지 않는다.

 

 

guest 레코드의 no는 1임을 짐작할 수 있다.


3번 문제 goblin 풀이

 

 

이 문제를 풀기 위해서는, 논리연산자의 특성을 이용하여 조건절 실행의 우선순위를 조정해주어야한다.

즉, 다음과 같은 형태의 쿼리문을 만들어줄 것이다.

$query = "select id from prob_goblin where (id='guest' and no=2) or id='admin'"

where 조건절을 살펴보면,

 

① id='guest' and no=2

⇒ FALSE

② id='admin'

⇒ id가 admin인 레코드

 

① or ② 의 결과, id가 admin인 레코드를 뽑아오게 된다.

 

이 때,

해당 문제에서는 쿼터가 필터링되고 있으므로 이를 우회하는 방식으로 sql을 삽입해주어야한다.

필터링 우회를 위해 char()을 이용하여 파라미터를 ASCII코드로 전달해준다.

 

admin은 ASCII코드로 다음과 같이 나타낼 수 있다.

 

char(97,100,109,105,110)

 

따라서,

최종 주입할 쿼리문은

 

no=2 or id=char(97,100,109,105,110)

 

엔터를 쳐보면!

 

 

세번째 문제가 풀렸다!

프로필사진
berry
FE Developer, loves React & better DX
Comments