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!!!}