오랜만에 id가 admin인지만을 묻는 문제가 나왔다. 또한 첫 번째 query문이 정상적으로 전달되었을 때, query2에서 첫 번째 query의 결과를 가져와 id가 admin인지를 검사한다.
우선 첫 번째 query문은 많이 해왔던 역슬래시를 이용한 문자열 탈출을 하면 된다.
?id=\&pw= or 1%23
여기까지는 간단하다. 아래 조건문을 만족하기 위해서, query문이 정상적으로 날라가야 한다. MySQL에서는 query문이 정상적으로 작동하기 위해서 where 뒤의 부분을 참값으로 만들어주거나, subquery 문이 존재할 경우 select로 선택할 column의 개수와 subquery로 선택할 column의 개수가 같아야 한다.
예를 들어서 이번 문제같은 경우는 선택할 column의 개수가 2개이기 때문에 subquery를 사용한다면 이 역시도 2개의 column을 return 해주어야 할 것이다. 하지만 위에서 id, pw 가 모두 참값일 때 select 되는 column들이 없었기에 아래 조건문을 만족하지 않았다.
그렇다. 이번 문제에서의 table은 EMPTY 상태이다. 우리가 있는 것처럼 만들어야 한다. 우선 union을 이용하여 조건문을 만족시켜보자.
?id=\&pw= union select 1,2%23
query2가 등장한 것을 볼 수 있다. 뭐 여기까지 왔다면 감이 올 것이다. query2의 where 뒤의 부분을 id='admin'으로만 만들어주면 된다. 하지만 필터링에서 쿼터들을 모두 사용할 수 없게 만들어 놓았다. 쿼터들을 사용하지 못할 때 16진수로 변수를 전달하는 방법이 LOS 초반 문제에 있었던 것으로 기억한다. 오 goblin이라는 문제였다. 바로 찾았다.
또한 위에서 전달한 두 개의 column이 1,2 이고, 아래에서도 id의 문자열을 탈출해야 하므로 1번 자리에는 역슬래시를 넣어주어야 할 것이다.
이제 query문을 작성하여 보자.
?id=\&pw= union select \, union select 0x61646d696e%23
과 같이 전달해주었으나 아무런 반응이 없다. 뒤쪽 union select가 문자열로 날라가서 query2 에서는 query문으로 사용되어야 하는데 query1에서 단순하게 query문으로 인식되고 끝나는 것 같다. 모두 16진수로 날려주어야 한다. 마찬가지로 admin이라는 문자열을 전달해줄 때, query2에서는 id='admin', 즉 admin이라는 데이터가 문자열로 인식되어야 한다. 하지만 위에서 전달한 방식으로는 id=admin 이라고 표현되어 admin이라는 변수명과 비교하게 된다. 따라서 이것마저도 16진수로 바꾸어야 한다. 귀찮다.
?id=\&pw= union select 0x5c,0x20756e696f6e2073656c6563742030783631363436643639366523%23
'Web Hacking > LOS' 카테고리의 다른 글
Lord of SQL Injection - blue_dragon (0) | 2021.08.29 |
---|---|
Lord of SQL Injection - evil_wizard (0) | 2021.08.26 |
Lord of SQL Injection - hell_fire (0) | 2021.08.26 |
Lord of SQL Injection - dark_eyes (0) | 2021.08.24 |
Lord of SQL Injection - iron golem (0) | 2021.08.24 |