[Lord of SQLInjection]goblin write up

zzsla·2023년 6월 8일
0
post-custom-banner

문제 정보

없다

문제

문제에 들어가면 위에 query와 sql명령문이 적혀있고 아래 코드가 나와 있다.

분석

get으로 요청된 no값에 prob, _, ., (), ', ", ` 이 들어가면 프로그램이 죽는다. 즉 저 값들이 필터링되어 있다.

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

그 다음은 query에 sql명령문이 나온다.
명령문은 id를 찾는데 prob_goblin이라는 table에 있어야 하고, idguest이고, no는 get으로 요청한 값이여야 한다.

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

id가 있으면 hello (id값) 이라고 출력되고, idadmin이면 문제가 풀린다.

  if($result['id']) echo "<h2>Hello {$result[id]}</h2>"; 
  if($result['id'] == 'admin') solve("goblin");

취약점

먼저 query에서 id부분이 guest로 고정이 되어 있다. 그 고정을 풀기 위해 sql의 or를 사용해야 한다.
그리고 필터링 중에 '가 필터링이 되어 있기 때문에 '가 없이 idadmin으로 잘 지정해 줘야 한다. 즉 filter bypass를 잘 해 줘야 한다.

익스플로잇

먼저 guest로 고정되어 있기 때문에 no에 false값을 넣고(no에 0,1,2,3,4 넣어보면 guest는 1이라는 것을 알 수 있다.) or를 사용한다.
id= 'admin'으로 바꿔줘야 하는데 '로 필터링 되어 있으니까 filter bypass로 id=0x61646d696e로 적어준다. 저것은 ascii 코드로 admin이다. '를 사용할 필요없이 admin을 나타낼 수 있기 때문에 사용했다.
/?no=0 or id=0x61646d696e

익스플로잇을 넣었을 떄 실행될 sql query

select id from prob_goblin where id='guest' and no=0 or id=0x61646d696e
profile
[README]newbi security hacker :p
post-custom-banner

0개의 댓글