김승현
[Lord Of SQLInjection] skeleton 10번 문제 write up 본문
문제는 이렇게 생겼습니다.
and 1=0은 신경 쓸 필요 없는 게 id나 pw의 값에 쿼리문을 이용해서 입력하고 난 후 마지막에 %23을 입력해 주기만 하면 1=0과 같은 뒷 내용이 주석처리가 되기 때문에 신경 쓸 필요 없습니다.
코드를 한 줄 한 줄 살펴봅시다.
include "./config.php";
login_chk();
$db = dbconnect();
if(preg_match('/prob|_|\.|\(\)/i', $_GET[pw])) exit("No Hack ~_~");
첫 번째 줄은 ./config.php를 포함한다는 내용입니다.
두 번째 줄은 로그인을 했는지 체크하는 내용입니다.
세 번째 줄은 db를 연결합니다.
네 번째 줄은 필터링 관련 내용입니다. (preg_match란 정규 표현식에 해당 내용이 발견되면 검색을 중단하는 함수입니다.)
필터링 내용 1. prob 2. _ 3. . 4. ( 5. ) 위의 내용을 대소문자 구분 없이 필터링 하고 위의 내용이 포함되면 No Hack ~_~내용이 출력됩니다. |
$query = "select id from prob_skeleton where id='guest' and pw='{$_GET[pw]}' and 1=0";
echo "<hr>query : <strong>{$query}</strong><hr><br>";
$result = @mysqli_fetch_array(mysqli_query($db,$query));
if($result['id'] == 'admin') solve("skeleton");
highlight_file(__FILE__);
$query에 select id from prob_skeleton where id='guest' and pw='{$_GET[pw]}' and 1=0 쿼리문을 저장합니다.
query : {$query}의 내용을 강조해서 출력합니다.
$result에 db를 연결하고 query 내용을 저장합니다.
만약 $result의 id가 admin이면 skeleton이 solve됩니다.
위의 경우 id가 이미 guest로 정해져있고 이를 pw와 and를 하고 있습니다. 이렇게 된 경우 and가 or보다 연산이
먼저 되기 때문에 pw에 아무 내용 입력 후 or id='admin'을 저장하고 마지막에 #을 달아 마지막 내용을 주석으로
바꾼다면 문제가 해결됩니다.
<작성한 내용>
?pw=' or id = 'admin' %23
%23은 뒷 내용을 주석으로 바꾸는 #을 의미합니다.
'Web > Lord Of Sql' 카테고리의 다른 글
[Lord Of SQLInjection] darkknight 12번 문제 write up (0) | 2023.03.22 |
---|---|
[Lord Of SQLInjection] golem 11번 문제 write up (0) | 2023.03.22 |
[Lord Of SQLInjection] vampire 9번 문제 write up (0) | 2023.03.18 |
[Lord Of SQLInjection] troll 8번 문제 write up (0) | 2023.03.14 |
[Lord Of SQLInjection] orge 7번 문제 write up (0) | 2023.03.14 |