Information Security

Blind SQL Injection 공격2 본문

Web Hacking/Web 취약점 분석

Blind SQL Injection 공격2

leeeeye321 2017. 12. 8. 13:43

서버를 조금씩 변경해서 각각 어떻게 정보를 가져올지 알아볼 것이다.

 

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