<우리의 목표>
: 가지고 있는 계정으로 필터링을 우회해서 로그인하기!

일단 문제 파일에는 아무것도 없는 걸 확인

문제 페이지에 접속하면 로그인할 수 있는 화면이 뜨고,
get source을 누르면 아래와 같은 코드를 보여준다

if($id=='guest' || $id=='blueh4g')을 만족시키지 않을 때 FLAG를 주는 것을 확인

주석을 보면 이 사람은 지금 2개의 계정을 가지고 있다
guest / guest
blueh4g / blueh4g1234ps

먼저 guest/guest로 로그인 -> your account is blocked

여기서 중요한 것은 ✨MySQL은 대소문자 구분을 안한다!✨
Guest/guest로 로그인 -> flag!!!

🔑 DH{2e0d4c7cf3439496098216db17c52b2c922a2124}
나도 드디어 chatGPT 문제!!
(그러나 chatGPT를 사용하진 않았다...)

문제 페이지에는 userlevel로 로그인하는 기능밖에 없다

문제 코드를 보면

guest와 admin 계정이 있다
insert into users(userid, userpassword, userlevel) values ("guest", "guest", 0), ("admin", "{binascii.hexlify(os.urandom(16)).decode("utf8")}", 0);
그리고 아래 쿼리문으로 로그인 정보를 확인한다
select * from users where userlevel='{userlevel}'
따라서 userlevel 입력 칸에
0' and userid = 'admin을 입력하면

flag get~
🔑 DH{chatGPT_told_me_a_lullaby}
strcmp (문자열 비교 함수)를 우회하라는 문제이다

먼저 strcmp에 대해 알아보면
strcmp(string1, string2)
| 값 | 의미 |
|---|---|
| 0보다 작음 | string1이 string2보다 작음 |
| 0 | string1이 string2와 같음 |
| 0보다 큼 | string1이 string2보다 큼 |
문제 페이지를 보면 password를 입력하게 되어있다

view-source를 클릭하면 아래 코드를 보여준다

if(strcmp($_POST['password'], $password) == 0)
echo "Congratulations! Flag is <b>" . $FLAG . "</b>";
이 부분을 보면 입력한 password와 실제 password를 비교해서 같으면 flag를 출력한다
✨하지만 php의 strcmp함수는 문자열과 배열을 비교하면 같지 않더라도 0이 출력되는 취약점이 있다고 한다!!✨

password 부분을 password[]로 바꾸고 chk를 다시 누르면

flag를 얻을 수 있다!

아래 사진은 0000을 입력했을 때 모습이다

0000을 []로 바꿔주고 forward하면 마찬가지로 flag가 출력된다!

🔑 DH{aede9e7fa4ccb8225f12040a16bdfd37c0c5d2f0}