Web
SQL-Injection 정리(1)
whh1323
2020. 3. 19. 19:01
기본적인 에러기반 SQL Injection --> ' or '1=1
이것을 기본으로 필터링 또는 우회해서 문제를 푼다.
ex) select id from test where id='{$_GET[id]}' and pw='{$_GET[pw]}'
현재 GET 방식으로 파라미터를 전달하고 있다.
url이 ~~.php?id=admin&&pw=admin
이라 하면 sql 구문은 select id from test where id='admin' and pw='admin' 으로 삽입이 되어진다.
여기에 아무 필터링이 없다는 가정하에
~~.php?id=admin&&pw=admin' or '1=1 을 입력하게 되면
select id from test where id='admin' and pw='admin' or '1=1' 으로 sql구문이 들어가게 된다.
pw='admin' or '1=1' 에서 결과 값이 참이 되어 admin으로 로그인이 되는것이 아니라,
id='admin' and pw='admin' 구문이 거짓으로 되고 그 뒤에 or '1=1'이 들어가 (거짓or참 = 참)이 되어서 결과값이 참이 되어 admin으로 로그인이 되는것이다.
los.rubiya.kr 1번문제 gremlin을 보면
<?php
include "./config.php";
login_chk();
$db = dbconnect();
if(preg_match('/prob|_|\.|\(\)/i', $_GET[id])) exit("No Hack ~_~"); // do not try to attack another table, database!
if(preg_match('/prob|_|\.|\(\)/i', $_GET[pw])) exit("No Hack ~_~");
$query = "select id from prob_gremlin where id='{$_GET[id]}' and pw='{$_GET[pw]}'";
echo "<hr>query : <strong>{$query}</strong><hr><br>";
$result = @mysqli_fetch_array(mysqli_query($db,$query));
if($result['id']) solve("gremlin");
highlight_file(__FILE__);
?>
로그인 인증 부분에서 id($result['id']) solve("gremlin");
으로 result에 id값이 존재한다면 무조건 풀리게 된다.