S! 웹해킹 스터디를 시작하면서
3주차 스터디 과제는 LOS(Lord Of Sql injection) stage 15까지 푸는 것이었습니다.
포너블 했을 때 익숙한..! 이번엔 LOB가 아닌 LOS 풀이를 올립니다. (헤헤 기대된당)
분석
모든 익스는 분석부터!
웹에서는 php 코드가 주어집니다. sql 인젝션은 php를 통해서 DB를 조작하는데,
이때 보내는 query문을 자신의 입맛에 맞게 바꾸어 공격하는 것이랍니다.
여기서는 get 방식으로 id, pw를 보내는데,
get 방식은 url 뒤에 데이터를 보내기 때문에,
https://los.rubiya.kr/chall/gremlin_280c5552de8b681110e9287421b834fd.php?id=abcd&pw=1234
이렇게 id와 pw를 정해서 보내주면
query에 우리가 입력한 쿼리를 보여주게 됩니다.
코드를 차근차근 살펴보겠습니다.
<?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__);
?>
include 부터 db connect까지는 그냥 php를 불러와서..? db를 연결하기까지의 과정인 것 같고
preg_match함수에서는
첫번째 인수로 정규 표현식,
두 번째 인수로 검색 대상 문자열,
세 번째 인수로 패턴 매체에서 매칭된 값을 배열로 저장하는 기능을 합니다.
매칭에 성공하면 1 아니면 0을 반환합니다.
여기서 알아야하는 정규표현식 문법으로
/ 단어 사용은 전체에서 알파벳을 따로따로 찾는게 아니라 /뒤에 있는 단어에 매칭되는 것만을 찾습니다.
|는 or 기호
i는 대소문자를 구분하지 않는다는 기호.
나머지는 찾아도 잘 안나오는데..
그냥 다른 방식으로 접근하는 것을 막기 위해 존재합니다.
https://los.rubiya.kr/chall/gremlin_280c5552de8b681110e9287421b834fd.php?id=prob&pw=1234
이렇게 입력하면 prob에 걸려서
이렇게 뜬답니다.
입력받은 id와 pw를 이용해서 쿼리를 만들고,
쿼리로 받은 값이 참이면..? 문제가 풀리게 됩니다.
풀이
sql 인젝션으로 많이 배우는 것은 ' or 1==1 # 같은 구문일 것입니다.
가장 기본적이기도 하고 직관적으로 이해되는 것인데,
물론 풀이가 여러가지 방법이 있겠지만 작은 따옴표의 짝을 맞춰준다.. (해커가 의도한대로) 에 유념하여
쿼리를 조작하면 됩니다.
이렇게 만들어서 풀 수도 있고
주석을 이용할 수도 있는데
#를 사용해도 되고 --를 사용해도 되는데
--를 사용할 때 유의할 점은 -- 뒤에 띄어쓰기가 되어있어야 합니다.
그래서 %20 띄어쓰기를 넣어주어 만들면
조건을 판단하는 1=1에도 작은 따옴표가 들어가야 한다는데 이건 왜 그런지 아직은 잘 모르겠지만.. 그러네요 그냥 규칙인가.
이렇게 Gremlin을 클리어하였습니다.