본문 바로가기
Hacking/LOS : Lord of SQLInjection

LOS : manticore

by newbie22 2020. 11. 7.

< manticore 문제 모습 >

문제를 보면 id와 pw를 addslashes를 하는 것을 확인할 수 있습니다.

mysql에 대한 지식 기준으로 블라인드 문제인데 코드를 보면 addslahses 전에 쿼리를 실행하지 않습니다.

따라서 sqlite의 escaping이 mysql이랑 다르다는 것을 확인할 수 있습니다.

 

sqlite escaping

 

1. '(싱글 쿼터) 속에서의 escaping

-> 싱글 쿼터 문자만이 escaping이 필요합니다. 그 외 문자는 별도의 escaping은 필요 없습니다.

-> '(싱글 쿼터) escaping : 싱글 쿼터를 두 번 입력하면 됩니다.

-> ex) '"' ==출력==> "  , '''' ==출력==> '

 

2. "(더블 쿼터 속에서의 escaping)

-> 더블 쿼터 문자만이 escaping이 필요합니다. 그 외 문자는 별도의 escaping은 필요 없습니다.

-> "(더블 쿼터) escaping : 더블 쿼터를 두 번 입력하면 됩니다.

-> ex) "'" ==출력==> '  ,  """" ==출력==> "

 

따라서 ?id=' or 1--+- 했을 때 쿼리는 다음과 같습니다.

 

select id from member  where id='\' or 1--+-' and pw ''

 

노란색 : 입력 값 , 빨간색 : 주석처리

 

쿼리를 해석하면 id = \인 데이터가 모든 데이터를 의미합니다. 즉, 첫 데이터가 admin이면 클리어라고 나와야 하지만 했을 때 출력되지 않았습니다. 따라서 첫 데이터가 admin이 아닌 것을 확인할 수 있습니다.

 

따라서 ?id=' or 1 order by 1--+-를 하면 될 거라고 판단하였습니다.

 

< 클리어 >

 

해당 풀이로 풀 수 있는 이유는 db의 데이터가 얼마 없기 때문입니다. (지금까지 푼 문제에서는 보통 2개의 데이터가 존재했습니다. guest랑 admin 두 개)

 

따라서 order by 1을 쉽게 admin이라는 데이터가 나올 수 있을 거라고 생각하였습니다.

 

근데 만약에 db에 데이터가 많고 또는 db가 비어있을 때는 해당 풀이를 풀 수 있습니다. 이런 경우에는 admin이라는 문자열을 넣어야 합니다.

 

하지만 addslashes에 의하여 '(싱글 쿼터)와 "(더블 쿼터)가 필터링되어있습니다. 따라서 admin이라는 문자열을 hex값으로 넣어야 합니다. 

 

그러나 sqlite에서는 hex 표기하는 방법이 0x~~ 가 아닌 hex'~~'로 하여 사용해야 합니다. 따라서 char(97, 100, 109, 105, 110) 식으로 사용하여 문자열을 나타낼 수 있습니다.

 

< 좀 더 안전한 풀이?? >

 

'Hacking > LOS : Lord of SQLInjection' 카테고리의 다른 글

LOS : poltergeist  (0) 2020.11.09
LOS : banshee  (0) 2020.11.08
LOS : chupacabra  (0) 2020.11.06
LOS : cthulhu, death, godzilla, cyclops  (0) 2020.11.05
LOS : alien  (0) 2020.11.04