본문 바로가기

개념정리

5주차 SQL INJECTION 쿠키조작/인증우회

5주차 SQL INJECTION 쿠키조작 인증우회


SQL INJECTION
- SQL에게 말하는 언어를 삽입해서 원하는 값을 얻기!

- SQL 질의문이 사용가능한 취약점이다
- 웹 페이지 와스에게 코드를 삽입 할 수 있는 입력창에 SQL구문을 삽입해서 디비데이터를 추출한다 
- PHP코드로 입력한다. 
 


 

SQL INJECTION 모의해킹시 주의할점

- DATABASE 건드는 작업은 DATABASE가 날라가지 않도록 조심

- 특히 INSERT/DELETE/UPDATE

- OR 이나 주석을 남용하면 안된다

- 데이터를 변조하면 안된다.

 


 
식별 인증 분리에서의 SQL INJECTION
EX)

select * from 테이블 where id='입력값'

-> select * from 테이블 where id='입력값' //우리가 바꿀수 있는 입력값에 SQL코드를 넣는거다

select * from 테이블 where id='입력값' '

-> id = 입력값' -> select * from 테이블 where id='입력값' ' ->  따옴표가 두개 들어가 문법 에러가 뜬다

 select * from 테이블 where id='입력값'# '

-> id = 입력값'# -> select * from 테이블 where id='입력값'# ' -> 마지막 따옴표가 주석처리되어서 정상 입력 처리된다. 
 
 
 
아이디값에 해당하는 입력값 출력
- 아이디값 AND true값
EX)

select * from 테이블 member id=' 아이디값'  AND 'x'='x '

-> id =  아이디값'  AND 'x'='x -> select * from member where id=' 아이디값'  AND 'x'='x '
    아이디값 true, x=x는 true -> where true and true -> where true ->  아이디값에 해당되는 DB row를 가져올 수 있다.
 
 
 
전체 데이터 출력
- 아무값 OR ture값 
EX)

select * from member where id='아무값  OR 'x'='x '

->  id = 아무값' OR 'x'='x -> select * from member where id='아무값  OR 'x'='x '
 아무값 false, x=x는 true -> where false or true -> wher true -> DB table 전체를 가져올수 있다
 
 


 
식별 인증 동시에서의 SQL INJECTION
EX)

select * from member where id='아이디값' and pass='비번값'

-> select * from member where id='아이디값' and pass='비번값' //우리가 바꿀수 있는 입력값에 SQL코드를 넣는거다
 
 
주석을 쓸 수 있을때

select * from member where id='아이디값' # ' and pass='비번값'

-> id = 아이디값' #
    -> select * from member where id='아이디값' # ' and pass='비번값' -> 로 and pass값을 주석처리해서 날려버린다.

select * from member where id='아이디값' /* ' and pass=' */ */ OR pass='아무값' or 'x'='x '

-> id = 아이디값' /*                 pass= */ OR pass='아무값' or 'x'='x
    -> select * from member where id='아이디값' /* ' and pass=' */ */ OR pass='아무값' or 'x'='x '
    -> and값을 주석처리해서 날림
    -> 근데 이건 sql구문을 정확이 알때만 가능 비밀번호의 변수저장값이 pass인지 password인지 Password인지 모르잖
 
 
 
주석을 쓸 수 없을 때

select * from member where id='아이디값 ' and pass = ' 아무값' or 'x'='x '

-> id = 아이디값                      pass = 아무값' or 'x'='x 
    -> select * from member where id='아이디값 ' and pass = ' 아무값' or 'x'='x
    -> 아이디값 true, 아무값 false,  x=x true -> where (true and true) or false -> where true or false -> where true
    -> 아이디값에 해당 DB  캐치
 
 
주의! 안됩니다 이건

select * from member where id='아이디값 ' or 'x'=x ' and pass = ' 아무값 '

-> id = 아이디값' or 'x'='x        pass = 아무값
    -> select * from 테이블 where id='아이디값 ' or 'x'=x ' and pass = ' 아무값 '
    -> 아이디값 true, x=x true, 아무값 false -> where true or (true and false) -> where true or false -> where true
        -> true지만 비번값이 table 전부가 떠버리고 첫번째 데이터만 들어가므로 로그인 안됨

select * from member where id='  ' or 'x'=x ' and pass = ' 비번값'

-> id = ' or '1'='1               pass = 비번값
    -> select * from member where id='  ' or 'x'=x ' and pass = ' 비번값'
    -> 아이디값 false, x=x true, 비번값 true -> where true or (false and true) -> where true or false -> where true
        -> true 지만 id값이 없는 정보는 없으므로 로그인이 안됨
 


 
 
 
논리연산자 
- +, -, *, / , and, or
- and or있으면 and부터 계산한다
- 논리연산자의 데이터는 boolean 데이터가 반환된다
- boolean 데이터 -> true/false , 1/0 값 밖에 없다.
 
TRUE값
 -x값은 다른 어떤게 들어가도 상관없다 그냥 서로 같아서 true값을 반환하는게 목적이다.  
    아무값' OR '1'='1 / 아무값' OR 'true'='true' / kjkjdljljlkj' OR 'eee'='eee / 1' or1=true# / normaltic' or true # 다가능
 
AND
1,1=1 true
1,0=0 false
0,1=0 false
0,0=0 false
 
OR
1,1=1 true
1,0=1 true
0,1=1 true
0,0=0 false
를 이용한다.
 


 

MYSQL 주석

- 한줄 주석 

    -> --

    -> #

- 여러줄 주석

    -> /* */


 
쿠키조작
- 원래 가지고있는 아이디와 비번이 있으니까
- 그걸 로그인해서 프록시로 캐치해서 쿠키를 조작해서 로그인
EX)
-> location 
-> set-cookie 서버에서 클라이언트에게 말한다 너 이거 갖구와야 관련파일 줄거야
-> 맞는 비밀번호 쳤을때 302뜨고 쿠키설정 login User
 
 


 
인증우회(Bypass)
- 따옴표썼는데 length가 유지된다는건 인젝션 어렵다는
- 또한 인증우회 디비의 정보를 보려면 인증을 해야하는데 인증을 우회해서 디비를 볼수있게한다
- 대응 방법  인증성공시 토큰을 발행해서 세션에 인증성공정보를 저장한다.
EX)
->회원가입
   ->  약관동의 -> 폰인증 -> 로그인 -> 사이트 접속
   ->  약관동의 -> 사이트 접속 으로 건너뛰어버리는 것이다
       
 


 
 
Burf Suite 설정
- http를 쓰려고해서 생기는 오류 
-> Proxy
    -> Proxy settings
        -> All -> Tools -> Proxy
            -> Response midification rules -> Convert HTTPS links to HTTP 체크박스 체크
-> Proxy
    -> Intercept -> Request ~~~ 우측클릭
        -> Use HTTPS 체크박스 해제 -> OK
 
-response수정하기
-> Proxy
    -> Proxy settings
        -> All -> Tools -> Proxy
            -> Response intercept rules -> Add
                -> Boolean operater : And
                -> Match type : HTTP method
                -> Match relationship : Matches
                -> Match condition : (get|post) -> get으로 변경
            -> Enabled 체크박스 체크
-> Proxy
    ->  Intercept 
        -> Raw -> 오른쪽 클릭 
            -> Do intercept -> Response to this request -> Forward 누르면 response나온다
 
 
- 리피터의 달라진 부분 보기
-> Repeater 
    -> Request / Response 좌측 하단 톱니바퀴버튼 클릭
        -> Auto-scroll to match when text changes 체크박스 체크