SQL Injection 심화 실습
주어진 2개의 테이블에 존재하는 모든 데이터를 조회한 뒤, 이를 통해 Dave의 패스워드를 알아내는 실습이다.
임의의 값 asdf를 넣고 Get Account Info를 누르면 실행된 쿼리의 정보가 나타난다.
패스워드 알아내기
- asdf라는 임의의 값을 입력한 후 이어서 싱글쿼더(')를 입력해 문자열의 범위 벗어나기
- 기존의 쿼리를 종료하기 위해 세미콜론 입력
- user_system data 테이블의 모든 칼럼에 존재하는 데이터를 조건 없이 조회하기 위해 Select 쿼리를 입력하고 뒤에 주석(--)을 입력해 문법적인 오류가 발생하지 않도록 처리
asdf'; select * from user_system_data--
Dave의 패스워드를 알아낼 수 있다!
Blind SQL Injection
쿼리의 실행 결과가 노출되지 않아 눈으로 확인할 수 없지만 서버의 응답을 통해 쿼리의 참과 거짓을 구분할 수 있다면 데이터를 잘게 나누어 특정 값과 비교하는 SQL Injection을 수행하는 것이다.
종류
- Error based Blind SQL Injection: 오류를 참고해 참과 거짓을 구분
- Time based Blind SQL Injection: 쿼리 실행에 소요되는 시간 차를 기준으로 구분
- Content based Blind SQL Injection: 서버의 응답 본문을 기준으로 구분
Tom의 계정으로 로그인하는 실습이다.
먼저 Username과 Password에 모두 test' or 1=1--을 입력해보았다.
로그인 영역에서 SQL Injection 구문을 아이디와 비밀번호에 모두 추가할 경우 오류가 발생하지 않는다.
즉, 로그인 영역에는 SQL Injection 취약성이 없다는 것을 의미한다.
-> 따라서, Register 탭을 사용하여 SQL Injection 공격을 수행해야한다.
등록 탭에서 Username은 asdf로 이메일은 asdf@gmail.com으로, 비밀번호는 1234로 하여 가입을 해보았다.
그리고 똑같이 한 번 더 가입을 해보았다.
그랬더니 중복이라 가입이 불가능하다는 문구가 나왔다.
-> 중복체크를 위해 서버에서 select 구문을 이용하고 있음을 추측할 수 있다.
따라서, 가입 성공 유무를 통해 select 쿼리가 참인지 거짓인지를 구별할 수 있을 뿐이기 때문에 Blind SQL Injection이다.
이번에는 1=1이라는 참이 되는 조건을 넣었더니 이미 존재하는 계정이라며 가입이 되지 않았다.
1=2라는 거짓 조건을 넣었더니 가입이 성공적으로 완료되는 것을 확인할 수 있다.
-> 중복체크 쿼리가 참이되면 가입에 실패하고, 거짓이 되면 가입에 성공하는 것이다!
asdf' and length(password)<30--를 넣었는데 이미 존재하는 계정이라는 메시지가 나타난 것을 보아 asdf의 패스워드는 30자 미만임을 알 수 있다.
여기서 숫자를 하나씩 줄여가면서 가입이 되는지 확인해본다.
23에서 가입이 되는데 패스워드 길이가 23자임을 알 수 있다.
23자리를 맞춰봐야 하니까 버프 스위트를 일단 열어보았다.
https://tomatohj.tistory.com/76
[WebGoat] Injection-SQL Injection (advanced) 풀이
SQL Injection 고급 버전 챕터이다. 조금더 어려운 내용을 다루고 있다고 생각하면 된다. 문제풀러 가자. 이번 문제는 다른 테이블에 있는 데이터를 조회하는 SQL Injection 문제이다. 다른 테이블에 있
tomatohj.tistory.com
아직 버프스위트가 익숙하지 않아 위의 글을 참고해서 해결해보려고 했다.
일단 1주차 수업에서 한 대로 환경 설정을 해주고
버프스위트에서 브라우저를 열어 webgoat에 접속하였다. intecept off로 하고 들어간 다음 on으로 해서 로그인을 해준다.
이 다음부터 어떻게 하는지 모르겠어서 위의 자료를 참고하였다.
ascii는 한글자를 ascii code숫자로 바꾸어주는 역할을 하며, substring은 특정 대상에 대하여 문자열을 자를수 있다.
인자는 총 3개가 들어가며 맨앞은 자를 대상, 두번째는 몇번째 글자부터 자를것인지, 마지막은 몇글자를 자를 것인지를 나타낸다고 한다.
아무튼 이렇게 하고 버프스위트에서 intruder로 보내야하는데 여기서부터 막혔다.
내가 등록 버튼을 눌렀을 때 나오는 http기록을 보내야하는 것 같은데 일단 여기까진 찾은 것 같다.
이거를 intruder로 보낸 결과이다.
참고 자료에 맞춰 payloads 수정도 해주었다.
그리고 공격을 진행하였다.
위와 같이 116을 넣었을 때만 response length가 달라졌음을 알 수 있다. 다른 응답이 온 것인데 즉, tom의 password 첫번째 자리는 116의 ascii code를 가진 소문자 t이다.
그리고 이 다음부터 해결을 하지 못하였다.
한글자씩 짤라 맞추는 공격 payload는 tom' and ascii(substr(password,1,1))=120 and '1'='1로 설정하였다길래 이게 무슨 말일까 하다가 다시 브라우저에서 Username에 넣어보았다.
그리고 이걸 다시 공격 해보았는데
길이가 다른 것도 없고 모두 Sorry 어쩌구만 나온다...
payload에 대한 이해와 버프스위트를 어떻게 활용하는지에 대해 아직 많이 부족한 것 같다.
보안 공부를 열심히 하면서 버프스위트를 많이 써보고 다시 이 문제에 도전해보고 싶다.
'2024 SWLUG > WebHacking' 카테고리의 다른 글
5주차_웹해킹 수업 정리 (0) | 2024.11.19 |
---|---|
4주차_웹해킹 수업 정리 (0) | 2024.11.13 |
2주차_웹해킹 수업 실습 (0) | 2024.10.01 |
[webhacking.kr] old-52 (0) | 2024.09.20 |
1주차_웹해킹 수업 정리 (0) | 2024.09.16 |