실습 환경 구축은 이 글에 설명되어있다. (https://rimystory.tistory.com/18)
GET/Select (sqli_2.php) 페이지는 드롭다운 메뉴를 사용하여 영화를 선택한다.
1. 난이도: low
Get 메소드를 사용하여 요청하기 때문에 URL 상에 변수가 보인다.

Go를 눌러보면 변수명은 movie, 숫자형을 입력 값으로 받는 것을 볼 수 있다.
기존 GET/Search의 공격 쿼리와 동일하게 SQL 인젝션을 시도한다.
/bWAPP/sqli_2.php?movie=0 union select null,database(),@@version,@@datadir,null,null,null&action=go
숫자형만 입력받는 변수에 SQL 인젝션을 시도할 때는 작은 따옴표와 주석 문자를 사용하지 않아도 공격이 가능하다. (SQL 쿼리 특성)

information_schema로 bWAPP 데이터베이스에 있는 테이블 명을 파악한다.
/bWAPP/sqli_2.php?movie=0 union select null,table_name,null,null,null,null,null from information_schema.tables&action=go
[결과화면]

이 페이지는 출력 값이 한 줄만 나오는 기능을 가지고 있기에 맨 첫번째 테이블만 출력하는 것을 알 수 있다.
따라서 MySQL 데이터베이스의 기본 테이블을 제외한 테이블 스키마, 테이블 명, 칼럼 명을 출력하는 구문을 입력한다.
0 union select null,table_schema,table_name,column_name,null,null,null from information_schema.columns where table_schema!='mysql' and table_schema!='information_schema'
[결과화면]

mysql과 information_schema를 제외하고 가장 상위에 있는 스키마는 'bWAPP', bWAPP 테이블 스키마에서 가장 상위에 있는 테이블 명은 'blog', blog 테이블에서 가장 상위에 해당하는 칼럼 명은 'id'라는 정보를 확인할 수 있다.
2. 난이도: high

난이도 상은 sqli_2-ps.php 페이지를 사용한다.
비박스 가상환경에서 /var/www/bWAPP/sqli_2-ps.php 의 소스코드를 확인한다.

다른 SQL Injection 페이지들과 달리 특혈한 우회 함수를 사용하지 않고 SQL 쿼리를 호출한다.
로직 설명:
1. 데이터베이스에서 가져온 내용을 fetch_object 함수를 사용하여 객체로 생성한다.

2. movie 변수에 입력한 숫자 값이 id 변수에 대입된다. (id: recordset에 저장된 DB 내용의 순서 번호)
3. bind_param 함수를 사용하여 DB에서 사용하는 변수들을 불러오고 execute 함수로 쿼리를 실행한다.
4. bind_result 함수로 각 변수를 연결하고 store_result 함수로 쿼리 결과를 저장한다.
(대응방안)
데이터베이스에서 컬럼을 개별로 호출하고 연결하는 방식을 사용하여 SQL 인젝션을 대응할 수 있다.
'Projects > 애플리케이션 보안' 카테고리의 다른 글
| [bWAPP] Blind SQL Injection 공격 실습 (Boolean Based) (4) | 2025.08.26 |
|---|---|
| [bWAPP] SQL Injection(POST/Select) 공격 실습 - SQLMap 활용 (0) | 2025.08.25 |
| [bWAPP] SQL Injection(POST/Search) 공격 실습 (3) | 2025.08.25 |
| [bWAPP] SQL Injection(GET/Search) 공격 실습 (2) | 2025.08.25 |
| [bWAPP] PHP Code Injection 공격 실습 (0) | 2025.08.21 |