이번 문제도 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
문제 해결
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을 불러옵니다. (해결)
이후 주석 기호(--)에 의해 뒤의 닫는 괄호 )는 주석 처리되어 쓰임이 없어지게 되는 것입니다.
이제 해당 코드에 필터링을 우회하는 작업을 진행하도록 하겠습니다.
필터링 값에 대한 정보는 아래에 링크로 걸어 놓겠습니다.
시도했을 때 공백 문자를 우회하는 방법으로 %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 |