첫 화면은 HEADER INJECTION이라고 떡하니 힌트를 주고 있다.

그래서 HEADER INJECTION에 관해 검색해보니

공격자가 헤더에 개행문자를 삽입해 헤더를 추가하여 공격하는 수동적 공격방식으로

이 공격이 허용되는 경우 쿠키를 임의대로 생성하거나 임의로 URL을 리다이렉트 시킬수 있다고 한다.

형식은

webhacking.kr/?id=gamja 가 원문이라면

webhacking.kr/?id=gamja %0dSet-Cookie: id=gamja 

이렇게 주입시키면 id=gamja가 생성된다.

그래서 그대로 대입해보니 왜그런지 "페이지 로딩이 잠시 지연되었습니다. "만 뜬다....

그래서 다른방법이 있나 찾던 차에

Set-Cookie자리에 clear를 넣어주는 방식이 있는 것을 찾았다. 

그래서 이대로 넣어주니

52번도 클리어


'WebHacking > Webhacking.kr' 카테고리의 다른 글

Webhacking.kr 18번  (0) 2017.12.27
Webhacking.kr 39번  (0) 2017.12.27
Webhacking.kr 47번  (0) 2017.11.18
Webhacking.kr 38번  (0) 2017.11.18
Webhacking.kr 42번  (0) 2017.11.13

47번문제를 들어가 보았다.

미리 알리지만 제출 버튼 옆에 클릭하면 input할수있는 슬롯이 있다.

나는 아무것도 없는 건줄 알고 계속 찾았다....

여기서 메일의 기본 구조는 

(받는사람, 제목, 내용, 헤더)으로 되어 있다.

소스를 보니 email이라는 값이 우리가 빈 슬롯에 넣는 값이고

그것이 헤더가 되어서 받는 사람이

admin@webhacking.kr로 보내게 된다.

그래서 우리는 그것을 우리도 받아봐야 한다.

그렇기 때문에 헤더를 조정해야 하는데 그것을 하기위해서는 툴이 필요하다.

우선 Falcon Proxy로 인터넷이 프록시를 이용하도록 하고

burp suite으로 받아보고 수정해야 한다.

그 두개의 툴을 사용해 헤더를 변경해 주어야 한다.

이렇게 Falcon Proxy로 프록시 사용을 설정해 주고나서

burp suite으로 interface on을 해주면 내가 보낸것을 잡아올수 있는데 이때 우리는 우리도 메일을 볼 수있게 해야한다.

그중 한 방법이 cc라고 한다.

<cc(Carbon Copy, 참조) : 수신자 외 다른 사람에게도 수신>

이것으로 헤더에 추가해주면 cc:뒤에 붙은 사람에게도 메일이 수신되게 된다.


이렇게 변경한 후에 메일을 전송되게 interface off를 해주면 문제가 풀리게 된다.

이때 cc앞에 %0d%0a로 앞과 구분시켜주어야 한다.


이렇게 보내면 페이지에서 password를 알려주게 된다.

47번도 클리어!!!


'WebHacking > Webhacking.kr' 카테고리의 다른 글

Webhacking.kr 39번  (0) 2017.12.27
Webhacking.kr 52번  (0) 2017.11.18
Webhacking.kr 38번  (0) 2017.11.18
Webhacking.kr 42번  (0) 2017.11.13
Webhacking.kr 26번  (0) 2017.11.12

LOG INJECTION문제이다.

우선 소스를 보아하니 빈칸에 ID를 넣고 

Login을 하거나

Admin을 누를수 있게 되어 있다.

먼저 ID에 admin을 넣어보니 당연히 안되었다.

그래서 이것 저것을 넣어보다 보니 아무것도 안먹히다가 \null을 넣었더니 ull만 출력되고 \n은 줄 띄우기로

먹혀있었다. 그래서 \n을 넣고 admin을 넣었더니 띄워써졌지만 문제는 풀리지 않았고

그래서 log형식대로 \n해 주고 자신의 id를 넣고 admin을 넣으니

풀렸다.

38번도 클리어!


'WebHacking > Webhacking.kr' 카테고리의 다른 글

