사용자 입력의 검증 부족: 사용자 입력값을 SQL 쿼리에 직접 포함하여 실행할 때, 입력값을 제대로 검증하지 않습니다.
불완전한 쿼리 파라미터화: XPath 쿼리에서 placeholder를 사용하여 사용자 입력값을 바인딩하지 않고 직접 쿼리에 포함시키는 경우 취약점이 발생합니다.
' or '1' ='1(참)입력 ' or '1' ='2(거짓)입력으로 참 거짓 값의 결과가 다르게 나타나는지 확인
입력해서 에러가 발생하는지 확인
' or count(parent::*[position()=1])=0 or 'a'='b
' or count(parent::*[position()=1])>0 or 'a'='b
1 or count(parent::*[position()=1])=0
1 or count(parent::*[position()=1])>0
count(parent::*[position()=1])=0해석
| 구성요소 | 설명 |
|---|---|
parent::* | 현재 노드의 부모 노드를 선택합니다 |
[position()=1] | 부모 노드의 첫 번째 위치를 선택합니다 |
count(...) | 선택된 노드의 수를 계산합니다. |
count(parent::*[position()=1])=0 | 부모 노드가 존재하지 않거나, 첫 번째 부모 노드의 수가 0인 경우 참으로 평가됩니다. |
XML데이터를 사용할 만한 곳에 TEST 합니다.
만약 참거짓 TEST의 결과가 다르게 나타나거나 에러가 발생하면 아래 쿼리를 사용합니다.
2.1 민감한 데이터 유출
사용자 목록 조회: input_username(입력값)' or '1'='1
관리자 계정정보 추출: admin' or '1'='1
2.2 인증 우회
인증 우회: ' or '1'='1' and password/text() = '
모든 사용자 인증 우회: input_username(입력값)' and password/text() = '' or '1'='1
| 설명 | |
|---|---|
| 대상 | 웹어플리케이션 소스코드, 웹 방화벽 |
| 판단기준 | 양호 쿼리 입력 값에 대한 검증이 이루어지는 경우 |
| 취약 쿼리 입력 값에 대한 검증이 이루어지지 않는 경우 | |
| 조치방법 | 쿼리 입력 값에 대한 검증 로직 추가 구현 |