[SK shieldus Rookies 19기][애플리케이션 보안] String SQL Injection 풀이

Sungwuk·2024년 3월 27일
0

앞으로 진행되는 SQL Injection 실습들은 bee.box와 Webgoat으로 포스트할 것이다.

이번 포스트는 Webgoat의 String SQL Injection 문제이다.

말그대로 문자열을 이용한 공격이며 가장 기초적, 대표적인 SQL Injection이다.

주의: 절대로 공공기관, 금융사, 민간기업의 사이트에서 따라하면 안된다


가상환경 및 webgoat설치방법은
https://velog.io/@wearetheone/SK-shieldus-Rookies-19%EA%B8%B0%EC%95%A0%ED%94%8C%EB%A6%AC%EC%BC%80%EC%9D%B4%EC%85%98-%EB%B3%B4%EC%95%88-Kali-Linux-Bee-Box-%EA%B0%80%EC%83%81%EB%A8%B8%EC%8B%A0-%EA%B5%AC%EC%B6%95%ED%95%98
을 참고하자


자 그럼 문제를 풀어보자

풀이

문제: 아래 양식을 사용하면 사용자가 신용카드 번호를 볼 수 있다. 모든 신용카드 번호가 표시되도록 하는 SQL Injection을 찾아라. 사용자 이름 'Smith'를 사용할 수 있다.

Smith를 넣으면 Smith의 신용카드번호 및 개인 정보를 볼 수 있다.

그럼 어떻게 해야 다른 유저들의 개인정보를 볼 수 있을까?

개발자 도구를 이용하여 Smith 입력이 어떤식으로 처리 되는지 알아보자


일단 Smith를 입력하면 URL은

http://localhost:8080/WebGoat/attack?Screen=34&menu=1100
로 바뀌고

Go! 버튼의 html 태그

<input name="SUBMIT" type="SUBMIT" value="Go!">

특별히 개발자가 method를 지정해 주지 않는 이상 이 태그는 GET 방식이다.

더 나아가, 요청 파라미터로 전달된 값이 서버에서 어떻게 사용되는지를 유추해보면 아마도 특정 테이블에 데이터를 조회하는 쿼리를 만들고 실행하는데 사용되고 있을것이다. (기본문제라 답이 적혀있다)

SELECT * FROM user_data WHERE last_name = 'Smith'

만약, 입력값이 서버에서 검증 없이 그대로 쿼리를 만드는데 사용된다면, 모든 사용자 데이터를 조회하는 쿼리 형태를 생성할 수 있다. 그럼 SQL Injection 문을 만들어 볼 수 있다.

SELECT * FROM user_data WHERE last_name = 'Smith' or 'a' = 'a'
#항상 참이 되는 조건(or 'a' = 'a')을 추가 

그럼 이렇게 공격자가 원하는 정보를 볼 수 있다.

주의해야 할 점은 a의 마지막에 '를 붙이지 않는다. 서버에서 처리되면서 '는 붙기 때문이다.

profile
https://github.com/John-Jung

0개의 댓글

관련 채용 정보