발생원인


XQuery를 사용하는 페이지에서 입력값 검증을 하지 않은 경우 발생


영향


데이터 무단 조회, 인증절차 우회



코드예



 안전하기 않은 코드의 예 - JAVA

   // 외부로 부터 입력을 받음

 String name = props.getProperty("name");

  Hashtable env = new Hashtable();

  env.put(Context.INITIAL_CONTEXT_FACTORY  "com.sun.jndi.ldap.LdapCtxFactory");

  env.put(Context.PROVIDER_URL "ldap://localhost:389/o=rootDir");

  javax.naming.directory.DirContext ctx = new InitialDirContext(env);

  javax.xml.xquery.XQDataSource xqds = (javax.xml.xquery.XQDataSource

  ctx.lookup("xqj/personnel");

 Javax.xml.xquery.XQConnection conn = xqds.getConnection();

 String es =   "doc('users.xml')/userlist/user[uname='"  +name + "']";

 

  // 입력값이 Xquery의 인자로 사용

  XQPreparedExpression expr =  conn.prepareExpression(es);

 XQResultSequence result =  expr.executeQuery();

……

 

 외부의 입력(name)값의 검증을 수행하지 않음. 

 

 


 

 안전한 코드의 예 - JAVA

  ……

 // 외부로 부터 입력을 받음

 String name = props.getProperty("name");

 Hashtable env = new Hashtable();

 env.put(Context.INITIAL_CONTEXT_FACTORY "com.sun.jndi.ldap.LdapCtxFactory");

 env.put(Context.PROVIDER_URL,   "ldap://localhost:389/o=rootDir");

 javax.naming.directory.DirContext ctx =  new InitialDirContext(env);

 javax.xml.xquery.XQDataSource xqds =  (javax.xml.xquery.XQDataSource

 ctx.lookup("xqj/personnel");

 javax.xml.xquery.XQConnection conn = xqds.getConnection();

 String es = "doc('users.xml')/userlist/user[uname='$xpathname']";


 // 입력값이 Xquery의 인자로 사용

 XQPreparedExpression expr =  conn.prepareExpression(es);

expr.bindString(new QName("xpathname"), name, null);

XQResultSequence result = expr.executeQuery();

while (result.next()) {

  String str = result.getAtomicValue();

  if (str.indexOf('>') < 0) {

        System.out.println(str); 

  }

 ……

 bindString 함수로 쿼리 구조 변경 방지 



<참고> XQuery는 XML문서의 검색과 생성을 위한 서버 사이드 솔루션으로 SQL과 유사한 구문이며 객체 지향 프로그램 언어 형식을 띤 XML을 위한 Query 언어이다.


XQuery는 웹서비스에서 사용할 수 있는 정보를 추출할때, 요약보고서를 만들어야 할 때, XML data를 XHTML로 변환할때, 관련된 정보를 웹문서에서 검색할 때 사용한다.




블로그 이미지

오픈이지 제로킴

시큐어코딩 교육/컨설팅 전문가 그룹

티스토리 툴바