본문 바로가기
3. 웹 애플리케이션 취약점 진단/비박스를 활용한 웹 애플리케이션 취약점 진단

[비박스를 활용한 웹 취약점 진단] 4-1.XML/Xpath 인젝션 [Search]

by Robert8478 2023. 12. 13.

이 페이지는 영화를 장르별로 분류해서 영화 제목만 테이블 형태로 출력한다.

[난이도 하]

위 URL 주소창에 노출된 genre 변수에 ' 를 넣었더니 XML 에러가 출력되었다. 이제 항상 참인 쿼리를 넣어보자.
정상 쿼리에서 contains 함수를 호출하는 페이지이기 때문에 이번에는 소괄호와 []를 사용해서 정상 쿼리를 강제로 닫는 쿼리를 넣을 것이다. XML 호출 시에는 중간에 주석 문자를 입력하지 못하므로 정상 쿼리의 나머지 부분도 문법 오류가 발생하지 않도록 쿼리를 입력하자. contains 함수의 인자는 두개이며 첫 인자에 입력한 문자열이 두번째 인자에 있으면 true 아니면 false를 반환하는 함수이다.

') or 1=1 ][(' or 쿼리를 넣어서 해결하였다. 이처럼 참을 만드는 쿼리는 여러개 찾아서 넣어 시도해 보는것이 좋다.
위 쿼리는 ')] 베이스에 )와 ] 사이에 or 1=1 참 구문을 넣고 [(' 뒤에 or를 넣어준 쿼리이다.
이제 XML DB 내용을 출력하는 쿼리를 입력하자. | 연산자를 사용하여 Xpath 쿼리를 생성해보자.
Xpath에서 | 는 AND 연산자처럼 서로 다른 쿼리를 연결할 때 사용한다. | 연산자로 //* 쿼리를 연결할 것이다.
//* 쿼리는 현재 노드로부터 모든 노드를 조회하는  Xpath 쿼리이다. 정상 쿼리 나머지 부분때문에 문법 오류가 발생하니 | 연산자로 쿼리를 연결한다. | 연산자 뒤에 임의의 문자열을 입력해서 Xpath의 쿼리 문법 규칙을 맞추어 노드명으로 해석하게 만드는 것이다.

')]|//*|hi[('  쿼리를 입력하였더니 heroes 테이블에 존재하는 모든 사용자의 정보를 테이블 형태로 출력했다.
복잡해 보이지만 위의 참 쿼리와 비교해보면 ')] 가 세트로 붙는다고 생각하며 된다. ')] 와 [(' 를 제외하면
|//*|hi 만 남게 된다. | | 사이에 모든 노드를 조회하는 //* 쿼리를 넣은것이고 hi는 임의의 문자열을 넣어 정상 쿼리로 인식시킨 것이다.

[난이도 중,상]
난이도 중, 상에서는 이전 문제와 마찬가지로 xmli_check_1 함수로 필터링된다.
 str_replace 함수를 통해 인젝션에 사용되는 문자가 공백으로 대체되는 필터링을 사용하는 것이다.