'Wargame/LOS(level1)'에 해당되는 글 2건

  1. 2016.09.08 [LOS] level1 cobolt(주석)
  2. 2016.09.07 [LOS] level1 gremlin(simple sql injection)
2016. 9. 8. 02:09

## LOS level1 cobolt(주석)


2번째 문제를 보자. 

아래와 같은 소스코드를 볼 수 있다.

1
2
3
4
5
6
7
8
9
10
11
12
13
<?php
  include "../config.php"
  login_chk();
  dbconnect();
  if(preg_match('/prob|_|\.|\(\)/i'$_GET[id])) exit("No Hack ~_~"); 
  if(preg_match('/prob|_|\.|\(\)/i'$_GET[pw])) exit("No Hack ~_~"); 
  $query = "select id from prob_cobolt where id='{$_GET[id]}' and pw=md5('{$_GET[pw]}')"
  echo "<hr>query : <strong>{$query}</strong><hr><br>"
  $result = @mysql_fetch_array(mysql_query($query)); 
  if($result['id'== 'admin') solve("cobolt");
  elseif($result['id']) echo "<h2>Hello {$result['id']}<br>You are not admin :(</h2>"
  highlight_file(__FILE__); 
?>
cs

소스코드를 보면 위 쿼리문을 통한 결과 값의 id컬럼이 admin이어야 한다.


우선 쿼리문을 보면 우리가 입력 가능한 파라미터는 id, pw부분이다. id 부분에 1번 문제와 비슷하게 쿼리를 날리는데 id값이 admin인 것의 결과를 뽑아와야 하므로 admin'%20or%201=1--%20 쿼리를 날리면 될거라고 생각했다. 그랬더니 아래 [그림 1]과 같은 결과가 나타났다.

[그림 1] 1차 시도

1차 시도는 실패였다.

이런 결과가 나타나는 이유는 where id='admin'이라는 조건문이 있지만 뒤의 or 1=1--때문에 그냥 참인 값만 반환을 하여 id가 admin인 것의 결과를 반환하는 것이 아니라 그냥 테이블에 들어간 순서대로 뽑아냈기 때문에 rubiya가 뽑힌 것이다.

따라서 추가로 id파라미터에 id=admin'%20or%201=1%20and%20id='admin'%20--%20을 넣어주면 id가 admin인 결과를 반환한다.

최종 페이로드는 http://los.sandbox.cash/chall/cobolt_c1c72102d0334847a38123e460f27f8c.php?id=admin%27%20or%201=1%20and%20id=%27admin%27--%20 와 같고 쿼리를 날리면 아래 [그림 2]와 같이 문제가 풀리는 것을 확인 할 수 있다.

[그림 2] Cobolt Clear!


=> 정리 : 그냥 admin'%20--%20으로 주석만 써도 된다.


'Wargame > LOS(level1)' 카테고리의 다른 글

[LOS] level1 gremlin(simple sql injection)  (0) 2016.09.07
Posted by holinder4S
2016. 9. 7. 17:39

## LOS level1 gremlin(Simple SQLi)


LOS는 Lord of SQL injection의 약자로 Lord of Bufferoverflow를 모티브로 만들어진 webhacking을 다루는 워게임 사이트이다. 첫 번째 문제를 보자.


[그림 1] 문제(몹) 리스트


우선 첫 번째 문제의 이름은 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


 GET방식으로 id와 pw라는 파라미터를 받는데 주어진 쿼리문은 select id from prob_gremlin where id='{$_GET[id]}' and pw='{$_GET[pw]}'"이다. 문제를 풀기 위해서는 10번째 라인에서 $_result['id']에 값이 들어 있기만 하면 되므로 id파라미터로 '%20or%201=1--%20 정도의 쿼리문만 넣어도 위 쿼리문의 where절은 항상 참이게 되므로 테이블에 값이 있으면 가장 위의 컬럼을 반환한다.


 이렇게 변환된 쿼리문을 구성해보면 아래와 같다.


"select id from prob_gremlin where id='' or 1=1-- ' and pw=''";


결과적으로 위 페이로드대로 구성하여 request를 날리면 아래 [그림 2]와 같이 문제가 풀리게 된다.


[그림 2] Gremlin Clear!






'Wargame > LOS(level1)' 카테고리의 다른 글

[LOS] level1 cobolt(주석)  (0) 2016.09.08
Posted by holinder4S