3번문제의 php코드

1.문제풀이

 

1) 코드해석

  • 이번문제는 약간의 필터링이 걸려있다는것을 다음 코드에서 알 수 있다

 if(preg_match('/\'|\"|\`/i'$_GET[no])) exit("No Quotes ~_~");

  • 위에 보이는것과 같이 우리가 공격할 때 필요한 싱글쿼터('), 더블쿼터(")가 필터링이 걸려있는것을 볼 수 있다.
  • 또 이번문제에서는 SQL쿼리문에 id='guest'로 고정되어있고 그뒤에 no={$_GET[no]}값으로 검증한다
  • 이번에도 2번문제와 같이 admin계정으로 접속해야 문제가 풀리는 방식이다

 

2) 문제풀이

select id from prob_goblin where id='guest' and no={$_GET[no]}

  • 우리는 guest의 no값을 알 수 없으므로 위 SQL쿼리문에서 노란색으로 칠해진 부분부터 참이되게 만들어야한다
  • 먼저 no=no라고 대입하여 말 그대로 참이되게 만든결과 guest로 접속한것을 볼 수 있다

guest접속 성공 화면

  • 하지만 문제는 admin으로 접속해야 한다는 것이다
  • 그렇다면 no=2 or id='admin'으로 공격을 시도해본다
  • no=2라는 값을 준 이유는 위 구문을 SQL쿼리문에 대입하면 select id from prob_goblin where id='guest' and no=2 or id='admin'
  • 위 파란색부분이 거짓이되고 id='admin'이라는 부분이 참이되므로 admin으로 접속할 수 있기 때문이다.
  • 하지만 이번 문제에서는 쿼터가 필터링 되어있으므로 다른방법을 찾아야한다.
  • 여러 방법중 하나로 admin이라는 문자를 16진수(Hex)로 입력하는 스트링 우회법이 있다
  • 인터넷에 검색해본 결과 admin은 0x61646d696e로 변환된다
  • 따라서 admin대신 변환문자를 이용해 공격하면 된다
  • 공격시 삽입 구문: no=2 or id=0x61646d696e
  • 공격 후 구문: https://los.rubiya.kr/chall/goblin_e5afb87a6716708e3af46a849517afdc.php?no=2%20or%20id=0x61646d696e 
  • 공격을 수행하면 결과적으로 SQL쿼리문에 다음과 같이 공격 시 삽입 구문이 대입되므로 공격이 성공한다.
  • select id from prob_goblin where id='guest' and no=2 or id=0x61646d696e

 

공격 성공 화면

'Lord of SQLi | WebHacking.kr' 카테고리의 다른 글

Lord of SQLi(#6 darkelf)  (0) 2022.12.30
Lord of SQLi(#5 wolfman)  (0) 2022.12.28
Lord of SQLi(#4 orc)  (0) 2022.12.28
Lord of SQLi(#2 cobolt)  (1) 2022.12.28
Lord of SQLi(#1 gremlin)  (0) 2022.12.28

+ Recent posts