Blind SQL Injection은 말 그대로 Blind 못보는 상태에서 '때려맞추는' 것이다.

만약 로그인을 할때 아이디와 패스워드를 모두 비교한다면 어떨까?


select * from user where id='$id' and pw='$pw';


후에 결과값을 받은 배열에서 

row['id']==$id && row['pw']==$pw

이렇게 비교를 하게 된다면 ' or '1'='1 같은 논리적 SQL Injection은 먹히지 않게 된다.


이떄 비밀번호의 문자열을 때려맞추는 것이 Blind SQL Injection이다


select * from user where id='admin' and pw='1' AND ascii(substr(pw,1,1))<=120#';


이렇게 된다면 쿼리문의 내용은 

아이디가 admin이면서 pw의 첫번째 값이 아스키 값으로 120이하라면 참이라는 결과를 반환한다.



ascii()라는 함수는 해당 문자의 아스키 값을 반환하고

substr(컬럼,시작 문자의 자릿수, 가져올 문자의 수)

만약 pw가  abcd라면 substr(pw,2,1) 은 pw에서 2번쨰 자리에서 1글자 만큼 가져오라는 뜻이다.

물론 대부분의 사이트들은 substr()이나   substring()같은 함수를 막기 떄문에 

left(), mid(), right() 같이 문자열에 접근 할 수 있는 다양한 함수들을 사용한다. 



자 pw가 abcd라고 친다면 

select * from user where id='admin' and pw='1' AND ascii(substr(pw,1,1))<=120#';

하면 참이 나온다. 

이럴땐 과감하게 반으로 자른다.


select * from user where id='admin' and pw='1' AND ascii(substr(pw,1,1))<=60#';

거짓이 나온다 즉 아스키값 60보다는 크다는 이야기


select * from user where id='admin' and pw='1' AND ascii(substr(pw,1,1))<=100#';

참이 나온다 100보다 작다고 나온다.


select * from user where id='admin' and pw='1' AND ascii(substr(pw,1,1))<=97#';

이렇게 하나하나 참과 거짓을 비교해가며 찾는것이 Blind SQL Injection이다. 

물론  Blind SQL Injection을 막기 위해 엄청난게 많은 함수를 필터링 하지만 

웹 해커들은 별에 별 함수를 다 이용해서 뚫는다. 이때 사용되는 함수들에 대해서는 후에 다시 한번 추가 하겠습니다.



'Web Hacking' 카테고리의 다른 글

useful MYSQL Functions  (0) 2015.08.24
Time Base SQL Injection  (0) 2015.08.24
Union SQL Injection  (0) 2015.08.24
SQL Injection 2  (0) 2015.08.24
SQL Injection 1  (0) 2015.08.15


Union이란 것은 SQL에서 한개 이상의 쿼리문을 실행할때 사용하는 함수다.

Select id, pwd from user where id='admin' union select id,pwd from user where id='guest';

이렇게 실행하게 된다.

보통 Union SQL Injection을 많이 사용하게 되는 환경은 게시판의 형태다

보통 게시판에 작성자, 제목,내용,시간등을 넣게 되는데 이때의 컬럼수는 4개다.

Union SQL Injection의 특징은 먼저 앞에서 실행되는 

Select id, pwd from user where id='admin' 이 쿼리문과 뒤에 추가하게 되는 쿼리문의 컬럼 수가 같아야 한다는 점이다.




위에서 현재 게시판을 담고

있는 테이블의 컬럼수는 9인것을 알 수 있다. 내가 설계했으니까 핳 먼저 0번 idx를 호출하면 아무값도 나오지 않는다 존재하지 않는 게시판 번호이기 때문이다. 여기에 union select 1,1,1,1,1,1,1,1,1 구문을 날리게 되면 SQL 쿼리의 결과값을 담은 배열에 1만 9개가 들어가게 된다. 떄문에 1만 출력 되는 것이다. 만약 여기서 DB 전체에 대한 구조를 알고 싶다면 천천히 DB명 부터 뺴오면 된다.




database()라는 것은 현재 자신의 DB명을 불러오는 것이다.

즉 현재 게시판 테이블이 포함되어 있는 DB는 syssecu 라는 DB다.


그 외에도 PHP 에는 예약 상수라는 것이 있다 


PHP_VERSION ()

