Information Security
Blind SQL Injection 공격2 본문
서버를 조금씩 변경해서 각각 어떻게 정보를 가져올지 알아볼 것이다.
1. news.php에서 내용을 출력할 때 사용한 while 문을 없앴다.
-> mysql_fetch_array()는 쿼리의 실행 결과 중 한 줄만 가져오는 함수이다.
-> SQL Injection으로 DB 정보를 얻어올 때도 한 줄만 가져올 것이다.
-> 쿼리에 limit을 추가하여 몇 번째 줄의 정보를 가져올지 정해야 한다.
ex) union select 1, column_name, table_name from information_schema.columns limit 10, 1
2. 이번에는 컬럼의 내용이 화면에 출력되지 않도록 변경했다.
-> title, news 컬럼으로 DB 정보를 출력할 수 없는 상황이다.
-> 이럴 땐 정보를 참 or 거짓으로 확인할 수 밖에 없다.
★ 정보를 얻기 위하여 사용할 함수
값의 길이를 리턴해주는 length 함수
값을 한 글자씩 리턴해주는 substring 함수
값의 아스키 값을 리턴해주는 ascii 함수
그럼 한번 columns 테이블의 45번째 table_name은 무엇일지 참 or 거짓을 통해 판단해 보겠다.
1) 먼저 45번째 table_name의 길이부터 알아볼 것이다.
length()의 반환 값이 3보다 크다고 입력하면 화면이 출력되었다.
-> 참으로 동작한 것으로 값이 3보다 큰 것을 알 수 있다.
그러면 이번에 5보다 작다고 입력했다.
-> 거짓으로 동작하여 5보다도 큰 것을 알 수 있다.
이제 아예 6과 같다고 입력했다.
-> 참으로 동작했다. 45번째 table_name의 길이는 6인 것을 알아냈다.
2) 길이를 알아냈으니 진짜 테이블 이름을 알아내 볼 것이다.
select substr((select table_name from information_schema.columns limit 45,1),1,1);
-> 이 쿼리의 결과는 45번째 table_name에서 맨 첫글자를 출력한다.
-> 그런데 우리는 화면에 결과가 출력되지 않는 상태이므로 볼 수가 없다.
-> 이를 알아내려면 위의 substr() 함수의 결과를 또 ascii 함수를 이용해서 아스키 값으로 변경한 후 참 or 거짓을 통해 판단해야 한다.
아스키 값이 70보다 작다.
-> 참
60보다도 작다
-> 거짓
...
...
69이다.
-> 참
69에 해당하는 아스키 코드는 E이다.
-> 이렇게 첫번째 글자만 알아냈다.
-> 전체 글자 수는 6개이다. 이 과정을 6번 반복해서 테이블 이름을 알아낸다.
-> 과정을 생략하고 결과는 EVENTS이다.
확인!
3. 마지막으로 아무것도 출력되지 않도록 변경했다.
아무것도 출력되지 않아도 참 or 거짓을 판단할 수 있을까요?
-> 유일한 방법은 sleep() 함수를 사용하는 것이다.
sleep함수가 실행되면 해당 시간만큼 대기했다가 결과를 출력한다.
참(1=1)일 경우 웹 페이지에서 확인해보면 10초동안 대기하는 동안 저 동그라미가 생기는 것을 알 수 있다.
거짓(1=2)일 경우 웹 페이지에서 아무런 변화가 없다.
이렇게 sleep()함수를 사용하면 빨간 부분만을 가지고 참 거짓을 판단해서 정보를 알아낼 수 있게 된다. 우와~~~
'Web Hacking > Web 취약점 분석' 카테고리의 다른 글
Blind SQL Injection 공격 (0) | 2017.12.08 |
---|---|
SQL Injection 공격 (0) | 2017.12.06 |
PHP File Upload 공격 (0) | 2017.12.05 |
XSS(Cross Site Scripting) 공격 (0) | 2017.12.01 |
제로보드 환경설정 (0) | 2017.11.30 |