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')));--
두 결과 값을 이어붙이면 완전한 플래그 값을 얻게 된다.
'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 |