CTF
[Swing CTF] Web-Baby Sign
오호츠크해 기단
2022. 11. 26. 00:39
728x90
Baby Sign
회원가입과 로그인을 할 수 있는 페이지가 만들어져 있다.
signin.php와 signup.php에서 SQL 구문을 사용할 때 $query = "SELECT * FROM users WHERE id='$id' AND pw='$pw';"; 와 같이 변수를 직접 SQL 구문에서 사용하므로 SQL injection이 발생한다.
$id와 $pw는 check함수에서 검사하고 있다. (util.php)
힌트를 보니 strpos 함수를 사용해서 문제를 풀 수 있는 것 같다. strpos 함수는 문자열이 처음 나타나는 위치를 찾는 함수로 위치 값을 정수로 반환한다. strpos의 반환값은 문자열의 위치를 정수로 반환하며, 0부터 시작한다. 만약 needle를 발견하지 못하면, strpos() 함수는 False를 반환한다.
때문에 $id의 첫 글자가 싱글쿼터(')라면 strpos의 반환값이 0이 되어 필터링에 걸리지 않는다. 로그인에서 이것과 Union injection을 통해 is_admin이 1인 회원으로 로그인하면 문제를 해결할 수 있을 것 있다.
DB를 확인해보면 4개의 데이터가 모두 1이어야 strpos 함수랑 다른 조건들 우회할 수 있기 때문에 마지막에 1, 1, 1, 1#을 추가해준다.
id를
'/**/and/**/1=0/**/union/**/select/**/1,1,1,1#
로 하면 정상적으로 admin 로그인이 된다. (비밀번호는 아무거나)
<로그인 후 화면>
<admin으로 로그인 후 Flag 페이지>
SWING{n0w_1ts_71m3_t0_s0lv3_th3_SIGN_prob!!!}