<우리의 목표>
: 가지고 있는 계정으로 필터링을 우회해서 로그인하기!
일단 문제 파일에는 아무것도 없는 걸 확인
문제 페이지에 접속하면 로그인할 수 있는 화면이 뜨고,
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}