Security/Write Up

[Dreamhack] error based sql injection

2er0127 2023. 6. 11. 18:08

error based sql 인젝션에서는 EXTRACTVALUE 함수를 써야한다고 한다.

 

 

EXTRACTVALUE 함수는 XPath식을 지정하여 XML 문자열에서 추출한 값을 반환한다.

 

 

사용법은 EXTRACTVALUE(xml_frag, xpath_expr) 이다. 

 

두 번째 인수 xpath_expr에 맞지 않는 xml_frag 값이 들어온다면 오류가 발생하는데,

xpath_expr에 SQL 쿼리를 넣으면 오류 발생 시 오류에 쿼리 결과가 포함된다고 한다.

 

 

 

 

예를 들어 데이터베이스명을 추출하는 쿼리는 아래와 같다.

AND extractvalue(1,concat(0x3a,database()));--

 

페이지에는 쿼리문에 맞게 맨 앞에 '를 붙여주었다.

=> SELECT * FROM user WHERE uid='' AND extractvalue(1,concat(0x3a,database()));--

 

 

 

 

xpath_expr가 항상 유효하지 않은 표현식이 되기 위해 concat 함수를 이용하여 콜론(:)을 추가해줘야한다.

아스키 코드표를 보면 콜론(:)의 16진수 표기법이 0x3a이다.

 

마지막에 주석(-- ) 처리를 해주는 것도 잊지말아야 한다.

 

 

 

 

사실 데이터베이스명과 테이블명은 문제 파일에서 확인이 가능해서 바로 공격 쿼리를 짜볼 수 있다.

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

SELECT문을 하나로 합치는 UNION을 사용했고,

xpath_expr 자리에 admin의 upw를 검색하는 SQL 쿼리문을 넣었다.

 

 

 

 

그런데 글자 수 제한이 있는지 플래그가 나오다 말아서 찾아보니 substr() 함수를 사용해볼 수 있었다.

substr(문자열, 시작인덱스, 길이)

 

' union select extractvalue(1, concat(0x3a, (select substr(upw,20,30) from user where uid='admin')));--

 

 

 

두 결과 값을 이어붙이면 완전한 플래그 값을 얻게 된다.

 

 

728x90

'Security > Write Up' 카테고리의 다른 글

[Dreamhack] image-storage  (0) 2023.08.14
[Dreamhack] file-download-1  (0) 2023.08.03
[Dreamhack] Mango  (0) 2023.06.11
[Dreamhack] simple_sqli  (0) 2023.06.04
[Dreamhack] csrf-2  (0) 2023.06.02