Python/2.7 information

일반적이지 않은 HTTP 요청 메소드를 보내는 방법.

qkqhxla1 2014. 8. 10. 13:44

대부분의 사람들이 가장 정상적으로 많이 이용하는 요청 메소드는 GET, POST가 있습니다.

GET방식은 URL끝에 ?보낼데이터=값&보낼데이터2=값2 이런식으로 붙어서 보내지는거고, 

POST는 패킷의 BODY에 전송이 됩니다.

어떻게 전송되는지는 이전글에 다 캡쳐해놨었어요.

 

그런데 워게임 문제를 풀다보면 일반적인 요청 헤더 말고, 일반적이지 않은 요청 메소드로 보내야 할 상황이 생깁니다. 예로 htaccess같은걸로 GET,POST메소드를 막아놓는 경우 우회하는 방법으로 OPTION, PUT메소드같은 요청으로만 바꿔주면 엑세스가 허용되는 경우도 있습니다. 이걸 이용한 워게임문제도 있고요.

binaryU님의 티스토리에 있는 문서를 첨부파일로 올렸습니다. http://binaryu.tistory.com/28 


bypass_apache_web_authorization.pdf


여튼 방법론은 이렇게되고, 직접 보낼줄 알아야겠죠?? httplib모듈을 쓰면 됩니다.

첫번째 포스팅에서 분명히 httplib모듈 안쓴다고 했는데

다른 요청 메소드로 보내려고 urllib2나 urllib을 찾아봤는데 메소드는 GET,POST밖에 못쓴다고 합니다..

메소드 지정은 httplib이나 소켓을 통해서밖에 못하는거 같습니다.... 어쩔수없이 여기서는 httplib을 썼어요...


urllib2과 비교하기 쉽게 똑같이 webhacking.kr의 1번 문제 페이지로 들어가는 코드로 비교하겠습니다

import httplib, urllib, urllib2
# -*- coding: euc-kr -*-
form = urllib.urlencode({'id':'?????','pw':'?????'}) #내가 보낼 로그인용 폼 세팅
req = urllib2.Request('http://webhacking.kr',form) #홈페이지에 로그인 요청을 보낼 준비
res = urllib2.urlopen(req) #요청을 보내고
session = res.headers.get('set-cookie') #세션값만 가져옴.

req = urllib2.Request('http://webhacking.kr/challenge/web/web-01/') #들어갈 페이지 적고
req.add_header('cookie',session) #위에서 가져온 세션값도 세팅
res = urllib2.urlopen(req) #요청을 보냄
print res.read() #받은 내용 출력.



import httplib, urllib, urllib2
# -*- coding: euc-kr -*-
form = urllib.urlencode({'id':'?????','pw':'?????'})
req = urllib2.Request('http://webhacking.kr',form)
res = urllib2.urlopen(req)
session = res.headers.get('set-cookie')

req = httplib.HTTPConnection('webhacking.kr')
req.request('OPTION','/challenge/web/web-01/', form,{'Cookie':session}) #OPTION메소드로 요청하겠다. GET이나 POST가 일반적인데 그냥 OPTION으로 했습니다.
print req.getresponse().read()

​ 

빨간색 부분만 다릅니다. httplib에서는 HTTPConnection으로 연결할 주소.(http연결이기 때문에 앞의 http://는 빼고 사이트주소만 적습니다.)

request에서는 첫번째 인자로 보낼 메소드, 두번째 인자는 요청할 페이지, 세번째 인자는 요청 헤더 관련 세팅입니다. urllib2에서는 add_header로 세션값을 추가해주었는데 httplib에서는 그냥 세번째 인자에 사전 형식으로

인자만 적어주면 됩니다. 세번째 인자는 단순히 위에 예제로 든 Cookie말고도 헤더 정보로 들어가는 리퍼러 정보나 콘텐츠 타입 등 다른 정보도 직접 입력이 가능합니다. httplib에서 첫번째 인자를 일부러 GET이나 POST가 아닌 OPTION으로 줘봤습니다.


되도록 요청 메소드가 GET,POST가 아닌 OPTION이나 PUT등의 메소드가 필요한 경우를 제외하고는

urllib2 쓰는게 안헷갈리고 편합니다... 



15년 7월 4일 추가.

스택오버플로우에서 찾은건데 urllib2로도 PUT등의 메소드를 보낼 수 있다. webhacking.kr 9번을 PUT메소드로 요청보내는 예시.

import urllib2
req = urllib2.Request('http://webhacking.kr/challenge/web/web-09/')
req.add_header('cookie','PHPSESSID=tpjvnmi510scsrqmp0o7fi9k31')
req.get_method = lambda: 'PUT' #PUT메소드로 요청을 보냄.
print urllib2.urlopen(req).read()



'Python > 2.7 information' 카테고리의 다른 글

파이썬 소켓 기본.  (2) 2014.08.10
파이썬 리스트 관련  (0) 2014.08.10
md5, sha1, base64등의 인코딩,디코딩  (2) 2014.08.10
페이지 이동과 요청보내기.  (0) 2014.08.10
파이썬으로 로그인 구현.  (0) 2014.08.10