딱봐도 rubiya님이 만든(맞겠죠?) sqli연습 코너입니다.
http://rubiya.kr/sqli/prob1.php
워게임 목적보다는 쿼리문이 어떻게 완성되는지 출력함으로써 시작하시는 분들이 원리파악을 더 쉽게
할수 있겠네요. 진짜 대회문제를 가져온 webhacking.kr보다 공부에는 더 도움이 될 거 같습니다....
<?php
include "./dbconn.php";
include "./solve.php";
if(preg_match('/prob|_|\.|\(\)/i', $_GET[id])) exit("No Hack ~_~"); #필터링 함수인 preg_match를 썼지만 굳이 select,substr등의 키워드를 필터링하기보다 내부 db나 information_schema등의 db자료를 못 쓰게하기위한 기본적인 필터링으로 보입니다..
if(preg_match('/prob|_|\.|\(\)/i', $_GET[pw])) exit("No Hack ~_~");
$query = "select id from prob1 where id='{$_GET[id]}' and pw='{$_GET[pw]}'";
echo "<hr>query : <strong>{$query}</strong><hr><br>";
$result = @mysql_fetch_array(mysql_query($query));
if($result['id']) solve();
highlight_file(__FILE__);
?>
GET방식으로 id와 pw를 받아서 필터링을 한다음 쿼리를 완성시켜 출력하고, 쿼리문을 db
에서 돌렸을때 결과가 존재하면 통과네요.
http://rubiya.kr/sqli/prob1.php?id=syn3ck&pw=syn3ck 처럼 GET방식으로 id,pw를 입력했을 경우
쿼리문이 query : select id from prob1 where id='syn3ck' and pw='syn3ck'
로 완성되는걸 볼 수 있습니다.
쿼리문에서 어떤 결과라도 나오면 성공인데, 쿼리문을 살펴보면 id와 pw가 모두 일치해야만
어떤 결과값이 나올수 있음을 예상할수 있습니다. 그런데 당연히 우리는 비밀번호를 모르니,
id만 일치하게끔 쿼리문을 만들어주고, pw는 주석문으로 막아버리면 될 것 같습니다.
대부분의 인젝션에 존재하는 계정인 guest로 테스트를 해보자면..
id = guest'#, pw=1234 등으로 하면 아래처럼 쿼리문이 완성되어 guest계정이 있으면 제대로
통과가 될 것으로 보입니다..
GET방식으로 전달할 시에는
?id=guest'#&pw=guest 단순 이런식으로 URL을 전달하면 #이 URL에서 유효한 문자이기에 쿼리문
으로 전달이 되지 않으므로 #을 인코딩한 %23으로 전달을 하면
http://rubiya.kr/sqli/prob1.php?id=guest%27%23&pw=guest
성공했다고 나옵니다. MYSQL의 다른 주석인 -- ,(--뒤에 한칸 띔)이나 ;%00의 널값을 전달해도
제대로 인식하네요.
'webhacking > sql, sql injection' 카테고리의 다른 글
rubiya.kr 3번 (0) | 2014.08.28 |
---|---|
rubiya.kr 2번 (0) | 2014.08.28 |
시간 기반 sql 인젝션. (0) | 2014.08.22 |
효율적인 블라인드 인젝션 (0) | 2014.08.20 |
숫자 뽑아오기. (0) | 2014.08.19 |