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

[비박스를 활용한 웹 취약점 진단] 12. 크로스 사이트 요청 변조(CSRF) [Change Password]

by Robert8478 2023. 12. 14.

CSRF(Cross-site Request Forgery)란? - 공격자에 의해 사용자가 의도하지않은 악의적 행위를 서버에 요청하게 되는 취약점이다. 공격자가 입력한 악성 스크립트에 접근하면 사용자의 웹 브라우저가 스크립트 코드에서 의도한 내용을 웹 서버로 요청한다.
웹 서버는 변조된 요청을 사용자의 정상적 요청으로 판단하고 응답을 내보내게 된다. XSS와는 다르게 CSRF는 웹 브라우저를 신뢰해서 발생하는 취약점으로, 웹 사이트는 사용자가 보낸 요청이 정상적인지 변조된것인지 구별하지 못한다. 또한, XSS는 공격 대상이 사용자이지만 CSRF는 사용자가 공격의 매개물로 이용되어 악의적인 요청을 웹 사이트에 요청하도록 하는 공격이다.

[난이도 하]

이번 페이지는 접속한 사용자의 비밀번호를 변경할 수 있는 페이지이다. GET 메서드라 URL에 변수가 노출된다. 이를 img 태그로 악성 태그를 만들어서 htmli store 페이지에 올려서 변경을 시도해보도록 하자. 그러면 htmli store를 사용하는 사용자가 클릭 시 악성태그가 실행될것이다.

<img src="http://192.168.56.102/bWAPP/csrf_1.php?password_new=evil&password_conf=evil&action=change" width="0" height="0"> 악성 코드를 넣어서 추가해주면 Entry 에 아무것도 안보이는데 이는 width와 height가 0이기 때문이다. 하지만 비밀번호는 변경되었을 것이다. sqli_16.php 페이지에 가서 로그인을 시도해보자.

원래 비밀번호는 bug 였는데 위에서 img 악성 태그가 실행됨에 따라 비밀번호가 evil로 변경되었다.

[난이도 중,상]

난이도 중 부터는 현재의 패스워드도 입력하라고 나오기 때문에 현재의 패스워드를 알거나 SQL 인젝션을 시도해야할 것이다. 이처럼 비밀번호 변경 사이트에서 현재의 패스워드를 입력하라고 하는것은 CSRF를 막기위함도 있는 것이다. PHP 코드를 보자

mysqli_real_escape_string 함수를 통해 SQL 인젝션을 방어하면서 SHA-1 해시 함수를 사용해서 password_curr 변수의 입력값을 해시값으로 변환 후 DB에 저장된 비밀번호 해시값과 비교까지 한다. 그렇기에 비밀번호 변경을 위해 현재 비밀번호가 필요하게 된다.