📖이론
1. Classic SQL Injection
사용자 입력값을 그대로 SQL 쿼리에 삽입하여 공격하는 방식
ex )
SELECT * FROM USER WHERE USERNAME = '[입력값]' AND PASSWORD = '[입력값]';
여기서 사용자가 admin'; -- 라는 값을 입력하면
SELECT * FROM USER WHERE USERNAME = 'admin'; --' AND PASSWORD = '[입력값'];
-- 뒤는 주석처리됨
2. Blind SQL Injection
참 / 거짓의 결과를 통해 정보를 추출하는 방식
ex1 ) Boolean-based : SQL 쿼리의 결과가 참이면 정상적인 응답을, 거짓이면 에러를 반환하는 경우를 이용
(사용자 이름을 검증하는 쿼리에서 'or 1=1' 또는'or 1=2'와 같은 조건을 추가하여 참 / 거짓 판별)
ex2 ) Time-based : 응답지연을 유발시키는 함수를 사용하여 참 / 거짓 판별 (SLEEP 또는 BENCHMARK 함수를 이용)
3. UNION-based SQL Injection
UNION 연산자를 사용하여 원래의 쿼리 결과에 추가적인 선택 결과를 결합하는 방식
발생조건 : UNION 연산자는 2개 이상의 SELECT문을 합집합하는 연산자이므로,
UNION 연산자로 결합된 쿼리의 대상 목록은 같은 개수의 파라미터를 가져야 한다.
ex ) 원래 쿼리에 UNION SELECT NULL, userID, password FROM user; 를 추가하여 사용자 정보를 반환하는 쿼리 생성
4. Error-based SQL Injection
반환된 에러메세지를 통해 데이터베이스의 정보를 추출하는 방식
ex) CAST 함수와 같은 함수를 사용하여 강제적으로 에러를 발생시키고, 해당 에러메세지에서 DB 정보를 추출
🖥️실습
1)



DB 조회 전에 loginAction 페이지에서 존재여부를 먼저 확인해서 SQL 삽입되기 전에 아예 차단해버림
2)


? 왜 됐지

preparedStatement를 쓰면 문자열로 들어가기때문에 SQL Injection을 방지할수 있다고함... ㅇㅅㅇ
3)

뷰페이지에서 URL에 임의의 SQL 쿼리를 삽입하여 DB 에러페이지가 반환되는지 확인! (error-based injection)

bbsID 파라미터는 정수여야 되는데 왜 문자가 들어갔냬
정수만 허용되기 때문에 SQL injection이 차단됨

공백 넣어봐도 똑같고
* 공백 문자 우회 방법
- %0a / %09 / %0d / %20 / + / ()괄호 등 ...

싱글쿼터(%27) 써도 똑같고

싱글쿼터 앞에는 백슬래시(%5C) 써야된다 해서 써봐도 똑같고

주석 처리를 다르게 해봐도 똑같음 ㅠㅡㅠ
그러면 에러창에 나온것처럼 Integer.parseInt('입력값'); 을 이용해보면 어떨까!!!!!!
Integer.parseInt('입력값');
-> 입력값에 1') or Integer.parseInt('49') ; # 이런식으루 넣으면
Integer.parseInt('1') or Integer.parseInt('49'); #');
이렇게 되는거 아닌가!?
근데 내가 문법을 잘 몰라서 이러케 쓰는게 맞는지 몰겟ㅇ음
졸립다
'모의해킹' 카테고리의 다른 글
| SQL Injection (Get/Search) (0) | 2025.07.04 |
|---|---|
| XSS - reflected (GET) (1) | 2025.06.15 |
| bwapp 설치하기 (0) | 2025.05.17 |
| XSS 2 (0) | 2025.05.06 |
| XSS (0) | 2025.05.04 |