티스토리 뷰

반응형

 

 

 

가. 원인

  - 외부입력값을 검증없이 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. 검증없이 입력값이 쿼리문 생성에 사용될 경우

 

반응형
댓글
반응형
최근에 올라온 글
Total
Today
Yesterday