Webhacking.kr 52번  (0) 2017.11.18
Webhacking.kr 47번  (0) 2017.11.18
Webhacking.kr 42번  (0) 2017.11.13
Webhacking.kr 26번  (0) 2017.11.12
Webhacking.kr 24번  (0) 2017.11.12
import re
# (5.12-2.74+0.24)*(3.15-2.0) + 1.12*4.09 를 postfix로 구현
lis = []
expression = "(5.12-2.74+0.24)*(3.15-2.0) + 1.12*4.09"
expression = re.sub('([\+\-\*\/\(\)])' , ' \g<1> ' , expression)
calc = expression.split()
for k in calc:
    if k == '(':
        lis.append(k)
    elif k == '+' or k == '-':
        if '*'in lis or '/' in lis or '+' in lis or '-' in lis:
            temp = lis.pop()
            if temp == '(' :
                lis.append(temp)
                lis.append(k)
            else:
                lis.append(temp)
                print(lis.pop(), end=" ")
                lis.append(k)
        else:
            lis.append(k)
    elif k == '*' or k == '/':
        if '*'in lis or '/' in lis:
            print(lis.pop(), end=" ")
            lis.append(k)
        else:
            lis.append(k)
    elif k == ')':
        while lis:
            t=lis.pop()
            if t == '(':
                continue
            else:
                print(t, end=" ")
    else:
        print(k, end=" ")
while lis:
    print(lis.pop(), end=" ")
 
print("\n")
 
#(5*(3+4)-5.12/2.33)-1.23*100)를 postfix로 구현
lis = []
expression = "(5*(3+4)-5.12/2.33)-1.23*100)"
expression = re.sub('([\+\-\*\/\(\)])' , ' \g<1> ' , expression)
calc = expression.split()
for k in calc:
    if k == '(':
        lis.append(k)
    elif k == '+' or k == '-':
        if '*'in lis or '/' in lis or '+' in lis or '-' in lis:
            temp = lis.pop()
            if temp == '(' :
                lis.append(temp)
                lis.append(k)
            else:
                lis.append(temp)
                print(lis.pop(), end=" ")
                lis.append(k)
        else:
            lis.append(k)
    elif k == '*' or k == '/':
        if '*'in lis or '/' in lis:
            print(lis.pop(), end=" ")
            lis.append(k)
        else:
            lis.append(k)
    elif k == ')':
        while lis:
            t=lis.pop()
            if t == '(':
                continue
            else:
                print(t, end=" ")
    else:
        print(k, end=" ")
while lis:
    print(lis.pop(), end=" ")
print("\n")
 
#postfix계산기 구현
lis = []
expression = input("계산식을 입력하시오 : ")
expression = re.sub('([\+\-\*\/\(\)])' , ' \g<1> ' , expression)
calc = expression.split()
for k in calc:
    if k == '(':
        lis.append(k)
    elif k == '+' or k == '-':
        if '*'in lis or '/' in lis or '+' in lis or '-' in lis:
            temp = lis.pop()
            if temp == '(' :
                lis.append(temp)
                lis.append(k)
            else:
                lis.append(temp)
                print(lis.pop(), end=" ")
                lis.append(k)
        else:
            lis.append(k)
    elif k == '*' or k == '/':
        if '*'in lis or '/' in lis:
            print(lis.pop(), end=" ")
            lis.append(k)
        else:
            lis.append(k)
    elif k == ')':
        while lis:
            t=lis.pop()
            if t == '(':
                continue
            else:
                print(t, end=" ")
    else:
        print(k, end=" ")
while lis:
    print(lis.pop(), end=" ")
 
    
        
cs


import re #다양한 종류의 전화번호를 파일에서 검색하기
with open('search.txt','rt',encoding='UTF8') as f: #한글이 포함된 파일에서 읽어들이기
    number = []
    for line in f:
        m = re.findall(r'[(]?(\d\d\d?)[)]?[-\s]?(\d\d\d\d?)-(\d\d\d\d)',line)
        if m:
            for i in m:
                number.append(("<TEL>"+i[0]+'-'+i[1]+'-'+i[2]+"<TEL>")) #형식을 <TEL><TEL>로 바꾸기
    print(number)
with open('number_list','w') as z:
    for k in number:
        z.write(k)
        z.write('\n')
cs


import re
class Node():
    def __init__(self, data=None,left=None,right=None):
        self.data = data
        self.next = list()
        self.left = left
        self.right = right
 
        
    def __str__(self):
        return str(self.data)
    
    def add_child(self, node):
        self.next.append(node)
 
