'0x00 전체 보기'에 해당되는 글 101건
- 2018.02.21 [webhacking.kr] prob51(250pt) 1
- 2018.02.21 [webhacking.kr] prob45(550pt)
- 2018.02.21 [webhacking.kr] prob26(100pt)
- 2018.02.21 [webhacking.kr] prob5(300pt)
- 2018.02.21 [webhacking.kr] prob33(200pt)
- 2018.02.21 [webhacking.kr] prob4(150pt)
- 2018.02.21 [webhacking.kr] prob1(200pt)
- 2018.02.20 [pwnable.kr] rsa_calculator(200pt)
- 2018.01.26 [webhacking.kr] prob46(300pt)
- 2018.01.26 [webhacking.kr] prob25(150pt)
## prob51(web, 250pt)
[Main]
51번 문제는 간단한 sql injection문제인데, 입력한 문자열이 md5 해시 값으로 변한다는 특징이 있습니다. md5 sql injection은 유명하므로 검색하면 정말 많이 나옵니다. 우선 문제 페이지를 살펴보면 아래 [그림 1]과 같고 해당 페이지 내 source 링크를 클릭하면 php 소스코드가 아래 [그림 2]와 같이 나옵니다.
[그림 1] 문제 페이지
[그림 2] index.phps
우선 소스 코드를 보면 입력할 수 있는 벡터는 총 2개($_POST[id], $_POST[pw])입니다. 이 두 벡터 중 $_POST[id]부분에 sql injection을 성공시키기 위해서는 magic_quotes_gpc를 우회해야하는데, mb_convert_encoding()함수가 없어, 우회할 수 없습니다. 따라서 $_POST[pw]를 공략해야하는데, 이 파라미터에는 입력 값이 md5()함수를 통해 md5해시 값이 저장됩니다.
이는 md5 sql injection으로 유명한데 md5해시 값이 single quote(')와 "="의 값을 가지는 hash 값을 가지도록 만들면 됩니다. 즉 예를 들면 "select id from challenge_51_admin where id='admin' and pw='????'='???????'"과 같은 식으로 sql injection을 시키면 됩니다. 그러면 문제가 풀리는데 "'='"가 포함되는 md5 hash 값을 찾으려면 검색해도 되고 0부터 9999999까지 for문을 돌리면서 직접 php코드를 짜도됩니다.
[그림 3] Congratulations~!
'Wargame > webhacking.kr' 카테고리의 다른 글
[webhacking.kr] prob45(550pt) (0) | 2018.02.21 |
---|---|
[webhacking.kr] prob26(100pt) (0) | 2018.02.21 |
[webhacking.kr] prob5(300pt) (0) | 2018.02.21 |
[webhacking.kr] prob33(200pt) (0) | 2018.02.21 |
[webhacking.kr] prob4(150pt) (0) | 2018.02.21 |
## prob45(web, 550pt)
[Main]
45번 문제는 sql injection 문제라고 문제 페이지에 나와있었습니다. 우선 문제 페이지와 소스코드를 보면 아래 [그림 1], [그림 2]와 같습니다.
[그림 1] 문제 페이지
[그림 2] index.phps
우선 admin으로 로그인하기 위해 "select id from members where id='$_GET[id]' and pw=md5('$_GET[pw]')" 문에서 sql injection을 시켜 결과 값이 admin이 되도록 해야합니다. 각각의 GET방식의 변수에는 별도의 필터링이 걸려있는데, "select id from members where id='asdf' or id='admin'#' and pw=md5('asdf')"과 같은 식으로 injection을 하면 될 것이라고 생각했습니다.
하지만 $_GET[id]에는 admin이 필터링으로 걸려 있기 때문에 "select id from members where id='asdf' or id=0x61646d696e#' and pw=md5('asdf')"와 같이 고쳐 우회할 수 있습니다. 하지만 한 가지 문제가 더 있습니다. php의 설정 중 magic_quotes_gpc가 on으로 되어 있으면 single_quote('), double_quote("), slash(/)가 입력되면 그 앞에 "\"(역슬래시)가 붙어 문자열로 인식시켜주는 sql injection 보호기법 입니다. 그런데 이 문제는 이 보호기법이 걸려있었습니다.
그래서 이를 우회할 수 있는 취약점이 php의 함수 중 mb_convert_encoding()이라는 함수에 있습니다. 이 함수는 문자열의 인코딩 방식을 변경하는 php 함수입니다. 취약점은 2바이트가 멀티바이트로 인식되어 일반적인 아스키로 표시할 수 없는 문자를 표시하도록 하는 곳에 있습니다. 예를 들면 "%aa\"가 하나의 문자로 인식되어 버리는 것입니다.
따라서 "select id from members where id='%aa' or id=0x61646d696e#' and pw=md5('asdf')"와 같이 입력하면 "select id from members where id='%aa\' or id=0x61646d696e#' and pw=md5('asdf')"로 변하면서 "\"(백슬래시)때문에 single quote가 문자열로 인식되는것을 막을 수 있습니다. 이렇게 쿼리를 날리면 아래 [그림 3]과 같이 문제가 풀리게 됩니다.
[그림 3] Conratulations~!
'Wargame > webhacking.kr' 카테고리의 다른 글
[webhacking.kr] prob51(250pt) (1) | 2018.02.21 |
---|---|
[webhacking.kr] prob26(100pt) (0) | 2018.02.21 |
[webhacking.kr] prob5(300pt) (0) | 2018.02.21 |
[webhacking.kr] prob33(200pt) (0) | 2018.02.21 |
[webhacking.kr] prob4(150pt) (0) | 2018.02.21 |
## prob26(web, 100pt)
[Main]
26번 문제는 url encoding에 관한 문제였습니다. 우선 문제 페이지에 들어가면 index.phps라는 링크를 주어 php소스를 제공하고 있습니다. 문제 소스코드는 아래 [그림 1]과 같습니다.
[그림 1] index.phps
우선 소스코드를 분석해보면 정말 간단합니다. GET방식으로 id라는 파라미터에 값을 받고, eregi()함수로 "admin"이라는 문자열이 포함되면 "<p>no!"라는 문자열을 출력하고 종료합니다. 하지만 아래 if문을 보면 $_GET[id]가 admin이어야 문제가 풀리게 되는데, urldecode()함수를 거친 값이 "admin"값이 되면 됩니다. 따라서 "admin"이라는 값을 보내는 것이 아니라 "%61%64%6d%69%6e"라는 값을 보내야 합니다. 하지만, 브라우저의 주소창에서 "%"와 같은 예약어를 자동으로 해석해서 decode를 시켜주기 때문에 결국 "admin"이라는 값이 서버에 전송됩니다. 따라서 "%"도 url encode하여 서버에 보내야 최종적으로 서버에 "%61%64%6d%69%6e"라는 문자열이 전송되고, 이게 urldecode()함수를 통해 "admin"으로 변환되게 될 것입니다. 따라서 "%2561%2564%256d%2569%256e"이렇게 보내면 아래 [그림 2]와 같이 문제가 풀리게 됩니다.
[그림 2] Congratulations~!
참고로 url encoding에 관한 글은 아래 url에서 참조할 수 있습니다.
1) http://regularmotion.kr/url-encoding-url/
2) https://bluestarblogkr.blogspot.kr/2011/10/url-encoding.html
'Wargame > webhacking.kr' 카테고리의 다른 글
[webhacking.kr] prob51(250pt) (1) | 2018.02.21 |
---|---|
[webhacking.kr] prob45(550pt) (0) | 2018.02.21 |
[webhacking.kr] prob5(300pt) (0) | 2018.02.21 |
[webhacking.kr] prob33(200pt) (0) | 2018.02.21 |
[webhacking.kr] prob4(150pt) (0) | 2018.02.21 |
## prob5(web, 300pt)
[Main]
5번 문제는 로그인 버튼과 회원가입 버튼이 있는 문제였고, 특별히 php 소스코드가 주어지진 않았습니다. 우선 문제 페이지를 보면 아래 [그림 1]과 같습니다.
[그림 1] 문제 페이지
login 버튼을 누르면 로그인 페이지로 넘어가고 join 버튼을 누르면 "Access Denied"라는 alert박스가 뜨게 됩니다. 우선 id, pw를 모르므로 login 버튼을 눌러 넘어가는 "mem/login.php"페이지에서는 특별히 할 것이 없었습니다. admin으로 로그인을 하기 위해 id:admin, pw:????를 입력해보았지만, 비밀번호가 틀렸다고 나옵니다.
[그림 2] login.php
[그림 3] wrong password
[그림 4] join버튼 클릭 시
일단 join버튼이 막혀있어서 회원가입 페이지를 찾아야 된다고 생각했습니다. login버튼을 클릭하면 "/mem/login.php"로 넘어가므로 join버튼을 클릭하면 원래라면 "/mem/join.php"라는 페이지로 넘어가지 않을까라는 생각에 "/mem/join.php"에 접속해보니 아래 [그림 5]와 같이 페이지는 존재하지만 아무 결과도 보여주지 않았습니다.
[그림 5] /mem/join.php
그래서 소스코드를 보았더니 아래 [그림 6]과 같이 난독화된 자바스크립트 코드를 볼 수 있었습니다.
[그림 6] 난독화된 자바스크립트
일단 저 난독화된 자바스크립트를 해석하기 위해 크롬의 개발자 도구를 켜고 console창에다가 위 스크립트 중 마지막 alert("access_denied"); 뒷 부분의 else 블럭을 입력하면 아래 [그림 7]과 같이 숨겨진 창이 나타나게 됩니다.
[그림 7] /mem/join.php
이제 회원가입을 할 수 있게 되었습니다. admin으로 가입을 해서 admin으로 로그인을 하려고 했는데 아래 [그림 8]처럼 이미 있는 아이디라고 나옵니다.
[그림 8] admin 회원가입 실패
그래서 이를 우회하기 위해서 예전 어디선가 풀어본 문제 중에 admin 중복체크를 우회하고 db에 저장시에는 "admin"이 insert되도록 하는 문제가 있었습니다. "admin " 이런 식으로 id부분에 적으면 중복 체크는 우회가 되고, db에 insert될 때에는 공백이 제거되고 insert 됩니다. 이런 방식으로 했더니 아래 [그림 9]와 같이 admin으로 회원가입이 가능했습니다.
[그림 9] admin 회원가입
이제 가입을 했으니 아래 [그림 10] 과 같이 로그인을 시도해보았습니다.
[그림 10] Congratulations~!
'Wargame > webhacking.kr' 카테고리의 다른 글
[webhacking.kr] prob45(550pt) (0) | 2018.02.21 |
---|---|
[webhacking.kr] prob26(100pt) (0) | 2018.02.21 |
[webhacking.kr] prob33(200pt) (0) | 2018.02.21 |
[webhacking.kr] prob4(150pt) (0) | 2018.02.21 |
[webhacking.kr] prob1(200pt) (0) | 2018.02.21 |
## prob33(web, 200pt)
[Main]
33번 문제는 뭔가 자잘한 문제들이 여러 개 포함되어 있는 문제였습니다. 우선 문제를 살펴보면 아래 [그림 1]과 같습니다.
[그림 1] 문제 페이지
php 소스코드의 링크가 주어지는데 들어가보면 아래 [그림 2]와 같은 소스코드가 보입니다.
[그림 2] index.phps
소스코드를 보면 "get"파라미터로 "hehe"라는 값이 들어오면 다음 stage로 가는 href 링크가 주어지는 형식이었습니다. 이 조건을 만족시켜주면 아래 [그림 3]과 같이 stage1을 클리어하고 stage2로 가는 링크가 주어지게 됩니다.
[그림 3] stage1 Clear!
이런 식으로 한 단계씩 클리어해 나가면 되는 문제였습니다. stage2는 post변수의 값을 체크하는 조건이 있었고, 이는 burp suite라는 프록시 툴을 이용해 만족시킬 수 있습니다. stage3은 get방식으로 myip라는 인자를 받고, 해당 값과 $_SERVER[REMOTE_ADDR] 변수와 비교하는 조건이 있었습니다. $_SERVER[REMOTE_ADDR]는 공인 IP가 기록되어 있으므로 자신의 공인 아이피를 잘 확인해서 myip라는 인자로 GET방식으로 넘기면 클리어 되었습니다.
이 후 수동으로 하다가 점점 힘들어져 python 스크립트를 이용하여 문제를 풀었습니다.
[prob33.py]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 | # -*- coding: utf-8 -*- import requests from time import time import hashlib header = {'Cookie':'PHPSESSID=XXXXXXXXXXXXXX',} if __name__ == '__main__': ## Stage 4 url = "http://webhacking.kr/challenge/bonus/bonus-6/l4.php" m = hashlib.md5() get_time = str(int(time())); print get_time m.update(get_time) params = {'password':m.hexdigest()} req = requests.get(url = url, params = params, headers = header) print req.text ## Stage 5 url = "http://webhacking.kr/challenge/bonus/bonus-6/md555.php?imget=1" header = {'Cookie':'imcookie=1; PHPSESSID=XXXXXXXXXXXXXX',} params = {'impost':'1'} req = requests.post(url = url, data = params, headers=header) print req.text ## Stage 6 url = "http://webhacking.kr/challenge/bonus/bonus-6/gpcc.php" header = {'Cookie':'test='+hashlib.md5("XX.XX.XX.XX").hexdigest()+'; PHPSESSID=XXXXXXXXXXXXXX',} params = {'kk':hashlib.md5("python-requests/2.18.4").hexdigest()} req = requests.post(url = url, data = params, headers=header) print req.text ## Stage 7 url = "http://webhacking.kr/challenge/bonus/bonus-6/wtff.php" header = {'Cookie':'PHPSESSID=XXXXXXXXXXXXXX',} params = {'1641257031':'1641257031'} req = requests.get(url = url, params = params, headers = header) print req.text ## Stage 8 url = "http://webhacking.kr/challenge/bonus/bonus-6/ipt.php" header = {'Cookie':'PHPSESSID=XXXXXXXXXXXXXX',} params = {'addr':'127.0.0.1'} req = requests.get(url = url, params = params, headers = header) print req.text ## Stage 9 url = "http://webhacking.kr/challenge/bonus/bonus-6/nextt.php" header = {'Cookie':'PHPSESSID=XXXXXXXXXXXXXX',} ans = "" for i in xrange(97, 122, 2): ans += chr(i) params = {'ans':ans} req = requests.get(url = url, params = params, headers = header) print req.text | cs |
대충 이와 같은 식으로 풀면 되는데, stage10번과 같은 경우 php를 온라인에서 실행시켜주는 사이트를 이용하면 쉽게 풀 수 있었습니다. 자신의 IP와 같이 개인별로 답이 다를 수 있어 위 코드를 실행시키면 제대로 클리어하지 않을 수 있으니 각 스테이지별 php 소스코드를 확인하시고, 조건에 맞게 맞춰주셔야 합니다.
'Wargame > webhacking.kr' 카테고리의 다른 글
[webhacking.kr] prob26(100pt) (0) | 2018.02.21 |
---|---|
[webhacking.kr] prob5(300pt) (0) | 2018.02.21 |
[webhacking.kr] prob4(150pt) (0) | 2018.02.21 |
[webhacking.kr] prob1(200pt) (0) | 2018.02.21 |
[webhacking.kr] prob46(300pt) (0) | 2018.01.26 |
## prob4(web, 150pt)
[Main]
4번 문제는 별도의 php소스코드나 html 소스코드를 볼 필요가 없었던 문제입니다. 단순히 base64 인코딩 방식을 알고 있는지를 묻는 문제였습니다.
우선 문제 페이지를 살펴보면 아래 [그림 1]과 같습니다.
[그림 1] 문제 페이지
뭔가 알 수 없는 문자열이 보이고 아래에 password를 입력하고 제출 버튼을 누르면 될 것 같았습니다. 우선 위의 문자열은 제일 마지막에 "=="값으로 끝나는 점, 인코딩된 문자열의 범위 등을 보았을 때 대충 base64라는 것을 눈치챌 수 있습니다. 그래서 이 문자열을 간단히 python으로 디코드 해보면 아래 [그림 2]와 같습니다.
[그림 2] base64 decode
그래서 나온 디코드된 값을 password에 입력했더니 아무 반응이 없었습니다. 아마 base64로 디코드 시킨 후 나온 결과도 hash값인 것 같으니 decrypt해줘야 한다고 생각했고, 대충 online hash decrypter를 이용해 아래 [그림 3]과 같이 decrypt해주면 sha1방식의 hash인 것을 알 수 있었고, decrypt결과 또 hash값이 나왔습니다.
[그림 3] base64 -> sha1 -> ??? decode
나온 값이 또 hash처럼 보입니다. 당연히 password에 입력해보았지만 아무 반응이 없어서, 다시 한번 decrypt해주었습니다. 그랬더니 아래 [그림 4]의 결과가 나왔습니다.
[그림 4] base64 -> sha1 -> sha1
결국 답은 "test"이었습니다.
'Wargame > webhacking.kr' 카테고리의 다른 글
[webhacking.kr] prob5(300pt) (0) | 2018.02.21 |
---|---|
[webhacking.kr] prob33(200pt) (0) | 2018.02.21 |
[webhacking.kr] prob1(200pt) (0) | 2018.02.21 |
[webhacking.kr] prob46(300pt) (0) | 2018.01.26 |
[webhacking.kr] prob25(150pt) (0) | 2018.01.26 |
## prob1(web, 200pt)
[Main]
1번 문제는 쿠키 값을 조작해 조건을 통과시키는 문제입니다. 소스코드는 아래 [그림 1]과 같습니다.
[그림 1] index.phps
eregi()함수를 이용해 "user_lv"라는 쿠키 값을 필터링하는데 5보다 크고 6보다 작은 값이어야
하므로 "5.5"로 user_lv 쿠키 값을 세팅했더니 문제가 풀렸습니다.
[그림 2] Congratulations~!
'Wargame > webhacking.kr' 카테고리의 다른 글
[webhacking.kr] prob33(200pt) (0) | 2018.02.21 |
---|---|
[webhacking.kr] prob4(150pt) (0) | 2018.02.21 |
[webhacking.kr] prob46(300pt) (0) | 2018.01.26 |
[webhacking.kr] prob25(150pt) (0) | 2018.01.26 |
[webhacking.kr] prob20(200pt) (0) | 2018.01.19 |
## prob46(web, 300pt)
[Main]
46번 문제는 sql injection 문제였는데 mysql의 string관련 내장함수를 잘 이용하거나 mysql특징을 잘 알면 풀 수 있는 문제였습니다. 우선 문제를 보도록 하겠습니다.
[그림 1] 문제 페이지
우선 대놓고 문제 페이지에서 SQL INJECTION이라고 적혀있습니다. 소스코드보기를 하면 index.phps가 주석으로 나와 있는데 index.phps에서 페이지 소스를 보면 아래 [그림 2]와 같습니다.
[그림 2] index.phps
위 소스코드를 잘 보면 공백 문자, '/', '*', '%'를 str_replace()함수로 필터링하고 있으며, 아래 eregi()함수를 이용하여 "union", "select", "from", "challenge", "0x", "limit", "cash" 문자열들을 필터링하고 있습니다. 그리고 그 아래에서는 가장 중요한 sql 쿼리문("select id, cash from members where lv=$_GET[lv]")이 보입니다. 우선 lv에 0도 넣어보고, 1도 넣어보고, 2도 넣어보고 해봤는데 1만 값이 출력되는 걸로 봐서, lv가 1인 경우밖에 없나보다라고 생각했습니다.
자, 이제 sql injection을 할 차례입니다. 처음에는 lv변수가 숫자이므로 싱글 쿼터를 쓰지 않아도 된다는 점은 좋았습니다.(왜냐하면.. 싱글 쿼터를 써봤는데 아래 싱글쿼터가 php의 보안 설정인 magic_quotes_gpc가 on되어 있어서 싱글쿼터 앞에 '\'를 자동으로 붙이게 되어 sql 쿼리문에서 먹히지 않았습니다...) 그래도 문제를 쉽게 풀려면 "select id, cash from members where lv=0 or id='admin'"이렇게 해야하지만 싱글쿼터를 쓸 수 없으니.. 이 방법은 빠르게 접었습니다. 그리고 우선은 공백 문자 필터링을 우회해야하는데 처음엔 '%'를 필터링하니까 %0a를 사용할 수 없겠구나 라고 생각했지만 해보니 됐습니다.(왜 그런지는 아직 잘..) 이렇게 %0a로 공백문자를 우회하고 나니까 "select id, cash from members where lv=0%0aor%0alv=1"과 같은 식의 injection을 테스트 할 수 있었습니다. 잘 먹히는게 확인되었습니다.
그래서 싱글쿼터를 안하고 이것 저것 시도해보다가 "select id, cash from members where lv=1%0aand%0alength(id)=8"과 같은 구문을 시도해봤는데 아래 [그림 3]과 같이 [그림 1]과는 길이가 8인 다른 아이디가 출력되는 것을 확인할 수 있었습니다.
[그림 3] 첫 번째 시도
흠.. 생각해보니까 MySql에서 싱글쿼터를 쓰지 않고 문자를 표현할 때 'admin'=0x61646D696E 처럼 16진수로 나타내도 된다고 알고 있는데, "0x"가 필터링 되서 못쓴다고 생각했지만 0x가 되면 0b도 되지 않을까 해서 아래 [그림 4]와 같이 "select id, cash from members where lv=1%0aand%0aid=0b110000101100100011011010110100101101110"을 입력했더니 문제가 풀렸습니다.
[그림 4] Congratulation(1)
흠 근데 생각해보니 mysql의 string관련 내장 함수를 쓰면 이렇게 말고도 풀 수 있을 것 같아 https://dev.mysql.com/doc/refman/5.7/en/string-functions.html 여기를 뒤적거리다보니 쓸만한 함수가 나왔습니다. char()함수입니다. 위 url의 메뉴얼에 따르면 char(97,100,109,105,110)='admin'이라고 합니다. 그래서 아래 [그림 5]처럼 injection하면 짜잔! 풀립니다.
[그림 5] Congratulation(2)
'Wargame > webhacking.kr' 카테고리의 다른 글
[webhacking.kr] prob4(150pt) (0) | 2018.02.21 |
---|---|
[webhacking.kr] prob1(200pt) (0) | 2018.02.21 |
[webhacking.kr] prob25(150pt) (0) | 2018.01.26 |
[webhacking.kr] prob20(200pt) (0) | 2018.01.19 |
[webhacking.kr] prob8(350pt) (0) | 2018.01.18 |
## prob25(web, 150pt)
[Main]
25번 문제는 널 바이트를 이용하는 문제였습니다. 생각보다 많이 어렵진 않았지만 하마터면
엄청 삽질할 뻔했습니다...
우선 문제를 보도록 하겠습니다.
[그림 1] 문제 페이지
문제 페이지를 보면 뭔가 리눅스의 "ls" 명령의 결과 처럼 보이는 파일들 목록이 보이고, 아래에는 "hello world"라는 문자열이 보입니다. 그리고 URL을 봤더니 "~/?file=hello"라고 되어 있습니다.
저는 여기서 뭔가 GET방식의 파라미터 file변수로 받은 값에 ".txt"를 붙여서 파일을 read하고 보여주는 구나~ 라고 생각했습니다. 그런데 read하는 방식은 exec()함수(?) php에서 명령어를 실행하는 함수를 사용하는 줄 알고 "/?file=index.php;"이런식으로 커맨드 인젝션이 될 줄 알고 해보았습니다. 그런데 password.php도 안되고 다 안되서 실패!
두 번째로 생각해낸 방식은 예전에 어디서 LFI문제에서 php의 filter기능을 쓰는 것을 본적이 있는 것 같아서 검색해보았더니 대충 "?var=php://filter/convert.base64-encode/resource=index"이런식으로 사용하는 것이었습니다.(참고 : http://www.php.net/manual/en/filters.php) 이외에도 여러 php의 필터방식을 이용하여 파일을 읽는 방식을 이용해보았지만 실패했습니다.
마지막 세번째로.. 생각해낸 방식은 파일이름 뒤에 ".txt"가 붙여져서 파일을 read하는데 앞에 NULL문자인 %00을 넣으면 어떨까? 라고 생각하고 "/?file=index.php%00"을 넣었더니.. 아무 반응이 없었습니다. 여기서 %00이 아닌지 알고 넘어갔으면 한참동안 삽질할뻔 했으나.. "/?file=password.php%00"을 넣으니 아래 [그림 2]와 같이 파일이 읽혔습니다!
[그림 2] Congratulation!
'Wargame > webhacking.kr' 카테고리의 다른 글
[webhacking.kr] prob1(200pt) (0) | 2018.02.21 |
---|---|
[webhacking.kr] prob46(300pt) (0) | 2018.01.26 |
[webhacking.kr] prob20(200pt) (0) | 2018.01.19 |
[webhacking.kr] prob8(350pt) (0) | 2018.01.18 |
[webhacking.kr] prob21(250pt) (0) | 2018.01.13 |