3단계 고블린에 이어 4단계 orc 풀이를 들어가겠다.
사실 이 문제는 blind injection을 이용해 푸는 문제인데, 나는 잘 몰라서 인터넷의 힘을 빌렸다.
다른 사람들은 blind injection을 쉽게 푸는 프로그램을 파이썬으로 작성하던데 나는 파이썬을 몰라서
노가다로 풀었다.
문제를 푸는데 핵심적인 역할을 하는 쿼리문부터 살펴보겠다.
쿼리문의 조건문을 보면 id='admin'이고, 우리가 임의로 변경할 수 있는 변수인 pw가 있다.
if (($result['pw']) && ($result['pw'] == $_GET['pw'])) solve ("orc");
문제를 해결하려면 데이터베이스에 id가 admin 인 pw값을 우리가 알아야한다.
자, 문제는 그걸 어떻게 알 수 있느냐!
다음 아래의 과정을 천천히 따라가다보면 해결된다.
<이용되는 함수>
1. ascii() : 입력받은 인자를 아스키 코드 10진수로 변환하는 함수
2. length() : 문자열의 길이를 반환한다.
3. substring(문자열, 시작위치, 길이) : 문자열의 시작위치에서 잘라낼 문자 개수를 지정하여 반환하는 함수
ex) substr('1234',2,2)= 23
<비밀번호 유추과정>
1. 패스워드 길이 확인 (length 활용)
- ?pw=9999' or id='admin' and length(pw)=1(길이)%23
- ?pw=9999' or id='admin' and length(pw)=2(길이)%23
- ?pw=9999' or id='admin' and length(pw)=3(길이)%23 ...
id가 admin이고 length가 (길이)인 값을 찾아내는 과정이다.
만약 length의 값이 참이 된다면
이 조건문이 실행될 것이다.
2. 패스워드의 첫번째 글자부터 유추
- 조건: id='admin' and ascii (substr(pw,1,1))> 원하는 숫자
-> id가 admin이고 해당 아이디의 비밀번호 첫번재 글자에서 한 글자를 추출하고
아스키코드 10진수로 변환한 값이 원하는 숫자보다 크다는 구문이다. 이런 식으로 범위를 좁혀나간 이후
-> ?pw=1' or id='admin' and ascii(substr(pw,1,1))=50%23 이런 식으로 pw를 유추해 나간다.
pw의 길이는 8이라는 것을 찾아냈다!
첫 글자는 아스키코드 50.
두번째 글자는 아스키 코드 57.
세번째 글자는 아스키코드 53
네번째 아스키코드 100
다섯번째 아스키코드 53
여섯번째 아스키코드 56
일곱번째 아스키코드 52
여덟번째 아스키코드 52
따라서 char(50,57,53,100,53,56,52,52) -> 295d5844
데이터베이스안에 들어있는 pw값은 295d5844 이다.
'Archive > Hacking' 카테고리의 다른 글
Lord of SQL Injection 6단계, darkelf 풀이 (0) | 2019.10.29 |
---|---|
Lord of SQL Injection 5단계, wolfman 풀이 (0) | 2019.10.29 |
Lord of SQL Injection 3단계, goblin 풀이 (0) | 2019.10.27 |
Lord of SQL Injection 2단계, cobolt 풀이 (0) | 2019.10.27 |
Lord of SQL Injection 1단계, gremlin 풀이 (0) | 2019.10.27 |