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

idontbelonghere·2024년 3월 27일

앞으로 진행되는 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
해킹을 잘하자

0개의 댓글