2017-11-12 12 views
-2

나는 보안 도구를 감사하는 과정에 있습니다. 무작위로 생성 된 가짜 데이터를 사용하여 내 "안전하지 않은 영역"을 만드는 것이 좋은 방법이라고 판단하여 SQL 인젝션에 취약합니다. 그러나 실제로 주입 할 수는 없습니다. 나는 그것이 나쁜 쿼리를 줄 때 "발견 된 계정은있다"는 인쇄하지 않지만 오류 메시지는 인쇄하지 않는다는 것을 알 수 있습니다.의도적으로 스크립트 SQL 삽입 가능

내가 잘못된 것을하고 있는지 누군가가 알 수 있습니까?

"SELECT * from badSQL.Two WHERE email = '1' OR '1'='1'" 

이메일 주소가 항상 잘못 될 것 중요하지 않습니다 그것이 사용합니다 같이 :에 그것을 평가하는 것처럼

<?php 

$resultHTML; 
if (isset($_POST['email']) || isset($_GET['email'])) { 

    $conn = mysqli_connect($servername,$username,$password); 

    if ($conn) { 

     //this part is insecure (intentionally for testing) 
     if (isset($_GET['email'])) { 
      $query = "SELECT * from badSQL.Two WHERE email = '$_GET[email]'"; 
     } else { 
      $query = "SELECT * from badSQL.Two WHERE email = '$_POST[email]'"; 
     } 

     //echo $query; 
     $result = $conn->query($query); 

     if ($result) { 
      $resultHTML = "Here are the accounts found: "; 

      $hasAccount = false; 
      while ($row = mysqli_fetch_assoc($result)) { 
       $hasAccount = true; 
       $resultHTML .= "<br>".print_r($row); 
      } 

      if ($hasAccount === false) { 
       $resultHTML = "No accounts found."; 
      } 
     } 

    } else { 
     $resultHTML = "DB Connection could not be established: ".$conn->connect_error; 
    } 

} 

?> 

<html> 
<head> 

    <title>Two BadSQL Test</title> 

</head> 
<body> 

    <h1>Two Website!</h1> 
    <br> 
    <h3>Forgot Password</h3> 
    <p>Enter your email below, and click submit:</p> 
    <form id="forgotForm" method="get"> 
     <input type="text" name="email" /> 
     <input type="submit" value="submit" /> 
    </form> 

    <br> 
    <div id="results"><?php echo $resultHTML; ?></div> 
</body> 
</html> 
+0

사용중인 주사 벡터는 무엇입니까? 그리고 그 테이블에서 추출 할 데이터는 무엇입니까? – h3ct0r

+0

무슨 오류 메시지가 떠오 릅니까? '여기에 계좌가 발견되었습니다 '가 인쇄되지 않고 연결 오류가없는 경우 인쇄 할 오류 메시지가 없습니다. – Zeke

+0

'1'또는 '1'= '1'을 시도하십시오. 그것은 위의 스크립트에 유효한 SQLi 여야합니다. 캡슐화 된 위조 된 데이터에 대한 취약점을 만들면 합법적 인 공격에 대한 매개 변수가 될 수 있기 때문에 왜 고의적으로 * 자신의 사이트를 더 취약하게 만들려고하는지 확신 할 수 없지만. –

답변

1

1' OR '1'='1, 당신의 위의 스크립트 유효 SQLI을해야한다 OR 절. 1일 때 항상이 이라면 전체 표현식이 항상 참입니다. 따라서 위의 스크립트는 모든 전자 메일 검사를 건너 뛰고 '1' = '1' 조건을 만족하는 첫 번째 사용자를 찾으려고 시도합니다. 이는 테이블의 첫 번째 사용자와 관련이 있습니다 (ID가 1이되어 관리자가 더 많은 착취를 유도합니다).

이 문제를 방지하려면 stored procedures or parameterised queries을 사용하고 각 테이블의 첫 번째 사용자에게 가능한 한 적은 권한을 부여하는 것이 좋습니다. OWASP SQLi Prevention Cheat Sheet도 확인하시기 바랍니다. 내가 역할을 할 수 캡슐화 된 가짜 데이터에 대한 취약점을 만들기로, 의도적으로 자신의 사이트가 더 취약에 대해 권하고 싶습니다 또한

$stmt = $dbConnection->prepare('SELECT * FROM badSQL.TwoWHERE name = ?'); 
$stmt->bind_param('s', $name); 

$stmt->execute(); 

$result = $stmt->get_result(); 
while ($row = $result->fetch_assoc()) { 
    // Do something with $row 
} 

:

등가 비 취약 PHP는 같은 쿼리가 보일 것 매개 변수화 합법적 인 공격을위한 벡터.

희망이 있습니다.