본문 바로가기
작업/Webhacking.kr

webhacking.kr old-27 이해하기

 

 

이번 문제도 SQL INJECTION 이름을 가진 문제입니다.

view-source를 확인해 보겠습니다.

 


소스 코드 분석

 

 

php 코드가 적혀있습니다. $_GET['no']는 텍스트 박스에 입력한 값에 해당합니다.

preg_match()함수를 통해서 $_GET['no']에 입력된 특정한 값을 필터링하는 것을 확인할 수 있습니다.

 

 

필터링되는 문자는 #, select, (, 공백 문자, limit, =, 16진수(0x)입니다.

 

 

문제 유형은 이전에 old-18 페이지의 문제와 유사합니다.

다만, 이번에 입력되는 값이 들어가는 no의 부분이 no=({$_GET['no']}) 형태입니다.

입력한 값이 admin이라면 no=(admin) 형태로 괄호에 들어간 값으로 받아들이는 것입니다.

 

 

old-18 페이지도 SQL INJECTION 문제인데 약간 다르다는 것을 알 수 있습니다.

 

https://zifmfmphantom.tistory.com/82

 

webhacking.kr old-18 이해하기

old-18 페이지는 "SQL INJECTION" 이름을 가지고 있습니다. 아래에 "view-source" 링크가 있습니다. 새 탭을 열고서 링크를 들어갔습니다. 소스코드 분석 색 표시가 되어있는 php 구문이 이번 문제의 핵심입

zifmfmphantom.tistory.com


문제 해결

 

old-18 페이지에서와 같은 preg_match() 필터링을 우회하는 방법이 해결책입니다.

이번 문제에 맞도록 필터링 코드를 만들어 보겠습니다.

 

 

no=({$_GET['no']})이기 때문에 첫 문자인 ' ( ' 값은 건드릴 수 없습니다.

 

 

그렇기 때문에 old-18번 때처럼 바로 필터링 코드를 적용한다면

괄호( )에 갇히기 때문에 or 부분도 통합되는 현상이 발생합니다.

결국 guest가 되는 것입니다.

 

 

그래서 첫 괄호를 무력화시키기 위해서 필터링 코드에 닫는 괄호 )를 포함시킵니다.

 

 

마지막에 들어가 있는 닫는 괄호도 무시해 주어야 합니다.

이것은 입력 마지막에 주석 기호를 추가하면 무력화시킬 수 있습니다.

 

 

필터링이 없다고 가정하고 해답 코드를 만들게 되면

 

0) or no = 2--

 

그러면 결과적으로 no=(0) or no = 2--) 형식이 됩니다.

 

 

앞의 no=(0)은 0의 값만을 확인하기 때문에 뒤의 or 문장과는 별개로 처리됩니다.

이후에 or no = 2는 참이기 때문에(admin 계정이 존재하기 때문에)

데이터베이스에서 2에 해당하는 admin을 불러옵니다. (해결)

 

 

이후 주석 기호(--)에 의해 뒤의 닫는 괄호 )는 주석 처리되어 쓰임이 없어지게 되는 것입니다.

 

 

이제 해당 코드에 필터링을 우회하는 작업을 진행하도록 하겠습니다.

필터링 값에 대한 정보는 아래에 링크로 걸어 놓겠습니다.

 

h232ch.tistory.com/33

 

5. Filtering 우회

=  LIKE, >, <  substr, substring  LEFT, RIGHT, LIKE  주석  #, -- (뒤에 문자하나 필요), ;%00 => 한 줄 주석  /**/ => 여러 줄 주석  #, --과 같은 한 줄 범위 주석 우회  \n (라인피드, %0A)  %20..

h232ch.tistory.com

 

 

시도했을 때 공백 문자를 우회하는 방법으로 %0a를 사용했는데 해결이 되지 않았습니다.

그래서 %09를 사용했습니다.

 

 

필터링에 = 기호가 걸리기 때문에 우회하는 방법으로 like를 사용했습니다.

그리고 주석 기호인 -- 뒤에는 문자가 필요하다고 해서 %09(공백 문자)를 추가했습니다.

 

 

 

그렇게 해서 만든 필터링 코드인

5)%09or%09no%09like%092--%09

 

 

적용해 보겠습니다.

 

 

첫 시도는 텍스트 상자에서 진행합니다.

 

 

 

이후에 URL을 확인하시면 index.php?no= 문장을 확인할 수 있습니다.

 

 

그다음 값으로 5)%09or%09no%09like%092--%09를 다시 입력하고 엔터를 칩니다.

 

 

 

해결되었습니다!

 

 

 

 

'작업 > Webhacking.kr' 카테고리의 다른 글

webhacking.kr old-39 이해하기  (0) 2020.09.06
webhacking.kr old-26 이해하기  (0) 2020.09.06
webhacking.kr old-38 이해하기  (0) 2020.09.03
webhacking.kr old-25 이해하기  (0) 2020.09.03
webhacking.kr old-19 이해하기  (0) 2020.09.02