문제를 보면 id와 pw를 addslashes를 하는 것을 확인할 수 있습니다.
mysql에 대한 지식 기준으로 블라인드 문제인데 코드를 보면 addslahses 전에 쿼리를 실행하지 않습니다.
따라서 sqlite의 escaping이 mysql이랑 다르다는 것을 확인할 수 있습니다.
sqlite escaping
1. '(싱글 쿼터) 속에서의 escaping
-> 싱글 쿼터 문자만이 escaping이 필요합니다. 그 외 문자는 별도의 escaping은 필요 없습니다.
-> '(싱글 쿼터) escaping : 싱글 쿼터를 두 번 입력하면 됩니다.
-> ex) '"' ==출력==> " , '''' ==출력==> '
2. "(더블 쿼터 속에서의 escaping)
-> 더블 쿼터 문자만이 escaping이 필요합니다. 그 외 문자는 별도의 escaping은 필요 없습니다.
-> "(더블 쿼터) escaping : 더블 쿼터를 두 번 입력하면 됩니다.
-> ex) "'" ==출력==> ' , """" ==출력==> "
따라서 ?id=' or 1--+- 했을 때 쿼리는 다음과 같습니다.
select id from member where id='\' or 1--+-' and pw ''
노란색 : 입력 값 , 빨간색 : 주석처리
쿼리를 해석하면 id = \인 데이터가 모든 데이터를 의미합니다. 즉, 첫 데이터가 admin이면 클리어라고 나와야 하지만 했을 때 출력되지 않았습니다. 따라서 첫 데이터가 admin이 아닌 것을 확인할 수 있습니다.
따라서 ?id=' or 1 order by 1--+-를 하면 될 거라고 판단하였습니다.
해당 풀이로 풀 수 있는 이유는 db의 데이터가 얼마 없기 때문입니다. (지금까지 푼 문제에서는 보통 2개의 데이터가 존재했습니다. guest랑 admin 두 개)
따라서 order by 1을 쉽게 admin이라는 데이터가 나올 수 있을 거라고 생각하였습니다.
근데 만약에 db에 데이터가 많고 또는 db가 비어있을 때는 해당 풀이를 풀 수 있습니다. 이런 경우에는 admin이라는 문자열을 넣어야 합니다.
하지만 addslashes에 의하여 '(싱글 쿼터)와 "(더블 쿼터)가 필터링되어있습니다. 따라서 admin이라는 문자열을 hex값으로 넣어야 합니다.
그러나 sqlite에서는 hex 표기하는 방법이 0x~~ 가 아닌 hex'~~'로 하여 사용해야 합니다. 따라서 char(97, 100, 109, 105, 110) 식으로 사용하여 문자열을 나타낼 수 있습니다.
'Hacking > LOS : Lord of SQLInjection' 카테고리의 다른 글
LOS : poltergeist (0) | 2020.11.09 |
---|---|
LOS : banshee (0) | 2020.11.08 |
LOS : chupacabra (0) | 2020.11.06 |
LOS : cthulhu, death, godzilla, cyclops (0) | 2020.11.05 |
LOS : alien (0) | 2020.11.04 |