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

[비박스를 활용한 웹 취약점 진단] 8-1.취약한 직접 객체 참조 [Reset Secret]

by Robert8478 2023. 12. 13.

이번 페이지는 접속한 사용자의 비밀번호 힌트를 'Any Bugs?' 로 초기화 하는 기능을 제공한다. 여기에서 버프슈트를 사용해 요청값을 가로챈 뒤 Insecure DOA를 이용해서 다른 사용자의 비밀번호 힌트를 초기화 해보자.

[난이도 하]

Any bugs? 버튼을 누르고 해당 요청을 버프슈트로 캡쳐해 보았다. 보아하니 xxe-2.php 페이지로 XML 타입의 변수를 전달하는듯 하다. 전송되는 변수는 login과 secret이고, 아이디와 초기화할 비밀번호 힌트가 입력되어 있다.

secret 변수에 입력된 초기화 비밀번호 힌트 문자열을 다른 문자열로 변경하고 Forward 해보자. 이제 sqli_16.php로 가서 힌트값을 확인하자.

그랬더니 비밀번호 힌트 값이 아까 Forward 시켜주었던 값으로 변경된 것을 볼 수 있다. 이번에는 다른 사용자에게 시도해보자.

같은 방식으로 하되 login 변수의 값을 다른 사용자의 계정명으로 변경해주면 된다.

그랬더니 다른 사용자의 비밀번호 힌트 값도 변경되었다.

[난이도 중,상]

난이도 중과 상 모두 난이도 하와 같은 결과를 보인다. 다른 사용자의 변경도 수행해보자.

난이도 상에서 다른 사용자의 계정에 대한 힌트값을 변경해서 forward 시켰다.

그런데 페이지로 이동해보니 변경이 되어있지 않았다. 이 부분을 제외하고 별다른 난이도 구분이 없는것 같았다. 그러니 xss-2.php 페이지를 호출해서 비밀번호 힌트를 초기화 했으므로 이 페이지의 소스코드를 보자.

난이도 상에서는 login 변수를 보다시피 세션에서 받아 입력한다. 즉, 이렇게 되면 버프슈트에서 수정해도 로그인한 사용자의 비밀번호 힌트만이 초기화된다. 또한, mysqli_real_escape_string 함수를 통해 힌트값을 필터링하고 있다. SQL인젝션에 사용하는 특수문자는 XXE 공격에도 사용되기 때문에 XML 코드를 일반 문자로 변환시킨다. 그렇기에 만약 힌트값에 SQL 인젝션이나 XXE와 같은 구문을 넣어도 난이도 중부터는 막힐 것이다.