쿼리의 결과를 참과 거짓만으로 만 출력하는 페이지에서 사용하는 인젝션이다.
출력 내용이 참과 거짓 밖에 없어서 추측하여 결과를 조회한다.
ascii(substr((select table_name from information_schema.tables table_type="테이블 타입" limit 0,1),1,1)) = 63
substr(string,시작위치,길이) : 시작위치에서 길이만큼 데이터를 가져온다.
substring(string,시작위치,길이) : 위와 동일
length(string) : 길이
right(string,length) : 오른쪽에서 길이만큼 문자를 가져온다.
left(string,length) : 왼쪽에서 길이만큼 문자를 가져온다.
Blind 방식은 일일이 손으로 작업하기에는 시간이 오래 걸려서 툴이나 직접 프로그램을 만들어서 시도하는 것이 현명한 방법이다. 우리는 데이터베이스 이름이 "bWAPP"인걸 아니 "bWAPP"에 대해서만 다루겠다.
1' or 1=1#을 넣어보면 영화가 존재한다고 뜬다. iron man' and 1=1#을 해보면 존재하지 않는다 라고 뜬다.
참일 때는 존재한다. 거짓일 때는 존재하지 않는다라고 구문이 뜨는 것을 확인할 수 있다.
1' or length(database())=5#를 하면 존재한다라고 뜨니 데이터베이스 이름의 길이는 5이다.
1' or ascii(substr(database(),1,1))=98#를 대입하면 존재 한다라고 뜬다. 데이터베이스 이름의 첫 번째 글자는 'b'이다
이런 식으로 하나씩 대입해보면서 Injection을 하는 것이다
sleep()이란 함수를 이용하여 참일 때(or 거짓일 때) 돌아오는 시간에 따라 값을 추측하는 Injection이다.
1' or length(database()) and sleep(5) #의 구문을 이용하면 데이터베이스 길이가 5이면 5초 뒤에 반응이 온다.
다른 방법도 Boolean이랑 다를 것이 없다 sleep() 함수를 이용하여 결과만 다르게 볼 뿐 참과 거짓을 이용하여 판별하는 공격이다.
SOAP에서는 주석처리가 안된다. 주석처리가 안되면 ' or 1=1#방식은 안되고 ' or '1'='1 형식으로 인젝션을 삽입하여한다.
대충 데이터 쿼리 구조가 select ticket from movie where title = ' + title + ' 형식으로 되어 있을텐데 우리는 title부분에 ' or '1'='1의 구조를 넣어서 select ticket from movie where title = ' + ' or '1'='1 + '과 같이 쿼리 구조문이 된다.
Iron Man' and length(database()) = 5 and '1'='1 : 아이언 맨도 참이고 데이터 베이스의 길이도 'bWAPP'이므로 5이다. 따라서 참이 되므로 티켓수가 출력되는 것을 볼 수 있다.
Broken Auth(Insecure Login Forms, Password Attack,Week Password) (0) | 2020.02.27 |
---|---|
XML/Xpath Injection (0) | 2020.02.25 |
SQL Injection(Stored) (0) | 2020.02.24 |
SQL Injection(Login) (0) | 2020.02.22 |
SQL Injection(AJAX/JSON/jQuery/CAPTCHA) (0) | 2020.02.22 |
댓글 영역