class Tree:
    def __init__(self):
        self.root = Node()
        self.tree = list()
    def Nested_Tree(self,text): #스택을 사용하여 '('와 ')'를 사용해 구현
        stack = list()
        for calc in text:
            if calc == '(':
                stack.append(calc)
            elif calc == ')':
                input_n = stack.pop()
                stack.pop()
                if not stack:
                    self.root = input_n
                    break
                else:
                    k=stack.pop()
                    k.add_child(input_n)
                    #self.tree.append(k)
                    stack.append(k)
            else:
                t= Node(calc)
                stack.append(t)
                self.tree.append(t)
    def PrintLL(self,list):
        for i in range(0,len(list)):
            if not list[i].next:
                continue
            print()
            print(list[i],'--> [', end=" ")
            for j in range(0,len(list[i].next)):
                print("'",list[i].next[j], end="' ")
                if j < len(list[i].next- 1:
                    print(",",end="")
            print("]")
    def left_right(self,tree):
        for i in range(0,len(tree)):
            if not tree[i].next:
                continue
            else:
                tree[i].left = tree[i].next[0]
                for j in range(0,len(tree[i].next)-1):
                    tree[i].next[j].right = tree[i].next[j+1]
    def left_right_print(self,list):
        for i in range(0,len(list)):
            if not list[i].left:
                continue
            print(list[i],'--> [ child : ',list[i].left,', sibling : ', end ='')
            right = list[i].left.right
            while right:
                print(right,' ', end = '')
                right = right.right
            print('] \n')
        
        
if __name__ == "__main__":
    text = "(A(B(C)(D(E)(F)))(G(H))(I(J(K))))"
    text = re.sub('([\(\)])' , ' \g<1> ' , text)
    calc = text.split()
    k = Tree()
    k.Nested_Tree(calc)
  #  print(k.tree[0] ,'-->',k.tree[0].next[0],k.tree[0].next[1])
    print('\n')
    print("ROOT --> ['",k.root,"']")
    k.PrintLL(k.tree)
    print('\n')
    print('left child right sibling structure \n')
    k.left_right(k.tree)
    k.left_right_print(k.tree)
 
    
 
 
 
 
 
 



이번에는 다운받으라는 표시를 해놓고 다운은 받지 못하게 해 놓았다.

그래서 소스를 좀 보니 첫번째 test.txt는

down=dGVzdC50eHQ=라고 되어있고

test.zip은 자바스크립트로 Access Denied를 걸어놓았다.

다른게 없어서

보기에도 base64같은 dGVzdC50eHQ= 를 디코딩 하니

똭 test.txt로 해석되었다. 이건 분명 운명은 아니겠다.

그래서 우리가 다운받고 싶은 test.zip파일을 인코딩해서 down=에다가 넣어주니

파일이 다운되어진다!!!

그런데 암호가 걸려있다.

200점 짜리라 그런가보다.

그래서 암호를 풀수있게 친절히 소스에다가 암호가 숫자만 되어 있다고 말해준 덕분에

이렇게 풀어보니

주소가 나왔고 거기로 들어가니 답이 나오더라.


42번도 클리어~!!!


'WebHacking > Webhacking.kr' 카테고리의 다른 글

Webhacking.kr 47번  (0) 2017.11.18
Webhacking.kr 38번  (0) 2017.11.18
Webhacking.kr 26번  (0) 2017.11.12
Webhacking.kr 24번  (0) 2017.11.12
Webhacking.kr 6번  (0) 2017.10.22

26번은 뭐 꺼멓다.

index.phps를 클릭하면 다른 창으로 넘어간다.

창에는 어떻게 푸는지가 나와있다.

우선 eregi로 admin을 막아놓고 있다.

그리고 urlcode()를 한번 해준값을 id로 받고 그 값이 "admin"이면 패스!

그래서 우선 eregi를 우회하려고 찾아보니

php5.3+부터는 앞에 %00을 붙이면 필터링을 못한다고 한다.

그래서 id = %00admin을 하니 필터링을 한다....

낮은 버전을 사용하나보다.

그래서 우선 

정성스럽게 내 블로그의 urlcode표를 보며

admin을 urlcode로 %61%64%6D%69%6E 이렇게 바꾸어서 넣어보니 안된다...

그래서 webhacking.kr에 url->로 인코딩을 해 바꾸어주니

클리어가 나온다..

webhacking.kr은 php버전이 낮은걸로...

26번도 클리어


'WebHacking > Webhacking.kr' 카테고리의 다른 글

Webhacking.kr 38번  (0) 2017.11.18
Webhacking.kr 42번  (0) 2017.11.13
Webhacking.kr 24번  (0) 2017.11.12
Webhacking.kr 6번  (0) 2017.10.22
Webhacking.kr 4번  (0) 2017.10.22

+ Recent posts