문제를 보자.
pw 파라미터를 GET방식으로 받고 그 값의 길이가 6이 넘어가면 안된다.
그 값을 통해 처리한 쿼리의 결과 id값이 존재하면 문제가 풀리는데 특이점은 id!='admin'이 있다는 점이다.
pw가 괄호로 막혀있기 때문에 가장 간단하다고 생각한 것은 ')||1# 이다.
하지만 No Hack ~_~ 이 떠버린다 ㅠㅠ
이유를 찾아보니 주석처리를 막아두었다. #과 -를 막았다
주석을 이용하지 말라는 의미이다.
즉, 잘 이어보라는 의미인데... 흠
결국 힌트를 받았다.
Mysql 의 auto type cast를 이용하라고 한다.
간단하게 설명하자면 string의 column값을 Int형과 비교하게 하면 string은 항상 0이 return되어 =0을 하게되면 결과가 모두 뜬다는 것이다.
첫번째는 string column인 col1과 0을 비교할 경우 col1은 0이 출력되어 0=0이 되어 모든 컬럼이 출력된다.
이를 문제에 대입시킬 경우 (')=0을 할 경우 모두 0이 되어 모든 컬럼이 출력되는 것이다.
그렇다면 필요한 글자 수는 ')=0 이렇게 최소 4개이고 그 뒤에 주석으로 2개를 사용하면 된다.
mysql에서 사용할 수 있는 주석에 #과 --를 제외하고 사용할 수 있는 주석이 있을까?
;%00 을 이용해서 할 수 있다!
;을 이용할 경우 쿼리의 나머지부분은 다음 쿼리로 실행시키려하기 때문에 %00을 통해 문장이 끝났다는 것을 알려주면 된다.
이를 통해 클리어!
pw=')=0;%00
** 참고
- Mssql 의 경우 auto type cast가 되지 않아 error based sql injection이 편하다 (다른 형태로 비교하려고 하면 쿼리결과를 error에 출력시켜주기 때문)
- 하지만 mysqql 의 경우 auto type cast때문에 error에 쿼리 결과가 뜨지 않는다. 따라서 다른 방식을 이용해야한다!!
select * from (select name_const(version(),1),name_const(version(),1))a
select * from table where 1=1 and ExtractValue(1,concat(0x01,version()))
select * from table where 1=1 and UpdateXML(1,concat(0x01,version()),1)
select * from table where (@:=1)or@ group by concat(@@version,@:=!@)having@||min(0)
출처: http://itstarter.tistory.com/394
'Solve Problem > LOS' 카테고리의 다른 글
[LOS] 20번 문제 (0) | 2018.02.14 |
---|---|
[LOS] 19번 문제 (0) | 2018.02.11 |
[LOS] 17번 문제 (0) | 2018.02.08 |
[LOS] 16번 문제 (0) | 2018.02.08 |
[LOS] 15번 문제 (0) | 2018.02.08 |