본문 바로가기

Games/CTF

HDCON 2013 level1

level1 은 Web 문제이다


JSP 로 만들어진 간단한 사이트인데, 테이블에서 학생들의 정보를 쿼리해오는 페이지가 존재한다. 여기서 show 라는 GET 파라미터에 숫자를 넘겨서 출력할 레코드의 수를 지정한다. 만약 show 에 1 을 넘겨주면 상위 1개의 레코드만 출력되고 11 이상 을 넘겨주면 상위 11개의 레코드만 출력되고... 문자나 1+1 과같은 수식을 넘겨주면 오류가 발생한다.


일차적으로 show 파라미터에 sql injection 문자열들을 넣어보면 모두 필터링된다. 이것이 firewall 필터인지 application 필터인지, 문자열을 없애는 방식의 필터링인지 replace 방식인지 등을 이런저런 테스트를 통해 실험하고있었으나 별 단서를 잡지 못하던중 정말 우연히 .do 확장자를 직접적으로 .jsp 로 변경해서 접속했더니 모든 필터링이 전부 우회되었다 -_-; servlet 단에서도 필터링이 가능한줄 처음알았다.


SQL상에서 레코드의 수를 제한하는 것은 where 절 또는 mysql 의 limit 절을 통해 가능한데 show 파라미터가 그대로 SQL 쿼리에 삽입되는 경우 where 절이 이용됬다면 1+1 등이 오류가 나지 않아야 하고, limit 절이라면 오류가 나야하는데, 오류가 나는것으로 보아 파라미터가 limit 절에 들어간다고 추측할 수 있었다(팀원한테 배운부분)


limit 절을 제어할 수 있다면 union select 를 통해서 인젝션을 할 수 있을 것인데, 아무리해도 이것이 먹히지 않았다.  혹시 SQL 에 파라미터가 들어가는것이 아니라 이미 가져온 레코드셋을 가지고 JSP 문을 파라미터가 이용하는가? 싶기도 하였는데 결론은 SQL 전체가 () 로 둘러싸인 상태로 파라미터가 들어가는 것이었다.  따라서 아래와같은 형태로 union 인젝션이 가능했다


http://118.107.172.213:8889/kisaHdconWeb1/students.jsp?show=1)%20union%20(select%201,1,1,load_file(0x2F6574632F686F73742E636F6E66),1,1,1



'Games > CTF' 카테고리의 다른 글

HDCON 2013 level4  (0) 2013.06.11
HDCON 2013 level3  (0) 2013.06.11
SECUINSIDE 2013 reader  (0) 2013.05.28
SECUINSIDE 2013 127.0.0.1  (2) 2013.05.28
SECUINSIDE 2013 givemeshell  (0) 2013.05.28