ldap 쿼리 질문 드립니다
글쓴이: 112942d / 작성시간: 목, 2013/09/26 - 6:28오후
특정 엔트리를 특정 조건으로 찾고 싶은데 무엇이 문제 인지 잘모르겠네요
baseDN은 dc=example,dc=com이고 만들어본 쿼리는 (&(mail=test)(ou=Students)) 입니다. 실행하면 찾아지는게 없습니다.
ou=Students를 빼면 결과값이 있는데 제가 지정하고 싶은 조건은 특정 ou 아래에 있는 엔트리의 value값 기준으로 엔트리를 찾는 것입니다.
엔트리 위치는
dc=example,dc=com
|
|__ ou=Students
|
|__uid=test <--- 찾을려는 엔트리
위와 같은 조건이 동작하지 않는 이유를 알수가 없네요
유튜브 영상중에 ldap injection 공격 시연 영상(http://www.youtube.com/watch?v=wtahzm_R8e4)이 있는데
거기서 공격 시연자의 완성된 쿼리 형태가 "(&(mail=eric*)(telephone=*)(ou=Students))" 입니다.
실제 동작하는 쿼리처럼 보여졌습니다.
느낌상 제가 개념을 제대로 모르고 쿼리를 사용한것 같은데 위와 같은형태로 검색을 할 수 있는 방법은 있을까요?
조언 부탁드립니다.
Forums:
조직단위를 기저 식별명에 지정해주시면 될 것 같습니다.
ou=Students,dc=example,dc=com
Talk is cheap. Show me the code.
https://www.potatogim.net/
그럼 (ou=Students) 는 실제 엔트리의 속성이겠네요.
(&(mail=eric*)(telephone=*)(ou=Students)) 쿼리에서 ou=Students는
상위 엔트리가 아니라 해당 엔트리의 속성이겠네요
일반적으로 엔트리를 만들 때 상위 엔트리의 ou를 해당 엔트리에도 넣어주는 것일 수도 있겠네요
그런데 조금 의문이 드는 것은 웹에 돌아다니는 쿼리중에 objectClass로 조건을 걸지않고
ou를사용하는 것들이 보이던데 ou를 사용하는 이유가 특별히 있는가요?
아래는 인터넷 돌아다니면서 본 쿼리들 입니다.
(& (ou=$Ugroup)(cn=$Uname));cn,telephone <-- http://blog.nci.ca/
단순히 이런 조건으로 된다라는 예시를 둔 것인지 좀 햇갈립니다.
두서 없이 질문 드렸네요
아무 쪼록 ldap 서치 쿼리나 ldap injection 고수님들의 조언 부탁드립니다.
네, ou는 속성입니다.
ou는 core.schema에 정의된 attributetype이지 objectClass가 아닙니다.
objectClass는 이런 attributetype들의 집합이죠.
다시 말해, objectClass가 organizationalUnit인 것은 entry 자체가 ou라고 보시면 됩니다..
하지만 attributetype으로 ou를 갖는 것은 entry가 organizationalUnitName이라는 식별자 역할의 attributetype을 갖는다는 것이구요.
사설을 좀 덧대자면...
각 entry는 여러 objectClass를 가질 수 있음을 아실 것입니다.
예를 들어 한 entry가 inetOrgPerson objectClass를 포함한다고 해볼까요?
이 inetOrgPerson은 RFC 2798 명세에 따라 organizationalPerson objectClass를 상위로 하고, 또 organizationalPerson은 person을 상위로 합니다.
그리고 organizationalPerson objectClass는 MAY attributetype으로 ou를 갖습니다.
따라서 inetOrgPerson을 포함하는 것만으로 ou라는 attributetype을 가질 수가 있게 되는 것이고, 이 ou라는 녀석으로 해당 entry가 소속되는 조직 단위를 지정하는 것이죠.
core.schema를 열어보신다면 organizationalUnitName을 비롯하여 cn, sn과 같은 attributetype의 정의를 보실 수 있는데, 가만보시면 name이라는 속성이 이들의 상위 속성이라는 공통점이 있습니다.
그리고 이 name이라는 속성은 DN 외에도 LDAP 질의 과정에서 추가 식별자로 사용될 수 있도록 제정한 속성입니다. 따라서 이 속성은 entry 자체의 속성일 뿐만이 아니라 질의를 위한 기저의 일부로써도 사용이 가능한 것이죠.
위 속성을 통해 어떻게 질의가 이루어지는가를 좀 더 자세히 알고 싶으시다면 RFC 4511을 참조하시고, DN 자체에 대한 표기는 4514를 참조하시면 되겠습니다.
추가로 쿼리 설명 좀 부탁드립니다.
(&(objectClass=person)(name=*)(|(objectClass=*)))
위쿼리를 어떻게 해석 해야 하나요? 제가 봤을때 잘 이해가 안됩니다.
name=* 까지는 name 속성이 있는 모든 엔트리를 출력인것 같은데
뒤의 (|(objectClass=*))는 도통 무슨 의미인지 모르겠습니다.
그럼 조언 부탁드립니다.
이렇게 보시면...
(&(objectClass=person)(name=*)(|(objectClass=*)))
앞에서부터 차근차근 보시면 될 것 같습니다.
처음 괄호를 기준으로 3개의 하위 조건이 존재합니다.
1. (objectClass=person)
2. (name=*)
3. (|(objectClass=*))
1번과 2번으로 objectClass가 person이고 name 속성이 있는 entry들이 걸러집니다.
3번째 조건을 보시면 새로운 괄호가 열려 OR로 objectClass=*라는 조건이 있네요.
일반적으로는, (&(objectClass=person)(name=*)(|(cn=potatogim)(ou=potato field*)) 와 같이 앞의 AND를 충족하는 entry들에게 2차적인 조건을 부여하는 형식인데 의도적인 경우가 아니고선 저렇게 다시 objectClass를 조건으로 거르는 동작을 취할 이유가 없을 것 같습니다.
과장하면 특정 서버 구현의 취약점을 노린 질의가 아닐까 싶네요...;;
아... 익명으로 댓글을 달았네요.
추가 사항은 댓글이 아닌 글로 남겨주시면 비슷한 질문의 답을 구하는 분들에게 도움이 되지 않을까 싶습니다~
Talk is cheap. Show me the code.
https://www.potatogim.net/
댓글 달기