이번문제는 자동화도 필요없고 굉장히 단순한 문제이다. clear 한 결과 이번 문제는 공백문자 우회기법과 limit 을 사용할 줄 아는가? 를 물어보는 것 같다.
코드의 해석은 아래와 같다.
우선 GET 으로 pw 파라미터를 받고있고, 이 파라미터는 prob, _ , () 문자가 들어가면 필터링되어 no hack이 뜨도록 되어있으며 공백이 들어가면 'No whitespace'가 뜬다. if 절을 보면 id 가 있는 레코드값이 출력되면 현재 그 id 를 출력해주고, id 가 admin 이면 문제가 통과된다.
즉, 문제풀이 방향은 아래와 같은 것이다.
' or 1=1 에서 공백들을 우회해주고, 1=1 은 모든 레코드가 다 출력되기 때문에 이것을 limit 으로 한개씩 확인해주면 될 것 같다.
아래 사진에서 쿼리스트링을 보면' or 1=1 %23 에서 공백이 들어가있기 때문에 no white space 가 뜬다. 이것을 우회해 주면 된다.
공백문자 (space) 는 URL 인코딩하면 %20 이다. 하지만 공백들을 %20 으로 치환해도 No whitespace 가 뜬다.
공백문자 필터링을 우회해 줄 수 있는 방법들은 여러가지가 있다. 대표적으로 \t (TAB) 을 URL 인코딩한 %09 로 우회해 줄 수 있다. 공백 문자를 우회하는 여러가지 방법은 아래와 같다.
%20 %09 %0a %0b %0c %0d %a0 /**/
나는 tab %09 를 통해 우회했다.
Hello guest 가 뜨게 되는데 이것을 admin 으로 바꿔주야한다. 우리는 현재 공백문자 필터링을 우회하여 or 1=1 # 로 True 로 만들어 모든 row 를 뽑아내었다. 이것이 이해가 안되면 아래 샘플사진을 보자.
현재 나는 shopdb 에 있으며 indextbl 테이블을 이용할 것이다. 그리고 indextbl 은 총 500 개의 row 가 존재한다.
정상적인 쿼리문을 날려보자 아래 쿼리는 first_name 이 Georgi 를 찾아 모든 column 을 출력하는 것이다.
정상적으로 하나의 결과값이 나온것을 확인 가능하다. 이제 or 1=1 # 를 통해 모든 row 를 뽑아보자.
or 1=1 땜에 where 절이 True 가 되어 모든 row 가 뽑히는 것이다 결과를 보면 500 개의 row 모두 출력됨이 확인 가능하다. 또한 주석 # 때문에 ; 가 무시되어 -> 프롬프트가 생성되어 다시 ; 를 달아주어야하는 것이다. 이제 다시 본론으로 돌아가자.
이제 limit 을 통해 idx 가 1 인 row 부터 1개를 뽑아주어 clear 할 수 있다.
payload 는 이렇게 된다. pw='%09or%091=1%09limit%091,1%09%23
이해가 되지않으면 아래사진 밑에 예시들을 보자
예로 단순히 5개의 row 를 뽑는다 가정하면 limit 5 를 사용하면되지만
특정 idx row 부터 특정개수를 뽑는 limit 2,1 의 경우는 세번쨰 row 한개를뽑는다는 의미가 된다. (limit 의 idx 는 0부터 시작한다) 즉, limit 0,1 은 guest 가 되는 것이고, limit 1,1 은 admin 이 되는 것이다. 이해가 안되면 아래의 예를 보자
아래의 쿼리는 총 4개의 쿼리를 뽑아낸것이다. 해당 쿼리의 맨윗줄은 Aamod 인데, 이것을 지금 현재 문제에 비유하자면
guest 가 되는 것이고 Abdulah 가 admin 이 되는 것이다.
idx 가 0인 행으로부터 1개를 뽑아오는 예제다. Aamod 가 나오는것을 확인 가능하며 이것이 guest 인 것이다.
idx 가 1 인행부터 한개를 뽑아오면 Abdulah 가 나오는데 이것이 admin 이라고 볼 수 있다.
'WebHacking > Lord of SQLInjection' 카테고리의 다른 글
vampire (0) | 2022.11.17 |
---|---|
troll (0) | 2022.11.17 |
orge (0) | 2022.11.15 |
darkelf (0) | 2022.11.15 |
orc (0) | 2022.11.15 |