드디어 table이 시각적으로 출력되기 시작하였다. query문도 order by 를 통하여 정렬하는 query문으로 변경되었다. 문자열 필터링에서 sleep, benchmark 가 빠진 것을 보아 time-based sql injection 에 관한 문제인 것 같다. Time-Based SQL Injection 이란, query문에 시간을 delay 시키는 함수, sleep/benchmark 등을 사용하여 요청에 대한 응답시간을 의도적으로 지연시키는 방법이다. 어떻게 사용하는 것인가? 우선 문제에 간단하게 테스트해보자. ?order=1 위와 같이 query 를 전달할 경우, 1번 column, 즉 id column 을 기준으로 table 이 정렬된 것을 볼 수 있다. admin 의 email 주소는 p..
테스트는 다음 사이트에서 진행하였다. http://testphp.vulnweb.com/artists.php 1. query 문에 싱글쿼터 한 마리를 태워서 전송 ?artist=' 오류 메세지가 출력된다. php문의 line 62에서 mysql_fetch_array() 함수가 사용된 것을 보아 작위적인 query문을 전달할 수 있음을 파악했다. 2. union 을 사용하여 두 가지 query 동시에 전송 ?artist=0 union select 1,2,3-- artist 와 관련된 column 은 2번 column 인 것 같다. 이번에는 DB의 이름을 알아보자. 1번 column 에 대한 정보는 출력되지 않는 것 같다. 3. database(), current_user() 함수를 query문에 전송 ?ar..
기본적인 Blind SQL Injection 문제인 것 같아 보이지만 참값을 확인할 방법이 보이지 않는다. 이전 문제들에서는 'Hello admin 이라는 문자열을 출력시켜줌으로써 우리가 전달한 query문에 대한 참값을 알 수 있었다. 코드 line 8 을 보면 myslqi_error() 함수를 사용하고 있다. 이 함수는 query 문에 오류가 있을 시에 해당하는 오류를 출력시켜주는 함수이다. 이것을 이용하면 될 것 같다. 어떤 오류를 출력시키는지 한 번 살펴보자. ?pw=' 위와 같은 query 문을 전달하였더니 아래와 같은 오류 메세지가 출력되었다. You have an error in your SQL syntax; check the manual that corresponds to your MySQ..
형식이 신기하게 바뀌었다. 일반적인 '#' 주석과 '--' 주석은 필터링 되어있다. 또한 pw의 입력값을 6글자 초과로 받을 수 없다. 싱글쿼터가 필터링되지 않기 때문에 pw의 ('') 를 탈출시켜야 한다. 탈출시키는 방법은 단순하다. pw=') 과 같이 탈출시키면 된다. 이제는 참값을 만들 차례다. SQL에서는 형이 다른 데이터를 비교할 때 '묵시적 형변환'이라는 것을 실시한다. 만약 문자열과 정수를 비교할 때에는 문자열이 0이라는 숫자로 형변환된다. 따라서 'abcd'=0 이라는 결과가 도출된다. 이와 같이 공백의 문자열에서도 이가 성립한다. 따라서 ''=0 이라는 결과도 도출된다. 이를 이용하면 pw의 값을 '참'이라는 값으로 넣어줄 수 있다. pw=TRUE 라는 결과가 query 문으로 전달되고,..