[Writeup]/[Lord Of SQLInjection] succubus

2025. 3. 5. 20:49Hacking/WebHacking Wargame Writeup

  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");

→ get으로 서버에 요청된 id, pw 값에 prob, _, ., (), ‘가 들어가면 필터링이 된다.

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

→ 명령문은 id를 찾는데, prob_succubus라는 테이블에 있어야하고, id, pw값은 요청된 id, 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 -- -

→ 클리어 창이 뜨는 것을 확인할 수 있다.