문제 이름 : gremlin
소스코드
1
2
3
4
5
6
7
8
9
10
11
12 |
<?php
include "./config.php";
login_chk();
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 = @mysql_fetch_array(mysql_query($query));
if($result['id']) solve("gremlin");
highlight_file(__FILE__);
?> |
cs |
문법을 보니 php 문법인걸 알수가있다.
일단문제는 $_GET방식으로 id값과 pw값을 서버로 보내게된다.
성공적으로 보내지게되면 5,6번줄을 주목해보자
preg_match() 함수를이용해 무언가를 하고있따.
preg_match() 함수는 정규식을이용해 매칭된값이 있는지 검사하는 함수이다.
참고링크 click
정규식을보면 prob , _ , . , ( , ) 등이 있는지 검사하게된다
만약 id,pw 에 저위값이 하나라도 들어가게되있으면 hehe라는 문구를 출력후 종료하게된다.
만약 매칭된것이 없으면 id,pw 값들은 각각 쿼리에 들어가게된다 .
이번엔 쿼리를 살펴보자
select id from prob_gremlin where id='{$_GET[id]}' and pw='{$_GET[pw]}'
id = admin pw = 1234 를 넣게된다면
쿼리는 이런 형태일것이다.
select id from prob_gremlin where id='admin' and pw='1234'
id 와 pw 값들은 ' ' 로 감싸잇는것을 볼수있다.
and 를 사용한것을보니 id값과 pw값이 모두 일치해야 참이된다.
9,10번행을 보자
$result = @mysql_fetch_array(mysql_query($query));
if($result['id']) solve("gremlin");
id,pw가 무엇이됫건 쿼리에서 참이되기만해도 문제는 해결될거같다
하지만 쿼리에서는 AND를 쓰고있따 and가아닌 or을 쓰거나 추가해주면 조건은 한쪽만 참이여도 문제는 해결된다
아까보니 id와pw는 ' ' 로 감싸주고있엇다.
preg_match() 함수를 사용한 5,6번 줄을보게되면 작은 따움표는 포함이되있지않았다.
작은 따움표를 써서 마음대로 열고 닫고를 할수있다는것이다.
pw값에 작은따움표를 추가해주고 뒤에 or을 넣어주자
pw=1234' or 1='1 이런식으로 값을 보내주면
쿼리는 이런형태가될것이다.
select id from prob_gremlin where id='admin' and pw='1234' or 1='1'
앞에 id and pw 값은 0이지만 뒷부분 결과는 참이기때문에 전체적으러 쿼리는 참인 쿼리가 된다.
작은따움표의 갯수가 홀수이게되면은 쿼리에 에러가나기때문에 작은따움표 갯수는 맞춰주는게좋다.
클리어되면 이런식으로 문구가 뜬다.
'wargame > los.eagle-jump.org' 카테고리의 다른 글
wolfman (0) | 2017.07.03 |
---|---|
orc (0) | 2017.06.18 |
goblin (0) | 2017.06.15 |
cobolt (0) | 2017.06.15 |
los 사이트 소개 (0) | 2017.06.15 |