티스토리 뷰
가. 원인
- 외부입력값을 검증없이 XPath 쿼리문 생성에 사용된 경우
나. 영향
- 쿼리문의 의미 및 구조를 변경하여 임의의 쿼리를 실행
- 인가되지 않은 데이터를 열람
다. 보안대책
- 외부입력값에 특수문자( " [ ] / = @ 등 ) 및 쿼리 예약어를 필터링
- XPath대신 파라미터화된 쿼리문을 지원하는 XQuery 표현식을 사용
라. 안전한 코드
1. 입력값 필터링
String name = props.getProperty("name").replaceAll(" [ ', \\[ ] ", "" ); String pass = props.getProperty("pass").replaceAll(" [ ', \\[ ] ", "" ); String query = "//users/user[login/text()='" + name + "' and password/text()='" + pass + "']/home_dir/text()"; ... XPathExpression expr = xpath.compile( query ); Object result = expr.evaluate(doc, XPathConstants.NODESET); ...
|
String name = request.getParameter("name"); name = name.replaceAll( "[ ( ) \\-'\\ [ \\ ] : , */ ]", ""); String query = "//food[name='" + name + "']/price"; ... NodeList nodes = (NodeList) xpath.evaluate(query, doc, XPathConstants.NODESET); ...
|
2. 파라미터화된 XQuery 사용
/* login.xq 파일 내용 declare variable $loginID as xs:string external; declare variable $password as xs:string external; //users/user[@loginID=$loginID and @password=$password] */
String name = props.getProperty("name"); String pass = props.getProperty("pass"); Document doc = new Builder().build("user.xml"); XQuery xquery = new XQueryFactory().createXQuery(new File("login.xq")); Map vars = new HashMap(); vars.put("loginID", name); vars.put("password", pass); Nodes results = xquery.execute(doc, null, vars).toNodes(); ...
|
마. 진단방법
<입력값 검증>
1. XPath 객체를 통해 쿼리스트링이 컴파일 되는 부분을 확인
2. XPath 쿼리스트링에 외부입력값이 사용되는지 확인
3. 외부입력값에 대해 필터링이 적용되었는지 확인
바. 정/오탐 케이스
<정탐 케이스>
1. 검증없이 입력값이 쿼리문 생성에 사용될 경우
'Web Analytics > SW 보안약점 진단원' 카테고리의 다른 글
[구현보안] 입력 데이터 검증 및 표현 10 - 크로스사이트 요청위조 (0) | 2019.10.02 |
---|---|
[구현보안] 입력 데이터 검증 및 표현 09 - LDAP 삽입 (0) | 2019.10.02 |
[구현보안] 입력 데이터 검증 및 표현 07 - XQuery 삽입 (0) | 2019.10.01 |
[구현보안] 입력 데이터 검증 및 표현 06 - 신뢰되지 않는 URL주소로 자동 접속 연결 (0) | 2019.09.30 |
[구현보안] 입력 데이터 검증 및 표현 05 - 위험한 형식 파일 업로드 (0) | 2019.09.30 |
- Total
- Today
- Yesterday