SlideShare uma empresa Scribd logo
1 de 160
How to automate webhacking.kr
with python
How to automate webhacking.kr with Python © 조근영 2015 1
Who are you?
• 조근영, 남자사람
• Python 좋아함
• Data Analysis, TDD, Penetration
Testing, DevOps, Machine Learning,
NLP 관심
• githubgithub
• 파으리썬 운영자euripy
euripy
http://euripy.github.io
github
https://github.com/re4lfl0w/
How to automate webhacking.kr with Python © 조근영 2015 2
Casting
• 리뷰1
1
Hardware Hacking Training Epilogue
How to automate webhacking.kr with Python © 조근영 2015 3
Why?
How to automate webhacking.kr with Python © 조근영 2015 4
헐...
How to automate webhacking.kr with Python © 조근영 2015 5
5000 개...
How to automate webhacking.kr with Python © 조근영 2015 6
일반적인 풀이는 너무 많다!!
좋아? 그렇다면 차별화를 하기 위해서는??
How to automate webhacking.kr with Python © 조근영 2015 7
Python
How to automate webhacking.kr with Python © 조근영 2015 8
Python
How to automate webhacking.kr with Python © 조근영 2015 9
Python
How to automate webhacking.kr with Python © 조근영 2015 10
Python!!
How to automate webhacking.kr with Python © 조근영 2015 11
좋아... Webhacking.kr 사냥하러 가보자
일단 목차를 한 번 봐볼까
How to automate webhacking.kr with Python © 조근영 2015 12
1일차
• 이론 및 실습 준비
• 난이도 하 문제 풀이(자바스크립트, 파라미터 변조)
How to automate webhacking.kr with Python © 조근영 2015 13
2일차
• 난이도 중 문제 풀이(파라미터 변조, XSS 등)
How to automate webhacking.kr with Python © 조근영 2015 14
3일차
• 난이도 중 ~ 상 문제 풀이(SQL Injection)
How to automate webhacking.kr with Python © 조근영 2015 15
자바스크립트
파라미터 변조
XSS
SQL Injection
How to automate webhacking.kr with Python © 조근영 2015 16
책으로는 많이 봤는데 문제 풀이는 많이 해보지 않음
좋아! 도전이다
How to automate webhacking.kr with Python © 조근영 2015 17
Key Point
How to automate webhacking.kr with Python © 조근영 2015 18
Key Point
• 내가 말하고자 하는것은 문제를 마주쳤을 때 어떻게 해결하는지?
How to automate webhacking.kr with Python © 조근영 2015 19
Key Point
• 내가 말하고자 하는것은 문제를 마주쳤을 때 어떻게 해결하는지?
• 암묵지에 있는 사고의 과정을 보여주는데 초점
How to automate webhacking.kr with Python © 조근영 2015 20
Key Point
• 내가 말하고자 하는것은 문제를 마주쳤을 때 어떻게 해결하는지?
• 암묵지에 있는 사고의 과정을 보여주는데 초점
• 결과를 만들어서 대단하지? 라는게 이 슬라이드에서 원하는게 아님
How to automate webhacking.kr with Python © 조근영 2015 21
Key Point
• 내가 말하고자 하는것은 문제를 마주쳤을 때 어떻게 해결하는지?
• 암묵지에 있는 사고의 과정을 보여주는데 초점
• 결과를 만들어서 대단하지? 라는게 이 슬라이드에서 원하는게 아님
• 직관, 의사결정, 상황파악 등을 어떻게 했는지 보여주는게 Point
How to automate webhacking.kr with Python © 조근영 2015 22
자동화에 필요한 순서
1. 로그인
2. 문제 보기
• Highlight 문제
• 정렬 문제
3. 문제 소스 보기
4. 인증하기
How to automate webhacking.kr with Python © 조근영 2015 23
1. 로그인
How to automate webhacking.kr with Python © 조근영 2015 24
webhacking.kr은 로그인이 되어있지 않으면
로그인 페이지로 돌려보냄
How to automate webhacking.kr with Python © 조근영 2015 25
자동화를 하기 위해서는 로그인 정보가 필요함
How to automate webhacking.kr with Python © 조근영 2015 26
로그인 정보를 유지하기 위한 파이썬 라이브러
리가 뭐가 있지?
How to automate webhacking.kr with Python © 조근영 2015 27
Violent Python 에 나온
mechanize를 사용하자2
2
(http://www.yes24.com/24/goods/8433461?scode=032&OzSrank=1)
How to automate webhacking.kr with Python © 조근영 2015 28
로그인
How to automate webhacking.kr with Python © 조근영 2015 29
파라미터 확인
How to automate webhacking.kr with Python © 조근영 2015 30
좋아,
너로 정했다!
How to automate webhacking.kr with Python © 조근영 2015 31
Packet capture login info with wireshark
How to automate webhacking.kr with Python © 조근영 2015 32
아하!
POST method로
id, pw를 인자로 넘기는구나.
How to automate webhacking.kr with Python © 조근영 2015 33
Login Mechanize Source
import mechanize
import urllib
import urlparse
from custom_source.login import id_, pw
login_url = 'http://webhacking.kr/index.html?enter=1'
data = urllib.urlencode({'id':id_, 'pw':pw})
browser = mechanize.Browser()
resp = browser.open(login_url, data).read()
How to automate webhacking.kr with Python © 조근영 2015 34
2. 문제 보기
How to automate webhacking.kr with Python © 조근영 2015 35
No. 15
• 목적: 자바스크립트 소스 확인
How to automate webhacking.kr with Python © 조근영 2015 36
Print source
resp = browser.open(index_url).read()
resp = browser.open(challenge_url).read()
def join_url(url, base_url='http://webhacking.kr'):
if 'view-source:' in url:
url = url.replace('view-source:', '')
if 'webhacking' in url and 'http' not in url:
return '{0}{1}'.format('http://', url)
return urlparse.urljoin(base_url, url)
def print_source(url):
resp = browser.open(join_url(url)).read()
print(resp)
return resp
print_source('challenge/javascript/js2.html')
How to automate webhacking.kr with Python © 조근영 2015 37
print_source output
How to automate webhacking.kr with Python © 조근영 2015 38
print_source output
자 여기에서 어떤 문제점을 느끼셨나요?
How to automate webhacking.kr with Python © 조근영 2015 39
Colorful 하지도 않고,
Syntax Highlight도 안되어 있고,
Python 유저에게는 그저 고난과 역경
How to automate webhacking.kr with Python © 조근영 2015 40
좋아, Syntax Highlight
가 되는 것을 찾아보자!
How to automate webhacking.kr with Python © 조근영 2015 41
Googling!
How to automate webhacking.kr with Python © 조근영 2015 42
Pygments? 뭐지?1
This is the home of Pygments. It is a generic syntax
highlighter suitable for use in code hosting, forums, wikis or
other applications that need to prettify source code.
Highlights are:
• a wide range of over 300 languages and other text formats
is supported
• special attention is paid to details that increase
highlighting quality
How to automate webhacking.kr with Python © 조근영 2015 43
Pygments? 뭐지?2
• support for new languages and formats are added easily;
most languages use a simple regex-based lexing
mechanism
• a number of output formats is available, among them HTML,
RTF, LaTeX and ANSI sequences
• it is usable as a command-line tool and as a library
... and it highlights even Perl 6!
How to automate webhacking.kr with Python © 조근영 2015 44
Pygments Demo
• Pygments Demo
How to automate webhacking.kr with Python © 조근영 2015 45
깔끔한데..?
근데 이걸 어떻게 내 프로젝트에 적용하지?
How to automate webhacking.kr with Python © 조근영 2015 46
처음에는 이해가 안되었다..
How to automate webhacking.kr with Python © 조근영 2015 47
여기저기 구글링 하면서 찾아다니다
어디서 봤는지는 기억이 나지 않지만
예제를 찾았다. 심 봤다!
How to automate webhacking.kr with Python © 조근영 2015 48
적용하기 위한 사전 개념 필요
pygments.highlight(code, lexer, formatter, outfile=None)
• code: 적용하고자 하는 code
• lexer: 어떤 language를 highlight 할 것
인지?(ex: Python, C)
• formatter: 어떤 스타일을 사용할 것인지?
(ex: default, friendly)
• highlight: 최종 적용할 code, lexer,
formatter 구해서 넣어주자!
How to automate webhacking.kr with Python © 조근영 2015 49
Pygments original source
lexer = get_lexer_by_name('html')
formatter = HtmlFormatter(style='default', linenos=False, full=True)
data = highlight(response, lexer, formatter)
HTML(data=data)
• HTML: IPython Notebook에서 HTML을 뿌려주는 역할
How to automate webhacking.kr with Python © 조근영 2015 50
Pygments original output
How to automate webhacking.kr with Python © 조근영 2015 51
오오오...
highlight가 된다.
How to automate webhacking.kr with Python © 조근영 2015 52
근데 아직 정렬이 안됐다.
How to automate webhacking.kr with Python © 조근영 2015 53
근데 아직 정렬이 안됐다.
이제 소스에
정렬해주는 beautifier를 붙여보자
How to automate webhacking.kr with Python © 조근영 2015 54
beautifier 후보군
1. original
2. jsbeautifier
3. beautifulsoup
How to automate webhacking.kr with Python © 조근영 2015 55
jsbeautifier & beautifulsoup
How to automate webhacking.kr with Python © 조근영 2015 56
beautifier 후보군 문제점
1. original: 소스 정렬 안됨
2. jsbeautifier: indent 됨, tag 사이에 space 들어가는 문제점.
• 온라인 Online JavaScript beautifier는 이런 문제점이 없는데 뭐
가 문제일까? issue 올림
3. beautifulsoup: script 안의 소스가 indent가 안됨
How to automate webhacking.kr with Python © 조근영 2015 57
그만 타협하자...
How to automate webhacking.kr with Python © 조근영 2015 58
그만 타협하자...
그나마 html은 제대로 정렬이 되는걸 택하자
3번 beautifulsoup 을 선택하고 문제 풀자!!
How to automate webhacking.kr with Python © 조근영 2015 59
No.15 Source에서
password is off_script
How to automate webhacking.kr with Python © 조근영 2015 60
No.15 Auth
• 문제점이: 인증받기 위해 일일이 입력해야 됨..체크 포인트
How to automate webhacking.kr with Python © 조근영 2015 61
No. 17
• 목적: 자바스크립트 변수 값 확인
How to automate webhacking.kr with Python © 조근영 2015 62
Print Source No. 17
How to automate webhacking.kr with Python © 조근영 2015 63
두둥...
mechanize에서 javascript를 실행할 수 있는가?
How to automate webhacking.kr with Python © 조근영 2015 64
일단 Python 으로 해결해 보자!
unlock = 100*10*10+100/10-10+10+50-9*8+7-6+5-4*3-2*1*10*100*10*10+100/10-10+10+...
print(unlock/10)
# python2
# 999780950
# python3
# 999780930.7
python2와 python3는 division 결과가 다르다.
python2에서 python3와 동일한 결과를 얻기 위해서 추가하자
from __future__ import division
How to automate webhacking.kr with Python © 조근영 2015 65
IPython의 node.js를 실행해서 풀어보자
How to automate webhacking.kr with Python © 조근영 2015 66
헥헥...
어쨌든 Python 으로 해결하긴 했지만
다음에는 어떻게 해결해야 할지...
How to automate webhacking.kr with Python © 조근영 2015 67
No. 14
• 목적: 변수와 함수, onclick() 사용법
How to automate webhacking.kr with Python © 조근영 2015 68
Print Source No.14
resp = print_source('webhacking.kr/challenge/javascript/js1.html')
<html>
...
<form name="pw">
<input type="text" name="input_pwd" />
<input type="button" value="check" onclick="ck()" />
</form>
<script>
function ck()
{
var ul=document.URL;
ul=ul.indexOf(".kr");
ul=ul*30;
if(ul==pw.input_pwd.value) { alert("Password is "+ul*pw.input_pwd.value); }
else { alert("Wrong"); }
}
</script>
</body>
</html>
How to automate webhacking.kr with Python © 조근영 2015 69
Chrome Development Tool & IPython
문제점: DOM에 의해 생성되는 document.URL을 일일이 복붙해야 한다.
즉, DOM을 제어해야 한다.
How to automate webhacking.kr with Python © 조근영 2015 70
털썩...
드디어 DOM이 나왔구나4
어떻게 해결해야 하지?
4
DOM(Document Object Model)
How to automate webhacking.kr with Python © 조근영 2015 71
Document Object Model
HTML과 XML 문서를 위한 API
문서의 구조적 표현을 제공하고, 그 내용과 시각적 표현을 바꾸는 것이 가능
즉 한 마디로, HTML을 지지고 볶을 수 있다!
How to automate webhacking.kr with Python © 조근영 2015 72
자... 현재까지 오면서 어떤 문제점을 느끼셨나요?
How to automate webhacking.kr with Python © 조근영 2015 73
자... 현재까지 오면서 어떤 문제점을 느끼셨나요?
자동화하기 위한 구간이 보이시나요?
How to automate webhacking.kr with Python © 조근영 2015 74
현재까지 나타난 문제점
1. 소스 주소를 한땀한땀 브라우저에서 복붙을 해야한다.
2. javascript를 실행할 수 있는가?
• 실행할 수 있다고 해도 브라우저에 종속적인 상황에서는 어떻게 할
것인가?(ex: DOM)
3. 브라우저에 한땀한땀 복붙을 해서 인증을 한다.
How to automate webhacking.kr with Python © 조근영 2015 75
떡밥 투척
• 시간: 2015년 12월 19일 토요일 오후 3시 ~7시
• 장소: 하이브아레나
• 이런 좋은 장소는 흥해야 되요!
How to automate webhacking.kr with Python © 조근영 2015 76
How to automate webhacking.kr with Python © 조근영 2015 77
Browser Controller
Selenium
How to automate webhacking.kr with Python © 조근영 2015 78
넌 무슨 듣보잡이야?!
How to automate webhacking.kr with Python © 조근영 2015 79
구글이 선택한 Test Framework
How to automate webhacking.kr with Python © 조근영 2015 80
천마디의 말보다 한 번 보는 게 더 낫다
뭐하는 놈인지는 먼저 보고나서 고민
How to automate webhacking.kr with Python © 조근영 2015 81
Demo Time
How to automate webhacking.kr with Python © 조근영 2015 82
Selenium Simple Source
from urllib import quote
from urlparse import urljoin
from time import sleep
from selenium import webdriver
driver = webdriver.Firefox()
google_url = 'https://google.com/'
sleep(5)
driver.get(google_url)
sleep(5)
query = 'python'
search_url = urljoin(google_url, 'search?q={}'.format(quote(query)))
driver.get(search_url)
sleep(10)
driver.quit()
How to automate webhacking.kr with Python © 조근영 2015 83
Why Selenium?1
• Frequent regression testing(자주하는 회귀 테스팅)
• Rapid feedback to developers(개발자에게 빠른 피드백)
• Virtually unlimited iterations of test case execution(가상으로
제한없이 테스트 케이스 실행)
• Support for Agile and extreme development
methodologies(빠른 개발 방법론을 지원)
How to automate webhacking.kr with Python © 조근영 2015 84
Why Selenium?2
• Disciplined documentation of test cases(규격화 된 테스트 케이
스의 문서화)
• Customized defect reporting(개개인의 요구에 맞춘 리포팅)
• Finding defects missed by manual testing(수동 테스트로 생기
는 결함을 찾기)
How to automate webhacking.kr with Python © 조근영 2015 85
말이 굉장히 어렵다...
UI 버그를 빠른 시간내에 잡기 위해서 테스트 한다는 개념으로 보면 됨
사용자 스토리에 따라서 테스트하는 Function Testing에도 사용 됨
난 '그저 자동화 도구'로서의 시각으로 바라봄
How to automate webhacking.kr with Python © 조근영 2015 86
문제점을 다시 한 번 살펴보자.
How to automate webhacking.kr with Python © 조근영 2015 87
현재까지 나타난 문제점
1. 소스 주소를 한땀한땀 브라우저에서 복붙을 해야한다.
2. javascript를 실행할 수 있는가?
• 실행할 수 있다고 해도 브라우저에 종속적인 상황에서는 어떻게 할
것인가?(ex: DOM)
3. 브라우저에 한땀한땀 복붙을 해서 인증을 한다.
How to automate webhacking.kr with Python © 조근영 2015 88
1. 소스 주소 복붙 문제
How to automate webhacking.kr with Python © 조근영 2015 89
브라우저는 어차피 source를 받아와서
How to automate webhacking.kr with Python © 조근영 2015 90
브라우저는 어차피 source를 받아와서
rendering 해주는 것밖에 없잖아?
How to automate webhacking.kr with Python © 조근영 2015 91
브라우저는 어차피 source를 받아와서
rendering 해주는 것밖에 없잖아?
그렇다면 내가 source에서 주소를 얻어오면 되지않나?!
How to automate webhacking.kr with Python © 조근영 2015 92
좋아 고고씽!
How to automate webhacking.kr with Python © 조근영 2015 93
Challenge Page Source
How to automate webhacking.kr with Python © 조근영 2015 94
보이는가?
How to automate webhacking.kr with Python © 조근영 2015 95
보이는가?onclick event로 location.href 함수가 호출된다.
How to automate webhacking.kr with Python © 조근영 2015 96
onclick event
Excute a JavaScript when a button is clicked
<script>
function myFunction() {
document.getElementById("demo").innerHTML = "Hello World";
}
</script>
<button onclick="myFunction()">Click me</button>
Hello World가 출력된다.
How to automate webhacking.kr with Python © 조근영 2015 97
location.href
Return the entire URL(of the current page)
location.href='http://google.com'
이러면 페이지가 구글로 이동한다.
How to automate webhacking.kr with Python © 조근영 2015 98
해석하자면
onclick="location.href='challenge/web/web-01/'"
click event가 발생했을 때
http://webhacking.kr/challenge/web/web-01/ 페이지로 이동한다.
You got it?
How to automate webhacking.kr with Python © 조근영 2015 99
그렇다면...
저 onclick의 속성을 추출한 후에 location.href의 속성을 추출하면
challenge/web/web-01/ 만 얻어진다는 말씀?
How to automate webhacking.kr with Python © 조근영 2015 100
상대주소를 추출하기 위해서는 DOM을 제어해야 되는데
DOM을 어떻게 제어해야 되는거냐?
How to automate webhacking.kr with Python © 조근영 2015 101
XPath
XPath(XML Path Language)는 W3C의 표준으로 확장 생성 언어 문서
의 구조를 통해 경로 위에 지정한 구문을 사용하여 항목을 배치하고 처리하
는 방법을 기술하는 언어이다. XML 표현보다 더 쉽고 약어로 되어 있으며,
XSL 변환(XSLT)과 XML 지시자 언어(XPointer)에 쓰이는 언어이다.
XPath는 XML 문서의 노드를 정의하기 위하여 경로식을 사용하며, 수학
함수와 기타 확장 가능한 표현들이 있다.
How to automate webhacking.kr with Python © 조근영 2015 102
역시 언제나 딱딱한 정의는 어려워..
이해하기 쉽게 example을 보자
How to automate webhacking.kr with Python © 조근영 2015 103
XPath를 활용한 title 추출
How to automate webhacking.kr with Python © 조근영 2015 104
title은 잘 추출이 됐다.
//title은 title tag를
//title/text()는 title의 text만(우리가 원하던 것!)
How to automate webhacking.kr with Python © 조근영 2015 105
마우스로 찍은 XPath
How to automate webhacking.kr with Python © 조근영 2015 106
마우스로 찍은 XPath를 보니 굉장히 어렵게 나타나 있다.
html/body/table/tbody/tr[2]/td/center/center/form/table/tbody/tr[1]/td[1]/input
How to automate webhacking.kr with Python © 조근영 2015 107
마우스로 찍은 XPath를 보니 굉장히 어렵게 나타나 있다.
html/body/table/tbody/tr[2]/td/center/center/form/table/tbody/tr[1]/td[1]/input
이거 가지고 뭔가 추출하기란 굉장히 어려울 것 같다. 너무 specific 해.
큰 틀만 파악하고 변형해보자!
How to automate webhacking.kr with Python © 조근영 2015 108
그렇다면 이제 본격적으로
onclick의 속성을 추출해 보자
How to automate webhacking.kr with Python © 조근영 2015 109
challenge list 추출
How to automate webhacking.kr with Python © 조근영 2015 110
XPath 활용해서
onclick 속성 추출
의도치않게 ID가 선택이 된다. 이런것을 잘 처리해 주자.
How to automate webhacking.kr with Python © 조근영 2015 111
문제들의 input tag만 선
택됨
webhacking.kr의 총 문제수는 66문제다.
하지만 ID값이 제일 처음에 포함되기 때문에
67개의 노드가 추출된 것을 확인 가능
How to automate webhacking.kr with Python © 조근영 2015 112
문제의 tag들을 추출했다..!!
How to automate webhacking.kr with Python © 조근영 2015 113
다들 알고 있겠지만 그래도 확인하는 차원에서
Tag와 Attribute와의 차이점을 알고가자
How to automate webhacking.kr with Python © 조근영 2015 114
Tag & Attribute 차이점
Tag: form, table, tbody, tr, td
Attribute: type, onclick, style, background, color, onmouseout,
onmouseover
How to automate webhacking.kr with Python © 조근영 2015 115
@를 붙여주면 Attribute
접근 가능
//form/table/tbody/tr/td/input/@onclick
실은 나도 Attribute 추출하는
것을 발표 준비하면서 깨달았다.
역시 발표하는건 발표자에게 더 도
움이 되는 일
How to automate webhacking.kr with Python © 조근영 2015 116
그럼 이제 source단에서 Parsing이
가능하므로 복붙을 하지 않아도 된다.
How to automate webhacking.kr with Python © 조근영 2015 117
현재까지 나타난 문제점
1. 소스 주소를 한땀한땀 브라우저에서 복붙을 해야한다.
2. javascript를 실행할 수 있는가?
• 실행할 수 있다고 해도 브라우저에 종속적인 상황에서는 어떻게 할
것인가?(ex: DOM)
3. 브라우저에 한땀한땀 복붙을 해서 인증을 한다.
How to automate webhacking.kr with Python © 조근영 2015 118
그럼 이제 어느 정도 준비가 끝난것 같다.
Selenium 으로 로그인부터 다시!
How to automate webhacking.kr with Python © 조근영 2015 119
로그인 구현은 mechanize로 해봤는데
Selenium은 다른 방식이다.
How to automate webhacking.kr with Python © 조근영 2015 120
Selenium은 우리가 일반적으로 Browser를
사용하는 방식과 똑같이 사용하면 된다.
How to automate webhacking.kr with Python © 조근영 2015 121
Login Logic1. Connect Login Webpage
How to automate webhacking.kr with Python © 조근영 2015 122
Login Logic1. Connect Login Webpage
2. Input ID
How to automate webhacking.kr with Python © 조근영 2015 123
Login Logic1. Connect Login Webpage
2. Input ID
3. Input PW
How to automate webhacking.kr with Python © 조근영 2015 124
Login Logic1. Connect Login Webpage
2. Input ID
3. Input PW
4. Click Login button
How to automate webhacking.kr with Python © 조근영 2015 125
webhacking.kr Login Analysis
<form method="post" action="index.html?enter=1"
name="lf" onkeypress="if(event.keyCode==13)go();">
</form>
function go()
{
if(lf.id.value=="") { lf.id.focus(); return; }
if(lf.pw.value=="") { lf.pw.focus(); return; }
lf.submit();
}
How to automate webhacking.kr with Python © 조근영 2015 126
webhacking.kr Login Analysis
<form method="post" action="index.html?enter=1"
name="lf" onkeypress="if(event.keyCode==13)go();">
</form>
function go()
{
if(lf.id.value=="") { lf.id.focus(); return; }
if(lf.pw.value=="") { lf.pw.focus(); return; }
lf.submit();
}
로그인 하려면 javascript를 써야되네?!
How to automate webhacking.kr with Python © 조근영 2015 127
필요한 함수들 먼저 Import
# built-in
import urllib
import urlparse
import re
import time
# third-party
import jsbeautifier
import mechanize
from selenium import webdriver
from BeautifulSoup import BeautifulSoup as bs
from pygments import highlight
from pygments.lexers import get_lexer_by_name
from pygments.formatters.html import HtmlFormatter
from IPython.display import HTML
# custom
from custom_source.login import id_, pw
login_url = 'http://webhacking.kr/index.html?enter=1'
index_url = 'http://webhacking.kr/index.php'
challenge_url = 'http://webhacking.kr/index.php?mode=challenge'
auth_url = 'http://webhacking.kr/index.php?mode=auth'
How to automate webhacking.kr with Python © 조근영 2015 128
Login 구현 Source
from urllib import quote
from urlparse import urljoin
from time import sleep
from selenium import webdriver
WAIT = 1
driver = webdriver.Firefox()
sleep(WAIT)
driver.get(login_url)
sleep(WAIT)
sleep(WAIT)
driver.find_element_by_name('id').send_keys(id_)
driver.find_element_by_name('pw').send_keys(pw)
driver.execute_script('go();') # javascript 실행해서 로그인!
sleep(10)
driver.quit()
How to automate webhacking.kr with Python © 조근영 2015 129
Demo Time
How to automate webhacking.kr with Python © 조근영 2015 130
Login 구현하면서 javascript 문제까지 해결!!
How to automate webhacking.kr with Python © 조근영 2015 131
현재까지 나타난 문제점
1. 소스 주소를 한땀한땀 브라우저에서 복붙을 해야한다.
2. javascript를 실행할 수 있는가?
• 실행할 수 있다고 해도 브라우저에 종속적인 상황에서는 어떻게 할
것인가?(ex: DOM)
3. 브라우저에 한땀한땀 복붙을 해서 인증을 한다.
How to automate webhacking.kr with Python © 조근영 2015 132
이제 인증만 해결하면 된다!
How to automate webhacking.kr with Python © 조근영 2015 133
Auth Analysis
<form method="post" action="?mode=auth_go">
<table>
<tbody>
<tr>
<td>Flag</td>
<td>
<input type="text" name="answer" size="100">
</td>
</tr>
<tr>
<td colspan="2" align="center">
<input type="submit" value="Submit">
<br><br>
Do not brute-force
</td>
</tr>
</tbody>
</table>
</form>
How to automate webhacking.kr with Python © 조근영 2015 134
Auth 구현 Source
sleep(WAIT)
driver.get(auth_url)
sleep(WAIT)
sleep(WAIT)
answer = 'off_script'
driver.find_element_by_name('answer').send_keys(answer) # name으로도 선택 가능
# css selector로도 선택 가능
driver.find_elements_by_css_selector('form table tbody tr td input')[-1].click()
sleep(WAIT)
sleep(10)
driver.switch_to.alert.accept() # 중요! alert창 없애줘야 한다!
sleep(10)
How to automate webhacking.kr with Python © 조근영 2015 135
Demo Time
How to automate webhacking.kr with Python © 조근영 2015 136
현재까지 나타난 문제점
1. 소스 주소를 한땀한땀 브라우저에서 복붙을 해야한다.
2. javascript를 실행할 수 있는가?
• 실행할 수 있다고 해도 브라우저에 종속적인 상황에서는 어떻게 할
것인가?(ex: DOM)
3. 브라우저에 한땀한땀 복붙을 해서 인증을 한다.
How to automate webhacking.kr with Python © 조근영 2015 137
후...
드디어 문제점을 모두 해결했다.
How to automate webhacking.kr with Python © 조근영 2015 138
일단 문제점은 해결됐지만
How to automate webhacking.kr with Python © 조근영 2015 139
일단 문제점은 해결됐지만
재사용하기 편한 클래스로 변환해야 한다.
How to automate webhacking.kr with Python © 조근영 2015 140
일단 문제점은 해결됐지만
재사용하기 편한 클래스로 변환해야 한다.
Refactoring의 시간
How to automate webhacking.kr with Python © 조근영 2015 141
Refactoring
1. login: login 구현. 사용자 id, pw 입력
How to automate webhacking.kr with Python © 조근영 2015 142
Refactoring
1. login: login 구현. 사용자 id, pw 입력
2. view_challenge: challenge.html 을 파싱해서 문제들 주소 추출
How to automate webhacking.kr with Python © 조근영 2015 143
Refactoring
1. login: login 구현. 사용자 id, pw 입력
2. view_challenge: challenge.html 을 파싱해서 문제들 주소 추출
3. print_problem_source: 소스 출력
How to automate webhacking.kr with Python © 조근영 2015 144
Refactoring
1. login: login 구현. 사용자 id, pw 입력
2. view_challenge: challenge.html 을 파싱해서 문제들 주소 추출
3. print_problem_source: 소스 출력
4. print_index_phps: 문제 페이지 안의 소스 출력
How to automate webhacking.kr with Python © 조근영 2015 145
Refactoring
1. login: login 구현. 사용자 id, pw 입력
2. view_challenge: challenge.html 을 파싱해서 문제들 주소 추출
3. print_problem_source: 소스 출력
4. print_index_phps: 문제 페이지 안의 소스 출력
5. auth: 인증 페이지
How to automate webhacking.kr with Python © 조근영 2015 146
Refactoring
1. login: login 구현. 사용자 id, pw 입력
2. view_challenge: challenge.html 을 파싱해서 문제들 주소 추출
3. print_problem_source: 소스 출력
4. print_index_phps: 문제 페이지 안의 소스 출력
5. auth: 인증 페이지
6. accept_alert: 인증 페이지에서 확인 버튼 클릭하기
How to automate webhacking.kr with Python © 조근영 2015 147
Class & Methods
class webHacking(object):
def __init__(self):
def __del__(self):
def login(self):
def view_challenge(self):
def print_problem_source(self, num):
def print_index_phps(self, src='index.phps'):
def auth(self, answer):
def accept_alert(self):
How to automate webhacking.kr with Python © 조근영 2015 148
Mechanize 푹 쉬어!
How to automate webhacking.kr with Python © 조근영 2015 149
근데 느꼈나..?
How to automate webhacking.kr with Python © 조근영 2015 150
처음부터 저렇게 짜임새있는 구조가 나온건 아니야.
삽질 하다보니까 저렇게 하면 편할것 같아서 나온 구조..
How to automate webhacking.kr with Python © 조근영 2015 151
즉, 생각의 산물
더 알고 싶으신 분은 Refactoring 참고
How to automate webhacking.kr with Python © 조근영 2015 152
Demo Time
How to automate webhacking.kr with Python © 조근영 2015 153
내가 공부한 Resources
1. Selenium with Python
2. Selenium Testing Tools Cookbook
How to automate webhacking.kr with Python © 조근영 2015 154
포켓몬 사진 출처
포켓몬스터 베스트위시 시즌2 23화 사토시 대 코테츠! 비밀병기 사잔드
라!! 리뷰
포켓몬스터 베스트위시 시즌2 24화 결착 잇슈리그!
How to automate webhacking.kr with Python © 조근영 2015 155
포켓몬 모티브
덕들은 성장하는 게임을 좋아하잖아?ㅎㅎ
그리고 생각의 흐름을 표현해주는 문서가 그렇게 많지 않더라고
1차 감수는 애자일 과정을 진행하시는 김창준님께!
How to automate webhacking.kr with Python © 조근영 2015 156
사전 지식
• 이 지식이 없으면 엄청난 삽질 동반함!
• virtualenv
• pip
• HTTP, CSS, JS
• 웹 서버 구조
How to automate webhacking.kr with Python © 조근영 2015 157
나중에 추가할 내용들
• print_problem_source, print_index_phps 설명(ppt 만드는 시간
이 꽤 많이 든다. 40시간 정도 쓴듯.)
• Proxy 적용해서 파라미터 변조(이게 제일 감이 안 잡힘)
• 어쩔 수 없이 Fiddler나 Burp Suite를 써야할듯
• XSS
• SQL Injection
• sqlmap
How to automate webhacking.kr with Python © 조근영 2015 158
감사합니다
How to automate webhacking.kr with Python © 조근영 2015 159
Q&AHow to automate webhacking.kr with Python © 조근영 2015 160

Mais conteúdo relacionado

Destaque

파이썬 튜토리얼 (Python tutorial)
파이썬 튜토리얼 (Python tutorial)파이썬 튜토리얼 (Python tutorial)
파이썬 튜토리얼 (Python tutorial)민지 김
 
파이썬 반복자 생성자 이해하기
파이썬 반복자 생성자 이해하기파이썬 반복자 생성자 이해하기
파이썬 반복자 생성자 이해하기Yong Joon Moon
 
Dark Circle - Translation : The cool way to contribute to F/OSS #2(우분투와 번역 이야...
Dark Circle - Translation : The cool way to contribute to F/OSS #2(우분투와 번역 이야...Dark Circle - Translation : The cool way to contribute to F/OSS #2(우분투와 번역 이야...
Dark Circle - Translation : The cool way to contribute to F/OSS #2(우분투와 번역 이야...Ubuntu Korea Community
 
Python 내장 함수
Python 내장 함수Python 내장 함수
Python 내장 함수용 최
 
파이썬 라이브러리로 쉽게 시작하는 데이터 분석
파이썬 라이브러리로 쉽게 시작하는 데이터 분석파이썬 라이브러리로 쉽게 시작하는 데이터 분석
파이썬 라이브러리로 쉽게 시작하는 데이터 분석Heekyung Yoon
 
141103 최창원 파이썬 확장 프로그래밍
141103 최창원 파이썬 확장 프로그래밍141103 최창원 파이썬 확장 프로그래밍
141103 최창원 파이썬 확장 프로그래밍Changwon Choe
 
Character Encoding in python
Character Encoding in pythonCharacter Encoding in python
Character Encoding in pythondaesung7kang
 
병렬 프로그래밍
병렬 프로그래밍병렬 프로그래밍
병렬 프로그래밍준혁 이
 
라즈베리파이 와 스카이로버 나노에 만남
라즈베리파이 와 스카이로버 나노에 만남라즈베리파이 와 스카이로버 나노에 만남
라즈베리파이 와 스카이로버 나노에 만남Jae Sang Lee
 
병렬 프로그래밍 패러다임
병렬 프로그래밍 패러다임병렬 프로그래밍 패러다임
병렬 프로그래밍 패러다임codenavy
 
Python의 계산성능 향상을 위해 Fortran, C, CUDA-C, OpenCL-C 코드들과 연동하기
Python의 계산성능 향상을 위해 Fortran, C, CUDA-C, OpenCL-C 코드들과 연동하기Python의 계산성능 향상을 위해 Fortran, C, CUDA-C, OpenCL-C 코드들과 연동하기
Python의 계산성능 향상을 위해 Fortran, C, CUDA-C, OpenCL-C 코드들과 연동하기Ki-Hwan Kim
 
Java와 Python의 만남: Jython과 Sikuli
Java와 Python의 만남: Jython과 SikuliJava와 Python의 만남: Jython과 Sikuli
Java와 Python의 만남: Jython과 Sikuli용 최
 
병렬프로그래밍과 Cuda
병렬프로그래밍과 Cuda병렬프로그래밍과 Cuda
병렬프로그래밍과 CudaSeok-joon Yun
 
Python korea(emacs)
Python korea(emacs)Python korea(emacs)
Python korea(emacs)Johnny Cho
 
PyCon 12월 세미나 - 실전 파이썬 프로그래밍 책 홍보
PyCon 12월 세미나 - 실전 파이썬 프로그래밍 책 홍보PyCon 12월 세미나 - 실전 파이썬 프로그래밍 책 홍보
PyCon 12월 세미나 - 실전 파이썬 프로그래밍 책 홍보Young Hoo Kim
 
파이썬 병렬프로그래밍
파이썬 병렬프로그래밍파이썬 병렬프로그래밍
파이썬 병렬프로그래밍Yong Joon Moon
 
Python on Android
Python on AndroidPython on Android
Python on Android용 최
 
파이썬 확률과 통계 기초 이해하기
파이썬 확률과 통계 기초 이해하기파이썬 확률과 통계 기초 이해하기
파이썬 확률과 통계 기초 이해하기Yong Joon Moon
 

Destaque (20)

파이썬 튜토리얼 (Python tutorial)
파이썬 튜토리얼 (Python tutorial)파이썬 튜토리얼 (Python tutorial)
파이썬 튜토리얼 (Python tutorial)
 
파이썬 반복자 생성자 이해하기
파이썬 반복자 생성자 이해하기파이썬 반복자 생성자 이해하기
파이썬 반복자 생성자 이해하기
 
Dark Circle - Translation : The cool way to contribute to F/OSS #2(우분투와 번역 이야...
Dark Circle - Translation : The cool way to contribute to F/OSS #2(우분투와 번역 이야...Dark Circle - Translation : The cool way to contribute to F/OSS #2(우분투와 번역 이야...
Dark Circle - Translation : The cool way to contribute to F/OSS #2(우분투와 번역 이야...
 
Python 내장 함수
Python 내장 함수Python 내장 함수
Python 내장 함수
 
파이썬 라이브러리로 쉽게 시작하는 데이터 분석
파이썬 라이브러리로 쉽게 시작하는 데이터 분석파이썬 라이브러리로 쉽게 시작하는 데이터 분석
파이썬 라이브러리로 쉽게 시작하는 데이터 분석
 
141103 최창원 파이썬 확장 프로그래밍
141103 최창원 파이썬 확장 프로그래밍141103 최창원 파이썬 확장 프로그래밍
141103 최창원 파이썬 확장 프로그래밍
 
Character Encoding in python
Character Encoding in pythonCharacter Encoding in python
Character Encoding in python
 
5G Coding
5G Coding5G Coding
5G Coding
 
병렬 프로그래밍
병렬 프로그래밍병렬 프로그래밍
병렬 프로그래밍
 
라즈베리파이 와 스카이로버 나노에 만남
라즈베리파이 와 스카이로버 나노에 만남라즈베리파이 와 스카이로버 나노에 만남
라즈베리파이 와 스카이로버 나노에 만남
 
병렬 프로그래밍 패러다임
병렬 프로그래밍 패러다임병렬 프로그래밍 패러다임
병렬 프로그래밍 패러다임
 
Python의 계산성능 향상을 위해 Fortran, C, CUDA-C, OpenCL-C 코드들과 연동하기
Python의 계산성능 향상을 위해 Fortran, C, CUDA-C, OpenCL-C 코드들과 연동하기Python의 계산성능 향상을 위해 Fortran, C, CUDA-C, OpenCL-C 코드들과 연동하기
Python의 계산성능 향상을 위해 Fortran, C, CUDA-C, OpenCL-C 코드들과 연동하기
 
openstack, devops and people
openstack, devops and peopleopenstack, devops and people
openstack, devops and people
 
Java와 Python의 만남: Jython과 Sikuli
Java와 Python의 만남: Jython과 SikuliJava와 Python의 만남: Jython과 Sikuli
Java와 Python의 만남: Jython과 Sikuli
 
병렬프로그래밍과 Cuda
병렬프로그래밍과 Cuda병렬프로그래밍과 Cuda
병렬프로그래밍과 Cuda
 
Python korea(emacs)
Python korea(emacs)Python korea(emacs)
Python korea(emacs)
 
PyCon 12월 세미나 - 실전 파이썬 프로그래밍 책 홍보
PyCon 12월 세미나 - 실전 파이썬 프로그래밍 책 홍보PyCon 12월 세미나 - 실전 파이썬 프로그래밍 책 홍보
PyCon 12월 세미나 - 실전 파이썬 프로그래밍 책 홍보
 
파이썬 병렬프로그래밍
파이썬 병렬프로그래밍파이썬 병렬프로그래밍
파이썬 병렬프로그래밍
 
Python on Android
Python on AndroidPython on Android
Python on Android
 
파이썬 확률과 통계 기초 이해하기
파이썬 확률과 통계 기초 이해하기파이썬 확률과 통계 기초 이해하기
파이썬 확률과 통계 기초 이해하기
 

Semelhante a 20151219_(python_korea)_How_to_automate_webhacking.kr_with_Python_presentation

2021년 3월 6일 개발자 이야기
2021년 3월 6일 개발자 이야기2021년 3월 6일 개발자 이야기
2021년 3월 6일 개발자 이야기Jay Park
 
10만 라인, 26280시간의 이야기
10만 라인, 26280시간의 이야기10만 라인, 26280시간의 이야기
10만 라인, 26280시간의 이야기Minyoung Jeong
 
2020년 5월 9일 개발 이야기 정리
2020년 5월 9일 개발 이야기 정리2020년 5월 9일 개발 이야기 정리
2020년 5월 9일 개발 이야기 정리Jay Park
 
PWA로 출퇴근 기록 시스템 개발하기 (2019 HTML5 Conf Seoul)
PWA로 출퇴근 기록 시스템 개발하기 (2019 HTML5 Conf Seoul)PWA로 출퇴근 기록 시스템 개발하기 (2019 HTML5 Conf Seoul)
PWA로 출퇴근 기록 시스템 개발하기 (2019 HTML5 Conf Seoul)kwon cheol shin
 
141118 최창원 웹크롤러제작
141118 최창원 웹크롤러제작141118 최창원 웹크롤러제작
141118 최창원 웹크롤러제작Changwon Choe
 
쉽게 쓰여진 Django
쉽게 쓰여진 Django쉽게 쓰여진 Django
쉽게 쓰여진 DjangoTaehoon Kim
 
데이터야놀자발표_데이터로토이서비스만들기_조동민 (2).pdf
데이터야놀자발표_데이터로토이서비스만들기_조동민 (2).pdf데이터야놀자발표_데이터로토이서비스만들기_조동민 (2).pdf
데이터야놀자발표_데이터로토이서비스만들기_조동민 (2).pdfDONGMIN CHO
 
2020년 10월 17일 개발자 이야기
2020년 10월 17일 개발자 이야기2020년 10월 17일 개발자 이야기
2020년 10월 17일 개발자 이야기Jay Park
 
2020년 4월 4일 개발 이야기 정리
2020년 4월 4일 개발 이야기 정리2020년 4월 4일 개발 이야기 정리
2020년 4월 4일 개발 이야기 정리Jay Park
 
2021년 3월 27일 개발자 이야기
2021년 3월 27일 개발자 이야기2021년 3월 27일 개발자 이야기
2021년 3월 27일 개발자 이야기Jay Park
 
2020년 9월 12일 개발 이야기 정리
2020년 9월 12일 개발 이야기 정리2020년 9월 12일 개발 이야기 정리
2020년 9월 12일 개발 이야기 정리Jay Park
 
윤석주, 인하우스 웹 프레임워크 Jul8 제작기, NDC2018
윤석주, 인하우스 웹 프레임워크 Jul8 제작기, NDC2018윤석주, 인하우스 웹 프레임워크 Jul8 제작기, NDC2018
윤석주, 인하우스 웹 프레임워크 Jul8 제작기, NDC2018devCAT Studio, NEXON
 
CleanSwift 적용기
CleanSwift 적용기CleanSwift 적용기
CleanSwift 적용기ssuser86e2971
 
Django로 배우는 쉽고 빠른 웹개발 study 자료
Django로 배우는 쉽고 빠른 웹개발 study 자료Django로 배우는 쉽고 빠른 웹개발 study 자료
Django로 배우는 쉽고 빠른 웹개발 study 자료Han Sung Kim
 
2020년 5월 16일 개발 이야기 정리
2020년 5월 16일 개발 이야기 정리2020년 5월 16일 개발 이야기 정리
2020년 5월 16일 개발 이야기 정리Jay Park
 
ecdevday3 효율적인 유지보수를 위한 개발 및 관리
ecdevday3 효율적인 유지보수를 위한 개발 및 관리ecdevday3 효율적인 유지보수를 위한 개발 및 관리
ecdevday3 효율적인 유지보수를 위한 개발 및 관리Kenu, GwangNam Heo
 
청강대 특강 - 프로젝트 제대로 해보기
청강대 특강 - 프로젝트 제대로 해보기청강대 특강 - 프로젝트 제대로 해보기
청강대 특강 - 프로젝트 제대로 해보기Chris Ohk
 
2020년 12월 5일 개발자 이야기
2020년 12월 5일 개발자 이야기2020년 12월 5일 개발자 이야기
2020년 12월 5일 개발자 이야기Jay Park
 
[5분 따라하기] git 다중 사용자 신원 설정 방법
[5분 따라하기] git 다중 사용자 신원 설정 방법[5분 따라하기] git 다중 사용자 신원 설정 방법
[5분 따라하기] git 다중 사용자 신원 설정 방법Jay Park
 
NDC 2013 Monkeyrunner를 이용한 모바일 테스트 자동화
NDC 2013 Monkeyrunner를 이용한 모바일 테스트 자동화NDC 2013 Monkeyrunner를 이용한 모바일 테스트 자동화
NDC 2013 Monkeyrunner를 이용한 모바일 테스트 자동화ByungJoon Lee
 

Semelhante a 20151219_(python_korea)_How_to_automate_webhacking.kr_with_Python_presentation (20)

2021년 3월 6일 개발자 이야기
2021년 3월 6일 개발자 이야기2021년 3월 6일 개발자 이야기
2021년 3월 6일 개발자 이야기
 
10만 라인, 26280시간의 이야기
10만 라인, 26280시간의 이야기10만 라인, 26280시간의 이야기
10만 라인, 26280시간의 이야기
 
2020년 5월 9일 개발 이야기 정리
2020년 5월 9일 개발 이야기 정리2020년 5월 9일 개발 이야기 정리
2020년 5월 9일 개발 이야기 정리
 
PWA로 출퇴근 기록 시스템 개발하기 (2019 HTML5 Conf Seoul)
PWA로 출퇴근 기록 시스템 개발하기 (2019 HTML5 Conf Seoul)PWA로 출퇴근 기록 시스템 개발하기 (2019 HTML5 Conf Seoul)
PWA로 출퇴근 기록 시스템 개발하기 (2019 HTML5 Conf Seoul)
 
141118 최창원 웹크롤러제작
141118 최창원 웹크롤러제작141118 최창원 웹크롤러제작
141118 최창원 웹크롤러제작
 
쉽게 쓰여진 Django
쉽게 쓰여진 Django쉽게 쓰여진 Django
쉽게 쓰여진 Django
 
데이터야놀자발표_데이터로토이서비스만들기_조동민 (2).pdf
데이터야놀자발표_데이터로토이서비스만들기_조동민 (2).pdf데이터야놀자발표_데이터로토이서비스만들기_조동민 (2).pdf
데이터야놀자발표_데이터로토이서비스만들기_조동민 (2).pdf
 
2020년 10월 17일 개발자 이야기
2020년 10월 17일 개발자 이야기2020년 10월 17일 개발자 이야기
2020년 10월 17일 개발자 이야기
 
2020년 4월 4일 개발 이야기 정리
2020년 4월 4일 개발 이야기 정리2020년 4월 4일 개발 이야기 정리
2020년 4월 4일 개발 이야기 정리
 
2021년 3월 27일 개발자 이야기
2021년 3월 27일 개발자 이야기2021년 3월 27일 개발자 이야기
2021년 3월 27일 개발자 이야기
 
2020년 9월 12일 개발 이야기 정리
2020년 9월 12일 개발 이야기 정리2020년 9월 12일 개발 이야기 정리
2020년 9월 12일 개발 이야기 정리
 
윤석주, 인하우스 웹 프레임워크 Jul8 제작기, NDC2018
윤석주, 인하우스 웹 프레임워크 Jul8 제작기, NDC2018윤석주, 인하우스 웹 프레임워크 Jul8 제작기, NDC2018
윤석주, 인하우스 웹 프레임워크 Jul8 제작기, NDC2018
 
CleanSwift 적용기
CleanSwift 적용기CleanSwift 적용기
CleanSwift 적용기
 
Django로 배우는 쉽고 빠른 웹개발 study 자료
Django로 배우는 쉽고 빠른 웹개발 study 자료Django로 배우는 쉽고 빠른 웹개발 study 자료
Django로 배우는 쉽고 빠른 웹개발 study 자료
 
2020년 5월 16일 개발 이야기 정리
2020년 5월 16일 개발 이야기 정리2020년 5월 16일 개발 이야기 정리
2020년 5월 16일 개발 이야기 정리
 
ecdevday3 효율적인 유지보수를 위한 개발 및 관리
ecdevday3 효율적인 유지보수를 위한 개발 및 관리ecdevday3 효율적인 유지보수를 위한 개발 및 관리
ecdevday3 효율적인 유지보수를 위한 개발 및 관리
 
청강대 특강 - 프로젝트 제대로 해보기
청강대 특강 - 프로젝트 제대로 해보기청강대 특강 - 프로젝트 제대로 해보기
청강대 특강 - 프로젝트 제대로 해보기
 
2020년 12월 5일 개발자 이야기
2020년 12월 5일 개발자 이야기2020년 12월 5일 개발자 이야기
2020년 12월 5일 개발자 이야기
 
[5분 따라하기] git 다중 사용자 신원 설정 방법
[5분 따라하기] git 다중 사용자 신원 설정 방법[5분 따라하기] git 다중 사용자 신원 설정 방법
[5분 따라하기] git 다중 사용자 신원 설정 방법
 
NDC 2013 Monkeyrunner를 이용한 모바일 테스트 자동화
NDC 2013 Monkeyrunner를 이용한 모바일 테스트 자동화NDC 2013 Monkeyrunner를 이용한 모바일 테스트 자동화
NDC 2013 Monkeyrunner를 이용한 모바일 테스트 자동화
 

20151219_(python_korea)_How_to_automate_webhacking.kr_with_Python_presentation

  • 1. How to automate webhacking.kr with python How to automate webhacking.kr with Python © 조근영 2015 1
  • 2. Who are you? • 조근영, 남자사람 • Python 좋아함 • Data Analysis, TDD, Penetration Testing, DevOps, Machine Learning, NLP 관심 • githubgithub • 파으리썬 운영자euripy euripy http://euripy.github.io github https://github.com/re4lfl0w/ How to automate webhacking.kr with Python © 조근영 2015 2
  • 3. Casting • 리뷰1 1 Hardware Hacking Training Epilogue How to automate webhacking.kr with Python © 조근영 2015 3
  • 4. Why? How to automate webhacking.kr with Python © 조근영 2015 4
  • 5. 헐... How to automate webhacking.kr with Python © 조근영 2015 5
  • 6. 5000 개... How to automate webhacking.kr with Python © 조근영 2015 6
  • 7. 일반적인 풀이는 너무 많다!! 좋아? 그렇다면 차별화를 하기 위해서는?? How to automate webhacking.kr with Python © 조근영 2015 7
  • 8. Python How to automate webhacking.kr with Python © 조근영 2015 8
  • 9. Python How to automate webhacking.kr with Python © 조근영 2015 9
  • 10. Python How to automate webhacking.kr with Python © 조근영 2015 10
  • 11. Python!! How to automate webhacking.kr with Python © 조근영 2015 11
  • 12. 좋아... Webhacking.kr 사냥하러 가보자 일단 목차를 한 번 봐볼까 How to automate webhacking.kr with Python © 조근영 2015 12
  • 13. 1일차 • 이론 및 실습 준비 • 난이도 하 문제 풀이(자바스크립트, 파라미터 변조) How to automate webhacking.kr with Python © 조근영 2015 13
  • 14. 2일차 • 난이도 중 문제 풀이(파라미터 변조, XSS 등) How to automate webhacking.kr with Python © 조근영 2015 14
  • 15. 3일차 • 난이도 중 ~ 상 문제 풀이(SQL Injection) How to automate webhacking.kr with Python © 조근영 2015 15
  • 16. 자바스크립트 파라미터 변조 XSS SQL Injection How to automate webhacking.kr with Python © 조근영 2015 16
  • 17. 책으로는 많이 봤는데 문제 풀이는 많이 해보지 않음 좋아! 도전이다 How to automate webhacking.kr with Python © 조근영 2015 17
  • 18. Key Point How to automate webhacking.kr with Python © 조근영 2015 18
  • 19. Key Point • 내가 말하고자 하는것은 문제를 마주쳤을 때 어떻게 해결하는지? How to automate webhacking.kr with Python © 조근영 2015 19
  • 20. Key Point • 내가 말하고자 하는것은 문제를 마주쳤을 때 어떻게 해결하는지? • 암묵지에 있는 사고의 과정을 보여주는데 초점 How to automate webhacking.kr with Python © 조근영 2015 20
  • 21. Key Point • 내가 말하고자 하는것은 문제를 마주쳤을 때 어떻게 해결하는지? • 암묵지에 있는 사고의 과정을 보여주는데 초점 • 결과를 만들어서 대단하지? 라는게 이 슬라이드에서 원하는게 아님 How to automate webhacking.kr with Python © 조근영 2015 21
  • 22. Key Point • 내가 말하고자 하는것은 문제를 마주쳤을 때 어떻게 해결하는지? • 암묵지에 있는 사고의 과정을 보여주는데 초점 • 결과를 만들어서 대단하지? 라는게 이 슬라이드에서 원하는게 아님 • 직관, 의사결정, 상황파악 등을 어떻게 했는지 보여주는게 Point How to automate webhacking.kr with Python © 조근영 2015 22
  • 23. 자동화에 필요한 순서 1. 로그인 2. 문제 보기 • Highlight 문제 • 정렬 문제 3. 문제 소스 보기 4. 인증하기 How to automate webhacking.kr with Python © 조근영 2015 23
  • 24. 1. 로그인 How to automate webhacking.kr with Python © 조근영 2015 24
  • 25. webhacking.kr은 로그인이 되어있지 않으면 로그인 페이지로 돌려보냄 How to automate webhacking.kr with Python © 조근영 2015 25
  • 26. 자동화를 하기 위해서는 로그인 정보가 필요함 How to automate webhacking.kr with Python © 조근영 2015 26
  • 27. 로그인 정보를 유지하기 위한 파이썬 라이브러 리가 뭐가 있지? How to automate webhacking.kr with Python © 조근영 2015 27
  • 28. Violent Python 에 나온 mechanize를 사용하자2 2 (http://www.yes24.com/24/goods/8433461?scode=032&OzSrank=1) How to automate webhacking.kr with Python © 조근영 2015 28
  • 29. 로그인 How to automate webhacking.kr with Python © 조근영 2015 29
  • 30. 파라미터 확인 How to automate webhacking.kr with Python © 조근영 2015 30
  • 31. 좋아, 너로 정했다! How to automate webhacking.kr with Python © 조근영 2015 31
  • 32. Packet capture login info with wireshark How to automate webhacking.kr with Python © 조근영 2015 32
  • 33. 아하! POST method로 id, pw를 인자로 넘기는구나. How to automate webhacking.kr with Python © 조근영 2015 33
  • 34. Login Mechanize Source import mechanize import urllib import urlparse from custom_source.login import id_, pw login_url = 'http://webhacking.kr/index.html?enter=1' data = urllib.urlencode({'id':id_, 'pw':pw}) browser = mechanize.Browser() resp = browser.open(login_url, data).read() How to automate webhacking.kr with Python © 조근영 2015 34
  • 35. 2. 문제 보기 How to automate webhacking.kr with Python © 조근영 2015 35
  • 36. No. 15 • 목적: 자바스크립트 소스 확인 How to automate webhacking.kr with Python © 조근영 2015 36
  • 37. Print source resp = browser.open(index_url).read() resp = browser.open(challenge_url).read() def join_url(url, base_url='http://webhacking.kr'): if 'view-source:' in url: url = url.replace('view-source:', '') if 'webhacking' in url and 'http' not in url: return '{0}{1}'.format('http://', url) return urlparse.urljoin(base_url, url) def print_source(url): resp = browser.open(join_url(url)).read() print(resp) return resp print_source('challenge/javascript/js2.html') How to automate webhacking.kr with Python © 조근영 2015 37
  • 38. print_source output How to automate webhacking.kr with Python © 조근영 2015 38
  • 39. print_source output 자 여기에서 어떤 문제점을 느끼셨나요? How to automate webhacking.kr with Python © 조근영 2015 39
  • 40. Colorful 하지도 않고, Syntax Highlight도 안되어 있고, Python 유저에게는 그저 고난과 역경 How to automate webhacking.kr with Python © 조근영 2015 40
  • 41. 좋아, Syntax Highlight 가 되는 것을 찾아보자! How to automate webhacking.kr with Python © 조근영 2015 41
  • 42. Googling! How to automate webhacking.kr with Python © 조근영 2015 42
  • 43. Pygments? 뭐지?1 This is the home of Pygments. It is a generic syntax highlighter suitable for use in code hosting, forums, wikis or other applications that need to prettify source code. Highlights are: • a wide range of over 300 languages and other text formats is supported • special attention is paid to details that increase highlighting quality How to automate webhacking.kr with Python © 조근영 2015 43
  • 44. Pygments? 뭐지?2 • support for new languages and formats are added easily; most languages use a simple regex-based lexing mechanism • a number of output formats is available, among them HTML, RTF, LaTeX and ANSI sequences • it is usable as a command-line tool and as a library ... and it highlights even Perl 6! How to automate webhacking.kr with Python © 조근영 2015 44
  • 45. Pygments Demo • Pygments Demo How to automate webhacking.kr with Python © 조근영 2015 45
  • 46. 깔끔한데..? 근데 이걸 어떻게 내 프로젝트에 적용하지? How to automate webhacking.kr with Python © 조근영 2015 46
  • 47. 처음에는 이해가 안되었다.. How to automate webhacking.kr with Python © 조근영 2015 47
  • 48. 여기저기 구글링 하면서 찾아다니다 어디서 봤는지는 기억이 나지 않지만 예제를 찾았다. 심 봤다! How to automate webhacking.kr with Python © 조근영 2015 48
  • 49. 적용하기 위한 사전 개념 필요 pygments.highlight(code, lexer, formatter, outfile=None) • code: 적용하고자 하는 code • lexer: 어떤 language를 highlight 할 것 인지?(ex: Python, C) • formatter: 어떤 스타일을 사용할 것인지? (ex: default, friendly) • highlight: 최종 적용할 code, lexer, formatter 구해서 넣어주자! How to automate webhacking.kr with Python © 조근영 2015 49
  • 50. Pygments original source lexer = get_lexer_by_name('html') formatter = HtmlFormatter(style='default', linenos=False, full=True) data = highlight(response, lexer, formatter) HTML(data=data) • HTML: IPython Notebook에서 HTML을 뿌려주는 역할 How to automate webhacking.kr with Python © 조근영 2015 50
  • 51. Pygments original output How to automate webhacking.kr with Python © 조근영 2015 51
  • 52. 오오오... highlight가 된다. How to automate webhacking.kr with Python © 조근영 2015 52
  • 53. 근데 아직 정렬이 안됐다. How to automate webhacking.kr with Python © 조근영 2015 53
  • 54. 근데 아직 정렬이 안됐다. 이제 소스에 정렬해주는 beautifier를 붙여보자 How to automate webhacking.kr with Python © 조근영 2015 54
  • 55. beautifier 후보군 1. original 2. jsbeautifier 3. beautifulsoup How to automate webhacking.kr with Python © 조근영 2015 55
  • 56. jsbeautifier & beautifulsoup How to automate webhacking.kr with Python © 조근영 2015 56
  • 57. beautifier 후보군 문제점 1. original: 소스 정렬 안됨 2. jsbeautifier: indent 됨, tag 사이에 space 들어가는 문제점. • 온라인 Online JavaScript beautifier는 이런 문제점이 없는데 뭐 가 문제일까? issue 올림 3. beautifulsoup: script 안의 소스가 indent가 안됨 How to automate webhacking.kr with Python © 조근영 2015 57
  • 58. 그만 타협하자... How to automate webhacking.kr with Python © 조근영 2015 58
  • 59. 그만 타협하자... 그나마 html은 제대로 정렬이 되는걸 택하자 3번 beautifulsoup 을 선택하고 문제 풀자!! How to automate webhacking.kr with Python © 조근영 2015 59
  • 60. No.15 Source에서 password is off_script How to automate webhacking.kr with Python © 조근영 2015 60
  • 61. No.15 Auth • 문제점이: 인증받기 위해 일일이 입력해야 됨..체크 포인트 How to automate webhacking.kr with Python © 조근영 2015 61
  • 62. No. 17 • 목적: 자바스크립트 변수 값 확인 How to automate webhacking.kr with Python © 조근영 2015 62
  • 63. Print Source No. 17 How to automate webhacking.kr with Python © 조근영 2015 63
  • 64. 두둥... mechanize에서 javascript를 실행할 수 있는가? How to automate webhacking.kr with Python © 조근영 2015 64
  • 65. 일단 Python 으로 해결해 보자! unlock = 100*10*10+100/10-10+10+50-9*8+7-6+5-4*3-2*1*10*100*10*10+100/10-10+10+... print(unlock/10) # python2 # 999780950 # python3 # 999780930.7 python2와 python3는 division 결과가 다르다. python2에서 python3와 동일한 결과를 얻기 위해서 추가하자 from __future__ import division How to automate webhacking.kr with Python © 조근영 2015 65
  • 66. IPython의 node.js를 실행해서 풀어보자 How to automate webhacking.kr with Python © 조근영 2015 66
  • 67. 헥헥... 어쨌든 Python 으로 해결하긴 했지만 다음에는 어떻게 해결해야 할지... How to automate webhacking.kr with Python © 조근영 2015 67
  • 68. No. 14 • 목적: 변수와 함수, onclick() 사용법 How to automate webhacking.kr with Python © 조근영 2015 68
  • 69. Print Source No.14 resp = print_source('webhacking.kr/challenge/javascript/js1.html') <html> ... <form name="pw"> <input type="text" name="input_pwd" /> <input type="button" value="check" onclick="ck()" /> </form> <script> function ck() { var ul=document.URL; ul=ul.indexOf(".kr"); ul=ul*30; if(ul==pw.input_pwd.value) { alert("Password is "+ul*pw.input_pwd.value); } else { alert("Wrong"); } } </script> </body> </html> How to automate webhacking.kr with Python © 조근영 2015 69
  • 70. Chrome Development Tool & IPython 문제점: DOM에 의해 생성되는 document.URL을 일일이 복붙해야 한다. 즉, DOM을 제어해야 한다. How to automate webhacking.kr with Python © 조근영 2015 70
  • 71. 털썩... 드디어 DOM이 나왔구나4 어떻게 해결해야 하지? 4 DOM(Document Object Model) How to automate webhacking.kr with Python © 조근영 2015 71
  • 72. Document Object Model HTML과 XML 문서를 위한 API 문서의 구조적 표현을 제공하고, 그 내용과 시각적 표현을 바꾸는 것이 가능 즉 한 마디로, HTML을 지지고 볶을 수 있다! How to automate webhacking.kr with Python © 조근영 2015 72
  • 73. 자... 현재까지 오면서 어떤 문제점을 느끼셨나요? How to automate webhacking.kr with Python © 조근영 2015 73
  • 74. 자... 현재까지 오면서 어떤 문제점을 느끼셨나요? 자동화하기 위한 구간이 보이시나요? How to automate webhacking.kr with Python © 조근영 2015 74
  • 75. 현재까지 나타난 문제점 1. 소스 주소를 한땀한땀 브라우저에서 복붙을 해야한다. 2. javascript를 실행할 수 있는가? • 실행할 수 있다고 해도 브라우저에 종속적인 상황에서는 어떻게 할 것인가?(ex: DOM) 3. 브라우저에 한땀한땀 복붙을 해서 인증을 한다. How to automate webhacking.kr with Python © 조근영 2015 75
  • 76. 떡밥 투척 • 시간: 2015년 12월 19일 토요일 오후 3시 ~7시 • 장소: 하이브아레나 • 이런 좋은 장소는 흥해야 되요! How to automate webhacking.kr with Python © 조근영 2015 76
  • 77. How to automate webhacking.kr with Python © 조근영 2015 77
  • 78. Browser Controller Selenium How to automate webhacking.kr with Python © 조근영 2015 78
  • 79. 넌 무슨 듣보잡이야?! How to automate webhacking.kr with Python © 조근영 2015 79
  • 80. 구글이 선택한 Test Framework How to automate webhacking.kr with Python © 조근영 2015 80
  • 81. 천마디의 말보다 한 번 보는 게 더 낫다 뭐하는 놈인지는 먼저 보고나서 고민 How to automate webhacking.kr with Python © 조근영 2015 81
  • 82. Demo Time How to automate webhacking.kr with Python © 조근영 2015 82
  • 83. Selenium Simple Source from urllib import quote from urlparse import urljoin from time import sleep from selenium import webdriver driver = webdriver.Firefox() google_url = 'https://google.com/' sleep(5) driver.get(google_url) sleep(5) query = 'python' search_url = urljoin(google_url, 'search?q={}'.format(quote(query))) driver.get(search_url) sleep(10) driver.quit() How to automate webhacking.kr with Python © 조근영 2015 83
  • 84. Why Selenium?1 • Frequent regression testing(자주하는 회귀 테스팅) • Rapid feedback to developers(개발자에게 빠른 피드백) • Virtually unlimited iterations of test case execution(가상으로 제한없이 테스트 케이스 실행) • Support for Agile and extreme development methodologies(빠른 개발 방법론을 지원) How to automate webhacking.kr with Python © 조근영 2015 84
  • 85. Why Selenium?2 • Disciplined documentation of test cases(규격화 된 테스트 케이 스의 문서화) • Customized defect reporting(개개인의 요구에 맞춘 리포팅) • Finding defects missed by manual testing(수동 테스트로 생기 는 결함을 찾기) How to automate webhacking.kr with Python © 조근영 2015 85
  • 86. 말이 굉장히 어렵다... UI 버그를 빠른 시간내에 잡기 위해서 테스트 한다는 개념으로 보면 됨 사용자 스토리에 따라서 테스트하는 Function Testing에도 사용 됨 난 '그저 자동화 도구'로서의 시각으로 바라봄 How to automate webhacking.kr with Python © 조근영 2015 86
  • 87. 문제점을 다시 한 번 살펴보자. How to automate webhacking.kr with Python © 조근영 2015 87
  • 88. 현재까지 나타난 문제점 1. 소스 주소를 한땀한땀 브라우저에서 복붙을 해야한다. 2. javascript를 실행할 수 있는가? • 실행할 수 있다고 해도 브라우저에 종속적인 상황에서는 어떻게 할 것인가?(ex: DOM) 3. 브라우저에 한땀한땀 복붙을 해서 인증을 한다. How to automate webhacking.kr with Python © 조근영 2015 88
  • 89. 1. 소스 주소 복붙 문제 How to automate webhacking.kr with Python © 조근영 2015 89
  • 90. 브라우저는 어차피 source를 받아와서 How to automate webhacking.kr with Python © 조근영 2015 90
  • 91. 브라우저는 어차피 source를 받아와서 rendering 해주는 것밖에 없잖아? How to automate webhacking.kr with Python © 조근영 2015 91
  • 92. 브라우저는 어차피 source를 받아와서 rendering 해주는 것밖에 없잖아? 그렇다면 내가 source에서 주소를 얻어오면 되지않나?! How to automate webhacking.kr with Python © 조근영 2015 92
  • 93. 좋아 고고씽! How to automate webhacking.kr with Python © 조근영 2015 93
  • 94. Challenge Page Source How to automate webhacking.kr with Python © 조근영 2015 94
  • 95. 보이는가? How to automate webhacking.kr with Python © 조근영 2015 95
  • 96. 보이는가?onclick event로 location.href 함수가 호출된다. How to automate webhacking.kr with Python © 조근영 2015 96
  • 97. onclick event Excute a JavaScript when a button is clicked <script> function myFunction() { document.getElementById("demo").innerHTML = "Hello World"; } </script> <button onclick="myFunction()">Click me</button> Hello World가 출력된다. How to automate webhacking.kr with Python © 조근영 2015 97
  • 98. location.href Return the entire URL(of the current page) location.href='http://google.com' 이러면 페이지가 구글로 이동한다. How to automate webhacking.kr with Python © 조근영 2015 98
  • 99. 해석하자면 onclick="location.href='challenge/web/web-01/'" click event가 발생했을 때 http://webhacking.kr/challenge/web/web-01/ 페이지로 이동한다. You got it? How to automate webhacking.kr with Python © 조근영 2015 99
  • 100. 그렇다면... 저 onclick의 속성을 추출한 후에 location.href의 속성을 추출하면 challenge/web/web-01/ 만 얻어진다는 말씀? How to automate webhacking.kr with Python © 조근영 2015 100
  • 101. 상대주소를 추출하기 위해서는 DOM을 제어해야 되는데 DOM을 어떻게 제어해야 되는거냐? How to automate webhacking.kr with Python © 조근영 2015 101
  • 102. XPath XPath(XML Path Language)는 W3C의 표준으로 확장 생성 언어 문서 의 구조를 통해 경로 위에 지정한 구문을 사용하여 항목을 배치하고 처리하 는 방법을 기술하는 언어이다. XML 표현보다 더 쉽고 약어로 되어 있으며, XSL 변환(XSLT)과 XML 지시자 언어(XPointer)에 쓰이는 언어이다. XPath는 XML 문서의 노드를 정의하기 위하여 경로식을 사용하며, 수학 함수와 기타 확장 가능한 표현들이 있다. How to automate webhacking.kr with Python © 조근영 2015 102
  • 103. 역시 언제나 딱딱한 정의는 어려워.. 이해하기 쉽게 example을 보자 How to automate webhacking.kr with Python © 조근영 2015 103
  • 104. XPath를 활용한 title 추출 How to automate webhacking.kr with Python © 조근영 2015 104
  • 105. title은 잘 추출이 됐다. //title은 title tag를 //title/text()는 title의 text만(우리가 원하던 것!) How to automate webhacking.kr with Python © 조근영 2015 105
  • 106. 마우스로 찍은 XPath How to automate webhacking.kr with Python © 조근영 2015 106
  • 107. 마우스로 찍은 XPath를 보니 굉장히 어렵게 나타나 있다. html/body/table/tbody/tr[2]/td/center/center/form/table/tbody/tr[1]/td[1]/input How to automate webhacking.kr with Python © 조근영 2015 107
  • 108. 마우스로 찍은 XPath를 보니 굉장히 어렵게 나타나 있다. html/body/table/tbody/tr[2]/td/center/center/form/table/tbody/tr[1]/td[1]/input 이거 가지고 뭔가 추출하기란 굉장히 어려울 것 같다. 너무 specific 해. 큰 틀만 파악하고 변형해보자! How to automate webhacking.kr with Python © 조근영 2015 108
  • 109. 그렇다면 이제 본격적으로 onclick의 속성을 추출해 보자 How to automate webhacking.kr with Python © 조근영 2015 109
  • 110. challenge list 추출 How to automate webhacking.kr with Python © 조근영 2015 110
  • 111. XPath 활용해서 onclick 속성 추출 의도치않게 ID가 선택이 된다. 이런것을 잘 처리해 주자. How to automate webhacking.kr with Python © 조근영 2015 111
  • 112. 문제들의 input tag만 선 택됨 webhacking.kr의 총 문제수는 66문제다. 하지만 ID값이 제일 처음에 포함되기 때문에 67개의 노드가 추출된 것을 확인 가능 How to automate webhacking.kr with Python © 조근영 2015 112
  • 113. 문제의 tag들을 추출했다..!! How to automate webhacking.kr with Python © 조근영 2015 113
  • 114. 다들 알고 있겠지만 그래도 확인하는 차원에서 Tag와 Attribute와의 차이점을 알고가자 How to automate webhacking.kr with Python © 조근영 2015 114
  • 115. Tag & Attribute 차이점 Tag: form, table, tbody, tr, td Attribute: type, onclick, style, background, color, onmouseout, onmouseover How to automate webhacking.kr with Python © 조근영 2015 115
  • 116. @를 붙여주면 Attribute 접근 가능 //form/table/tbody/tr/td/input/@onclick 실은 나도 Attribute 추출하는 것을 발표 준비하면서 깨달았다. 역시 발표하는건 발표자에게 더 도 움이 되는 일 How to automate webhacking.kr with Python © 조근영 2015 116
  • 117. 그럼 이제 source단에서 Parsing이 가능하므로 복붙을 하지 않아도 된다. How to automate webhacking.kr with Python © 조근영 2015 117
  • 118. 현재까지 나타난 문제점 1. 소스 주소를 한땀한땀 브라우저에서 복붙을 해야한다. 2. javascript를 실행할 수 있는가? • 실행할 수 있다고 해도 브라우저에 종속적인 상황에서는 어떻게 할 것인가?(ex: DOM) 3. 브라우저에 한땀한땀 복붙을 해서 인증을 한다. How to automate webhacking.kr with Python © 조근영 2015 118
  • 119. 그럼 이제 어느 정도 준비가 끝난것 같다. Selenium 으로 로그인부터 다시! How to automate webhacking.kr with Python © 조근영 2015 119
  • 120. 로그인 구현은 mechanize로 해봤는데 Selenium은 다른 방식이다. How to automate webhacking.kr with Python © 조근영 2015 120
  • 121. Selenium은 우리가 일반적으로 Browser를 사용하는 방식과 똑같이 사용하면 된다. How to automate webhacking.kr with Python © 조근영 2015 121
  • 122. Login Logic1. Connect Login Webpage How to automate webhacking.kr with Python © 조근영 2015 122
  • 123. Login Logic1. Connect Login Webpage 2. Input ID How to automate webhacking.kr with Python © 조근영 2015 123
  • 124. Login Logic1. Connect Login Webpage 2. Input ID 3. Input PW How to automate webhacking.kr with Python © 조근영 2015 124
  • 125. Login Logic1. Connect Login Webpage 2. Input ID 3. Input PW 4. Click Login button How to automate webhacking.kr with Python © 조근영 2015 125
  • 126. webhacking.kr Login Analysis <form method="post" action="index.html?enter=1" name="lf" onkeypress="if(event.keyCode==13)go();"> </form> function go() { if(lf.id.value=="") { lf.id.focus(); return; } if(lf.pw.value=="") { lf.pw.focus(); return; } lf.submit(); } How to automate webhacking.kr with Python © 조근영 2015 126
  • 127. webhacking.kr Login Analysis <form method="post" action="index.html?enter=1" name="lf" onkeypress="if(event.keyCode==13)go();"> </form> function go() { if(lf.id.value=="") { lf.id.focus(); return; } if(lf.pw.value=="") { lf.pw.focus(); return; } lf.submit(); } 로그인 하려면 javascript를 써야되네?! How to automate webhacking.kr with Python © 조근영 2015 127
  • 128. 필요한 함수들 먼저 Import # built-in import urllib import urlparse import re import time # third-party import jsbeautifier import mechanize from selenium import webdriver from BeautifulSoup import BeautifulSoup as bs from pygments import highlight from pygments.lexers import get_lexer_by_name from pygments.formatters.html import HtmlFormatter from IPython.display import HTML # custom from custom_source.login import id_, pw login_url = 'http://webhacking.kr/index.html?enter=1' index_url = 'http://webhacking.kr/index.php' challenge_url = 'http://webhacking.kr/index.php?mode=challenge' auth_url = 'http://webhacking.kr/index.php?mode=auth' How to automate webhacking.kr with Python © 조근영 2015 128
  • 129. Login 구현 Source from urllib import quote from urlparse import urljoin from time import sleep from selenium import webdriver WAIT = 1 driver = webdriver.Firefox() sleep(WAIT) driver.get(login_url) sleep(WAIT) sleep(WAIT) driver.find_element_by_name('id').send_keys(id_) driver.find_element_by_name('pw').send_keys(pw) driver.execute_script('go();') # javascript 실행해서 로그인! sleep(10) driver.quit() How to automate webhacking.kr with Python © 조근영 2015 129
  • 130. Demo Time How to automate webhacking.kr with Python © 조근영 2015 130
  • 131. Login 구현하면서 javascript 문제까지 해결!! How to automate webhacking.kr with Python © 조근영 2015 131
  • 132. 현재까지 나타난 문제점 1. 소스 주소를 한땀한땀 브라우저에서 복붙을 해야한다. 2. javascript를 실행할 수 있는가? • 실행할 수 있다고 해도 브라우저에 종속적인 상황에서는 어떻게 할 것인가?(ex: DOM) 3. 브라우저에 한땀한땀 복붙을 해서 인증을 한다. How to automate webhacking.kr with Python © 조근영 2015 132
  • 133. 이제 인증만 해결하면 된다! How to automate webhacking.kr with Python © 조근영 2015 133
  • 134. Auth Analysis <form method="post" action="?mode=auth_go"> <table> <tbody> <tr> <td>Flag</td> <td> <input type="text" name="answer" size="100"> </td> </tr> <tr> <td colspan="2" align="center"> <input type="submit" value="Submit"> <br><br> Do not brute-force </td> </tr> </tbody> </table> </form> How to automate webhacking.kr with Python © 조근영 2015 134
  • 135. Auth 구현 Source sleep(WAIT) driver.get(auth_url) sleep(WAIT) sleep(WAIT) answer = 'off_script' driver.find_element_by_name('answer').send_keys(answer) # name으로도 선택 가능 # css selector로도 선택 가능 driver.find_elements_by_css_selector('form table tbody tr td input')[-1].click() sleep(WAIT) sleep(10) driver.switch_to.alert.accept() # 중요! alert창 없애줘야 한다! sleep(10) How to automate webhacking.kr with Python © 조근영 2015 135
  • 136. Demo Time How to automate webhacking.kr with Python © 조근영 2015 136
  • 137. 현재까지 나타난 문제점 1. 소스 주소를 한땀한땀 브라우저에서 복붙을 해야한다. 2. javascript를 실행할 수 있는가? • 실행할 수 있다고 해도 브라우저에 종속적인 상황에서는 어떻게 할 것인가?(ex: DOM) 3. 브라우저에 한땀한땀 복붙을 해서 인증을 한다. How to automate webhacking.kr with Python © 조근영 2015 137
  • 138. 후... 드디어 문제점을 모두 해결했다. How to automate webhacking.kr with Python © 조근영 2015 138
  • 139. 일단 문제점은 해결됐지만 How to automate webhacking.kr with Python © 조근영 2015 139
  • 140. 일단 문제점은 해결됐지만 재사용하기 편한 클래스로 변환해야 한다. How to automate webhacking.kr with Python © 조근영 2015 140
  • 141. 일단 문제점은 해결됐지만 재사용하기 편한 클래스로 변환해야 한다. Refactoring의 시간 How to automate webhacking.kr with Python © 조근영 2015 141
  • 142. Refactoring 1. login: login 구현. 사용자 id, pw 입력 How to automate webhacking.kr with Python © 조근영 2015 142
  • 143. Refactoring 1. login: login 구현. 사용자 id, pw 입력 2. view_challenge: challenge.html 을 파싱해서 문제들 주소 추출 How to automate webhacking.kr with Python © 조근영 2015 143
  • 144. Refactoring 1. login: login 구현. 사용자 id, pw 입력 2. view_challenge: challenge.html 을 파싱해서 문제들 주소 추출 3. print_problem_source: 소스 출력 How to automate webhacking.kr with Python © 조근영 2015 144
  • 145. Refactoring 1. login: login 구현. 사용자 id, pw 입력 2. view_challenge: challenge.html 을 파싱해서 문제들 주소 추출 3. print_problem_source: 소스 출력 4. print_index_phps: 문제 페이지 안의 소스 출력 How to automate webhacking.kr with Python © 조근영 2015 145
  • 146. Refactoring 1. login: login 구현. 사용자 id, pw 입력 2. view_challenge: challenge.html 을 파싱해서 문제들 주소 추출 3. print_problem_source: 소스 출력 4. print_index_phps: 문제 페이지 안의 소스 출력 5. auth: 인증 페이지 How to automate webhacking.kr with Python © 조근영 2015 146
  • 147. Refactoring 1. login: login 구현. 사용자 id, pw 입력 2. view_challenge: challenge.html 을 파싱해서 문제들 주소 추출 3. print_problem_source: 소스 출력 4. print_index_phps: 문제 페이지 안의 소스 출력 5. auth: 인증 페이지 6. accept_alert: 인증 페이지에서 확인 버튼 클릭하기 How to automate webhacking.kr with Python © 조근영 2015 147
  • 148. Class & Methods class webHacking(object): def __init__(self): def __del__(self): def login(self): def view_challenge(self): def print_problem_source(self, num): def print_index_phps(self, src='index.phps'): def auth(self, answer): def accept_alert(self): How to automate webhacking.kr with Python © 조근영 2015 148
  • 149. Mechanize 푹 쉬어! How to automate webhacking.kr with Python © 조근영 2015 149
  • 150. 근데 느꼈나..? How to automate webhacking.kr with Python © 조근영 2015 150
  • 151. 처음부터 저렇게 짜임새있는 구조가 나온건 아니야. 삽질 하다보니까 저렇게 하면 편할것 같아서 나온 구조.. How to automate webhacking.kr with Python © 조근영 2015 151
  • 152. 즉, 생각의 산물 더 알고 싶으신 분은 Refactoring 참고 How to automate webhacking.kr with Python © 조근영 2015 152
  • 153. Demo Time How to automate webhacking.kr with Python © 조근영 2015 153
  • 154. 내가 공부한 Resources 1. Selenium with Python 2. Selenium Testing Tools Cookbook How to automate webhacking.kr with Python © 조근영 2015 154
  • 155. 포켓몬 사진 출처 포켓몬스터 베스트위시 시즌2 23화 사토시 대 코테츠! 비밀병기 사잔드 라!! 리뷰 포켓몬스터 베스트위시 시즌2 24화 결착 잇슈리그! How to automate webhacking.kr with Python © 조근영 2015 155
  • 156. 포켓몬 모티브 덕들은 성장하는 게임을 좋아하잖아?ㅎㅎ 그리고 생각의 흐름을 표현해주는 문서가 그렇게 많지 않더라고 1차 감수는 애자일 과정을 진행하시는 김창준님께! How to automate webhacking.kr with Python © 조근영 2015 156
  • 157. 사전 지식 • 이 지식이 없으면 엄청난 삽질 동반함! • virtualenv • pip • HTTP, CSS, JS • 웹 서버 구조 How to automate webhacking.kr with Python © 조근영 2015 157
  • 158. 나중에 추가할 내용들 • print_problem_source, print_index_phps 설명(ppt 만드는 시간 이 꽤 많이 든다. 40시간 정도 쓴듯.) • Proxy 적용해서 파라미터 변조(이게 제일 감이 안 잡힘) • 어쩔 수 없이 Fiddler나 Burp Suite를 써야할듯 • XSS • SQL Injection • sqlmap How to automate webhacking.kr with Python © 조근영 2015 158
  • 159. 감사합니다 How to automate webhacking.kr with Python © 조근영 2015 159
  • 160. Q&AHow to automate webhacking.kr with Python © 조근영 2015 160