[LOS] Level2: cobolt

두비니

·

2019. 12. 31. 04:35

 

 

Lord OSQLInjection: lv.2 cobolt

 

 

 

 

cobolt입니다.

 

<?php
  include "./config.php"; 
  login_chk();
  $db = 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 = @mysqli_fetch_array(mysqli_query($db,$query)); 
  if($result['id'] == 'admin') solve("cobolt");
  elseif($result['id']) echo "<h2>Hello {$result['id']}<br>You are not admin :(</h2>"; 
  highlight_file(__FILE__); 
?>

 

id와 pw에 prob, _ ,  . , ( , ) 이 포함되면 No Hack ~_~이 출력되며,

이 문제를 해결하기 위한 조건은 id가 admin이여야 합니다.

 

gremlin문제와 같은 방법으로, 싱글쿼리로 변수를 임의로 닫아준 후 값들을 넣어주면 되겠죠.

다 쓰고 %23으로 뒤는 모두 주석처리하는것도 잊지 맙시다.

 

 

두가지 정도 풀이가 있을 것 같네요.

 

 

 

 

1. id SQLInjection

 

문제가 검사하는게 오직 id가 admin인지만 검사하기때문에 pw부분은 필요없다고 생각해도 상관없다!

따라서 그냥 id에 admin'%23을 넣으면 풀린다~

 

 

2. pw SQLInjection

 

 

 

일단 id는 admin으로 맞춰주고, pw에 ') = 0%23을 넣어주면 query가 pw=md5('') = 0 이 되는데, (이 뒤는 주석처리)

md5 function에 null값을 넣어주었으므로 당연히 md5('')의 결과값은 0이다.

따라서 pw = 0=0 이 되므로 그냥 참인 구문이 되어버린다.

 

참고로 구글에 md5함수 돌려서 그에 맞는 값을 넣어도됨!

ex. pw=1') = c4ca4238a0b923820dcc509a6f75849b%23 도 된다는소리ㅇㅇ

 

 

 

위에 방법이랑 같은 원리입니다! 다들 id를 이용해 풀었던데 pw를 이용해서 푸는게 문제의도에 더 맞다고 생각합니다. 

'War Games > Lord of SQLInjection' 카테고리의 다른 글

[LOS] Level6: orge  (0) 2020.01.04
[LOS] Level5: wolfman  (0) 2020.01.03
[LOS] Level4: orc  (0) 2020.01.01
[LOS] Level3: goblin  (0) 2019.12.31
[LOS] Level1: gremlin  (0) 2019.12.30