먼저 문제 코드는..
<?php
include "./config.php";
login_chk();
$db = dbconnect();
if(preg_match('/prob|_|\.|\(\)/i', $_GET[no])) exit("No Hack ~_~");
if(preg_match('/\'|\"|\`/i', $_GET[no])) exit("No Quotes ~_~");
$query = "select id from prob_goblin where id='guest' 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>";
if($result['id'] == 'admin') solve("goblin");
highlight_file(__FILE__);
?>
인데..보면 '나 " 이 문자를 쓸 수 없게 되어있다. 그러니 뒤에 id='admin'으로 하지 못한다는 뜻...
근데 처음에 no=1을 넣어보니까
Hello guest
라고 뜨고, no=100나 다른 숫자를 넣어보니 아무 문구도 뜨지 않았다. 그래서 no.1이 guest구나~ 싶었고 그럼 id='admin'의 no를 찾으면 되지 않을까? 싶어서 no=0 or no=1을 넣어보니 똑같이 guest가 떴고,
admin의 no가 guest랑 그리 멀지 않을 것 같아 no=0 or no=2 했더니..
ㅇㅣ런 때려맞추기로 맞아버렸네..
맞았는데 맞다고 하기 애매하게 맞았다. 하도 이상해서 인터넷에 따로 검색해보니
no=0 or id=0x61646d696e 라고 해야지 맞는다고..
0x61646d696e는 문자 admin을 16진수로 돌렸을때 나오는 값이다. 즉 그냥 admin은 기계어로 취급되는 글자이고, 0x61646d696e이자 문자열로서의 'admin'은 문자로 취급되는 글자인 것이다. (사실은 잘 모르지만 아마 그런 것 같다..)
그렇기에 따옴표로 admin이 문자임을 표시를 못한다면 숫자로 표시할 수 있는것! 결국 우리가 쓰는 모든 문자가 숫자이기 때문이다.
그래서 결국 풀긴 풀었지만..내가 푼 방식은 풀었다기보단 어쩌다 된거같고 정답풀이는 문자열 admin을 16진수로 표현해서 쿼리에 넣는것이다!!
'Web2 > LoS' 카테고리의 다른 글
[LoS] troll 풀이 (0) | 2022.11.10 |
---|---|
[LoS] orge 풀이 (0) | 2022.11.10 |
[LoS] wolfman 풀이 (0) | 2022.11.10 |
[LoS] orc 풀이 (0) | 2022.11.10 |
[LoS] cobolt 풀이 (0) | 2022.11.05 |
댓글