forcelogin 2
초기화면을 보면 /source를 확인하라고 나와있다.
소스 코드를 확인해 보면 앞에서 풀었던 forcelogin1 문제와 매우 유사하다는 느낌을 받을 수 있다.
대신 이번 문제는 mysql이 아닌 mssql이라고 한다.
또한, 앞에서 풀었던 문제와 다르게 해당 문제에는 쿼리 구문에 table이 추가된 것을 확인할 수 있다.
해당 문제는 id의 값으로 admin을 받으면 flag를 얻을 수 있는 문제라는 것까지 알 수 있다.
가장 먼저 로그인 기능을 확인하기 위해 guest 계정으로 로그인해 보았다.
admin이 아니라서 권한이 없다고 뜬다.
이를 통해서 admin으로 로그인을 하면 flag 값을 얻을 수 있다는 것을 알 수 있었다.
이 문제 풀때 table Injection이라는 힌트를 받았다.
tabel Injection이 무엇인지 구글링을 해보았지만 출제자의 의도에 맞는 내용은 나오지 않았다.
그래서 forcelogin1과 마찬가지로 공식문서부터 찾아보았다.
공식 문서에서 위 사진과 같은 내용을 찾을 수 있었고, 이를 이용해서 구문을 작성하였다.
sql test 페이지를 이용하여 id의 값으로 admin을 결과로 얻을 수 있도록 구문을 작성하였고, 해당 구문은 아래와 같다.
SELECT ID FROM (VALUES ('admin','admin')) AS MyTable(id, password) where id ='admin' and password = 'admin'
위 구문을 url에 넣는 형식으로 수정해주면 다음과 같다.
loginAction?T=(VALUES('admin','admin')) AS My(id,password)&id='admin'&pass='admin'
해당 구문을 url에 넣어주면
flag 값이 나오는 것이 아닌 no hack ^__________^ 이 나온다.
얼레...
왜 flag 값이 나오지 않았는지 고민해 보니 우선 싱글 쿼터가 banlist에 들어있다.
또한, 띄어쓰기는 url 인코딩으로 인해서 해당 구문이 매우 길어진 것을 확인할 수 있었다.
가장 위에 보았던 소스코드에서 확인할 수 있듯이 글자 수 제한이 있어서 flag 값이 나오지 않은 거 같았다.
띄어쓰기는 띄어쓰기 대신 +를 통해 구문을 이어주면 해결할 수 있지만, 가장 큰 문제는 싱글 쿼터 우회였다.
싱글 쿼터가 banlist에 들어있기 때문에 이를 우회하기 위해 hex 값으로 바꿔주려고 하다 보니 글자 수가 너도무 길어졌다.
이를 어떻게 해결할 수 있을지 고민해 보았다.
현재 작성한 구문은 id와 pass 모두 admin으로 로그인하고 있다. 하지만 소스 코드에서 확인할 수 있듯이 해당 문제를 해결하기 위해서는 id만 admin으로 로그인하면 된다. 따라서 pass의 값을 admin이 아닌 아무런 숫자나 넣어서 로그인 시도를 해보았다.
http://localhost:5004/loginAction?T=(values(0x61646d696e,0))+AS+My(id,password)&id=admin&pass=0
작성한 구문을 넣었더니 위 사진처럼 flag 값을 확인할 수 있었다.
flag 값 : seKUCTF{TAb1e_1njecti0n_ATTACK~@!!@}
얏호~!
'Web - 실습' 카테고리의 다른 글
simplecalculator (0) | 2023.05.03 |
---|---|
forcelogin 1 (0) | 2023.04.02 |
forelength (0) | 2023.03.26 |
pingservice (0) | 2023.03.21 |
HelloCTF (0) | 2023.03.19 |