진단 도중 SQL Injection을 발견하였다.
나는 파이썬으로 웹 통신을 할때 requests를 많이 사용한다. 이유는 상당히 원초적인데, urllib는 너무 느리기 때문이다.
쿼리의 논리오류도 없고 로직도 간단하게 짜서 복잡할 것이 없는데 이상하게 쿼리가 스크립트가 정상적으로 동작하지 않았다.
패킷을 가만히 보아하니,
burp 상에서 짠 형태는, 아래와 같은 형태로 기본적인 공백 문자를 제외하고는 특수문자를 따로 인코딩 하지 않았다.
keyword=aaa'+and+1=1#
파이썬의 request는 기본적으로 data 변수에 아래와 같이 평문으로 값을 넣어주면, requests 객체가 요청하는 과정에서 자동으로 인코딩을 시켜서 넘겨준다.
data = {
'search_type': 'all',
'keyword': "aaa' and 1=1#",
}
그 결과 값은 이러한 형태를 지닌다.
keyword=aaa%27+and+1%3D1%23
참고로 더블 url 인코딩은, 아래와 같은 코딩으로 구현해도 된다.
data['keyword'] = requests.utils.quote(data['keyword'])
req = requests.post(url,data=data,proxies=proxy,verify=False)
본론으로 넘어와서 요청을 보낼 때 공백('+')을 제외한 특수문자에 대해서는 제대로 해석이 되지 않는 것 같은 느낌이다.
burp에서 aaa'+and+1=1#을 입력하면 정상적으로 쿼리가 실행되고, 파이썬에서 aaa' and 1=1# 을 보내면 모든 특수 문자를 인코딩해서 보내기 때문이다.
어차피 인코딩은 브라우저에서 수행해서 서버에서 이해할 수 있도록 전달해주기 때문에,
burp와 파이썬의 차이는 browser를 거치지 않고 바로 패킷을 구성하였냐, requests라는 유사 브라우저를 거쳐서 패킷을 구성하였냐 이 차이이다.
그래서 내가 입력하는 그대로의 값을 전송할 필요가 있었다.
딕셔너리 데이터 값의 key, value 값 들을 로드하여 각각 k,v 라는 변수에 저장한 후 해당 k,v 변수를 %s=%s 형식으로 만들어준다.
이후 %s=%s 형식으로 만들어진 문자열들을 join() 함수를 이용하여 '&'를 구분자로 삼아 연결시켜준다.
한마디로 data라는 딕셔너리 데이터를 search_type=all&keyword=aaa'+and+1=1# 라는 쿼리스트링 형식으로 변환시키는 것이다.
data = {
'search_type': 'all',
'keyword': "aaa'+and+1=1#",
}
data = "&".join("%s=%s" % (k,v) for k,v in data.items())
req = requests.post(url,data=data,proxies=proxy,verify=False)
urllib를 활용한 방법도 존재한다.
urllib.parse.urlencode() 함수를 사용하면 위와 같이 딕셔너리의 데이터 형식을 쿼리스트링 형식으로 변환이 가능하다. 또한 safe 옵션을 사용하여 인코딩하지 않을 문자를 지정하여 내가 원하는 값의 입력 값으로 데이터를 정제할 수 있다.
(https://docs.python.org/ko/3/library/urllib.parse.html 참조)
data = {
'search_type': 'all',
'keyword': "aaa'+and+1=1#",
}
payload_str = urllib.parse.urlencode(data, safe='#\':()+=')
data = payload_str.encode('utf-8')
req = requests.post(url,data=data,proxies=proxy,verify=False)
참고
'WEB' 카테고리의 다른 글
[Python] 웹 크롤링+텔레그램 메시지 전송(Feat. Iphone 6s 공장초기화) (0) | 2022.10.25 |
---|---|
WEB 프록시 편리하게 잡자(Feat.배치스크립트 + 단축키) (0) | 2022.10.11 |
[SQL Injection] MariaDB(MySQL) Time Based SQL Injection(order by asc) [feat. Python] (0) | 2022.10.08 |