은 현재 PHP 버전에 대한 값은 반환하는 PHP 예약상수다. 

관련 정보

http://php.net/manual/kr/reserved.constants.php


여기서 이제 테이블명을 알고 싶으면 DB의 구조에 대해서 좀더 자세하게 알아야 한다.

MySQL에는 information_schema라는 DB가 있다. 어... 쉽게 표현하자면 메타 데이터에 대한 메타데이터 라고 표현 할 수 있다. 

즉 DB의 모든 정보를 함축하고 있는 것이다. Information_schema에 대해서는 후에 자세하게 분석한 문서를 올리겠다.


사실 지금까지 웹해킹을 공부하면서 문서를 써놓은게 아니라 대충 요약 정리만 해놓아서 글쓰기 굉장히 힘들다. 

스샷도 찍어야 한다. 아오


자 이제

더 자세한 정보를 털어보자 




쉽게 설명하자면 현재 syssecu라는 DB에 있는 모든 Table 명을 뽑아온것이다.

group_concat이라는 함수는 문자열을 묶어주는 함수라고 보면 된다.


즉 현재 syssecu DB 안에는 3가지 테이블이 존재한다. 딱봐도 게시판은 board다.




자 현재 board 라는 테이블은 9가지 컬럼을 갖고 있다. 

이런 식으로 DB에 있는 정보를 순차적으로 빼올때 유용한 것이 union SQL Injection이다. 

만약 다른 테이블에 접근 할 수 있다면 user 테이블에 있는 정보도 빼올 수 있을 것이다. 


물론 이건 Union SQL Injection의 완전 생기초다 기본적인 필터링도 모두 지워논 상태다

더 어려운 내용들은 기억나는 대로 추가하겠습니다.

아 정리하기 귀찮다....









'Web Hacking' 카테고리의 다른 글

useful MYSQL Functions  (0) 2015.08.24
Time Base SQL Injection  (0) 2015.08.24
Blind SQL Injection  (0) 2015.08.24
SQL Injection 2  (0) 2015.08.24
SQL Injection 1  (0) 2015.08.15

보통 많은 개발자들이 SQL Injection을 막기위해 Magic_Quotes_gpc라는 PHP의 옵션을 사용했었다.

'나 sql injection에 사용되는 특수문자의 앞에 \를 추가해서 필터링 하는 방식이었다. 

하지만 magic_quotes_gpc에는 취약점이 많았다. 

GET/POST/Cookie로 받는 방식만 필터링을 했었다. 또한 DB에서 가져오는 값에서는 escaping 되지 않았기 

때문에 많은 사람들이 magic_quotes_gpc기능을 끄고 mysql_real_escape_string함수를 사용하는 편이 더 안전하다고 추천한다. 하지만 아직은 많은 사람들이 magic_quotes_gpc를 믿고 있다. 또한 많은 개발자들이

magic_quotes_gpc만 믿어서 그런진 몰라도 PHP 5.4 부터는 아예 삭제되었다. 


magic_quotes_gpc를 우회하는 가장 쉬운방법은 멀티바이트 인코딩을 사용하는 것이다.

mb_convert_encoding이라는 함수를 사용하는 환경에서만 가능하다. 언어셋을 바꾸는 함수이다.

만약 magic_quotes_gpc가 on 되어있는 서버에 인젝션을 날리게 되면

1\' 이렇게 인식한다. 


그런데 여기에다가 %bf%5C라는 값을 넣어주면은 우회가 된다.

%bf%5c라는 값을 한글자로 인식해버린다. %5c는 \이다 %bf%5c%27에서 \를 무시해버려서 우회가 가능하다.


addslashes()라는 함수도 있다. 하지만 이 함수도 비슷한 방법으로 우회가 가능하다.


때문에 인젝션을 막을떄는 addslashes()나 magic_quotes_gpc등을 믿지말고

mysql_real_escap_string함수를 사용하는 것이 가장 안전하다. 


 그외에도 다양한 내용이 있지만 기억나는대로 추가하겠습니다.



'Web Hacking' 카테고리의 다른 글

useful MYSQL Functions  (0) 2015.08.24
Time Base SQL Injection  (0) 2015.08.24
Blind SQL Injection  (0) 2015.08.24
Union SQL Injection  (0) 2015.08.24
SQL Injection 1  (0) 2015.08.15

+ Recent posts