형식이 신기하게 바뀌었다. 일반적인 '#' 주석과 '--' 주석은 필터링 되어있다.
또한 pw의 입력값을 6글자 초과로 받을 수 없다.
싱글쿼터가 필터링되지 않기 때문에 pw의 ('') 를 탈출시켜야 한다.
탈출시키는 방법은 단순하다.
pw=')
과 같이 탈출시키면 된다. 이제는 참값을 만들 차례다.
SQL에서는 형이 다른 데이터를 비교할 때 '묵시적 형변환'이라는 것을 실시한다.
만약 문자열과 정수를 비교할 때에는 문자열이 0이라는 숫자로 형변환된다.
따라서 'abcd'=0 이라는 결과가 도출된다.
이와 같이 공백의 문자열에서도 이가 성립한다.
따라서 ''=0 이라는 결과도 도출된다.
이를 이용하면 pw의 값을 '참'이라는 값으로 넣어줄 수 있다.
pw=TRUE 라는 결과가 query 문으로 전달되고, and 연산자 뒤의 query 문이 무력화된다면 문제는 풀릴 것이다.
그 전에 gremlin 문제에서 간단한 테스트를 한 번 해보도록 하겠다.
gremlin 문제는 단순하게 where 뒤의 query 문을 참으로만 만들면 되는 문제였다.
id=''=0 즉, id=TRUE 를 전달하면 어떻게 되는지 보자.
당연하게 solve 된다. 테스트도 마쳤으니 바로 원래 문제로 이동하여 query 문을 전달하자.
우리는 where 뒤를 참으로만 만들어야 하기 때문에 뒤의 and id!='admin' 은 무용지물화 시키자.
하지만 주석들을 모두 쓸 수 없다. 이 때, query문 끝에 세미콜론(;)을 붙임으로써 문자열의 마지막 부분임을 암시하고, 그 뒤에 '%00'을 붙임으로써 실질적으로 문자열이 끝났음을 알리면 뒤의 문장은 무력화된다.
이렇게 작성한다면 소름돋게 pw 입력값의 길이가 6이 된다.
pw=')=0;%00
'Web Hacking > LOS' 카테고리의 다른 글
Lord of SQL Injection - dragon (0) | 2021.08.22 |
---|---|
Lord of SQL Injection - xavis (0) | 2021.08.22 |
Lord of SQL Injection - zombie_assassin (2) | 2021.08.21 |
Lord of SQL Injection - succubus (1) | 2021.08.18 |
Lord of SQL Injection - assassin (0) | 2021.08.18 |