본문 바로가기
[웹해킹]/[Webhacking.kr]

[Webhacking.kr] 18번

by Hevton 2020. 9. 28.
반응형

문제

 

소스보기를 해보면

<?php
  include "../../config.php";
  if($_GET['view_source']) view_source();
?><html>
<head>
<title>Challenge 18</title>
<style type="text/css">
body { background:black; color:white; font-size:10pt; }
input { background:silver; }
a { color:lightgreen; }
</style>
</head>
<body>
<br><br>
<center><h1>SQL INJECTION</h1>
<form method=get action=index.php>
<table border=0 align=center cellpadding=10 cellspacing=0>
<tr><td><input type=text name=no></td><td><input type=submit></td></tr>
</table>
</form>
<a style=background:gray;color:black;width:100;font-size:9pt;><b>RESULT</b><br>
<?php
if($_GET['no']){
  $db = dbconnect();
  if(preg_match("/ |\/|\(|\)|\||&|select|from|0x/i",$_GET['no'])) exit("no hack");
  $result = mysqli_fetch_array(mysqli_query($db,"select id from chall18 where id='guest' and no=$_GET[no]")); // admin's no = 2

  if($result['id']=="guest") echo "hi guest";
  if($result['id']=="admin"){
    solve(18);
    echo "hi admin!";
  }
}
?>
</a>
<br><br><a href=?view_source=1>view-source</a>
</center>
</body>
</html>

이런 코드가 나온다. 우리가 봐야할 부분은

<?php
if($_GET['no']){
  $db = dbconnect();
  if(preg_match("/ |\/|\(|\)|\||&|select|from|0x/i",$_GET['no'])) exit("no hack");
  $result = mysqli_fetch_array(mysqli_query($db,"select id from chall18 where id='guest' and no=$_GET[no]")); // admin's no = 2

  if($result['id']=="guest") echo "hi guest";
  if($result['id']=="admin"){
    solve(18);
    echo "hi admin!";
  }
}
?>

일단 다양한 문자가 필터링되어있고, SQL문도 공개해준다. 그리고 admin의 넘버가 2인것도 알려줬다.

 

"select id from chall18 where id ='guest' and no=$_GET[no]" 라는 문을 잘 우회해서 admin 의 계정으로 로그인해주면 된다.

 

나는 $_GET[no] 부분에 "99 or id='admin'을 넣어줄 것이다. 그렇게되면

"select id from chall18 where id ='guest' and no=99 or id='admin'" 이런 식이 되는데 이렇게되면

A and B or C가 되면서, (A and B) 가 먼저 실행되고 이것과 or C의 결과가 도출된다.

즉 앞의 조건은 없애버린다음에 id가 admin인 계정으로 로그인시킨거다.

 

참고로  admin의 no를 알려줬으니 "99 or no=2" 해줘도 된다.

 

그리고 공백이 필터링되어있어서 공백은 \n 문자, 즉 %0a로 우회해줬다.

-> 99%0aor%0aid='admin' 을 주소창에 넣어주면 된다.

ps.

▶︎ SQL에서 or보다 and의 우선순위가 높아서 먼저 실행된다.

∙ where id = 'admin' and pw = 123 or 1

처리순서 -> (id = 'admin' and pw = 123) or 1

∙ where id = 'admin' or pw = 123 and 1

처리순서 ->  id = 'admin' or (pw = 123 and 1)

따라서 만약 or 연산을 먼저 해줘야한다면 괄호로 감싸줘야한다.

 

▶︎ 같은 연산자끼리는 곱하기 여러개의 순서처럼 상관없음. 편하게 앞에서부터 해나가면 됨.

반응형

'[웹해킹] > [Webhacking.kr]' 카테고리의 다른 글

[Webhacking.kr] 20번  (0) 2020.09.30
[Webhacking.kr] 19번  (0) 2020.09.28
[Webhacking.kr] 17번  (0) 2020.09.28
[Webhacking.kr] 16번  (0) 2020.09.28
[Webhacking.kr] 15번  (0) 2020.09.27