본문 바로가기

wargame/los.eagle-jump.org

orc

336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.



문제 이름 : orc


소스코드

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

 

코드를 읽어보면 id값에에 admin이 고정적으로 들어가있다.

 

더해석해보자면 쿼리값이 참이면 Hello admin 이라는 문구를 띄우게된다.

 

필터링에도 작은따움표  필터링같은건없으니 or 1='1 해줘서 쿼리를 참만들어줘서

 

클리어 해주면되는 문제가 아닌가 생각할수도있다 하지만

 

밑에 14번째줄코드를 잘봐보자 입력받은값과 pw값을 비교하고있다 비교해서 참이면 solve함수가 작동한다.

 

그말은 admin의 비밀번호를 입력해야 문제가 클리어된다는것인거같다.

 

그런데 어캐 admin의 비밀번호값을 알아낸다는것인가?

 

그냥 무차별대입공격으로 비밀번호를 떄려맞추면되나?

 

그렇게해서 클리어는 할수있다 하지만 문제 출제자의 의도는 이것이아닌거같다.

 

나는 이문제를 처음에 한참고민했다 아무런생각이없엇기때문이다.

 

그러다 여러문서를 공부하다  blind sql injection 이라는 기법을 공부했다.

 

그럼 블라인드 sql 인젝션이 무엇인지 간단히 알아보도록하자.

 

따로 게시글을 만들어서 블라인드 인젝션에 대한 글은 쓰지않을것이다.

 

왜냐하면 나는지금 이글쓰는것도 귀찮기때문에 따로 글쓰는건 자신이없다 고로므로 여기다가 문제풀이랑

 

블라인드 인젝션 기법에대해 간략하게 적을것이다.

 

Blind sql injection

blind sql injection 과 sql injection 별다른게없다 하지만

 

sql injection 같은경우는 한번에 원하는값을 가져올수있는 방면에

 

blind sql injection 같은경우는 서버에게 요청을보냈을때 참과 거짓 으로 응답을 나타낼때 사용할수있는 방법이

 

바로 blind sql injection 이다.

 

위 코드에서 보면은

 if($result['id']) echo "<h2>Hello admin</h2>"

10번줄에 쿼리가 참이 되더라도 Hello admin 이라는 문구를 띄우게된다.

 

이걸이용해 admin의 비밀번호를 탈취할수가있다.

 

먼저 간단한 공격부터 해보자 공격하기전에 admin의 비밀번호가 몆자리인지 알면 문제를 해결할때 더욱 편리할것이다

 

이런식으로 쿼리를 줘보자 pw=' or id='admin' length(pw)>5 # 

 

length() 함수는 mysql에서 지원하는 함수중하나이다.

 

주로 원하는값의 길이를 알고싶을때 사용한다

 

만약 비밀번호가 6자리 이상이게되면 admin을 띄우게 될것이다.

 

참이뜬다.

 

아직 정확한 자리를 모르니 값을증가시켜보자

 

pw가 8보다 크냐는 조건을 줬을때는 뜨지않앗다 그말은 pw의 길이는 8자리라는것이다.

 

이를 통해 우리는 한가지를 해결했다.

 

pw의 길이는 8이다 라는것을

 

그럼이제 비밀번호를 알아볼건데

 

substr()이라는 함수를 사용하였다

 

substr()함수는 특정자리의 값을 반환해주는 함수이다

 

예를들면 substr("abc",1,1) 을 하게되면 a를 반환해주게된다.

 

이런식으로 pw의 값을 한자리 한자리 뺴줄수가있다.

 

이런식으로 몆번만 노가다해서 8자리가 완성해주면

 

문제는 해결된다.

 

blind sql injection 기법은 알아두는것이 좋을거같다.

 

'wargame > los.eagle-jump.org' 카테고리의 다른 글

darkelf  (1) 2017.07.03
wolfman  (0) 2017.07.03
goblin  (0) 2017.06.15
cobolt  (0) 2017.06.15
gremlin  (0) 2017.06.15