SQL Injection Source
vulnerabilities/sqli/source/low.php
<?phpif(isset($_REQUEST['Submit'])){// Get input$id=$_REQUEST['id'];switch($_DVWA['SQLI_DB']){caseMYSQL:// Check database$query="SELECT first_name, last_name FROM users WHERE user_id = '$id';";$result=mysqli_query($GLOBALS["___mysqli_ston"],$query)ordie('<pre>'.((is_object($GLOBALS["___mysqli_ston"]))?mysqli_error($GLOBALS["___mysqli_ston"]):(($___mysqli_res=mysqli_connect_error())?$___mysqli_res:false)).'</pre>');// Get resultswhile($row=mysqli_fetch_assoc($result)){// Get values$first=$row["first_name"];$last=$row["last_name"];// Feedback for end userecho"<pre>ID: {$id}<br />First name: {$first}<br />Surname: {$last}</pre>";}mysqli_close($GLOBALS["___mysqli_ston"]);break;caseSQLITE:global$sqlite_db_connection;#$sqlite_db_connection = new SQLite3($_DVWA['SQLITE_DB']);#$sqlite_db_connection->enableExceptions(true);$query="SELECT first_name, last_name FROM users WHERE user_id = '$id';";#print $query;try{$results=$sqlite_db_connection->query($query);}catch(Exception$e){echo'Caught exception: '.$e->getMessage();exit();}if($results){while($row=$results->fetchArray()){// Get values$first=$row["first_name"];$last=$row["last_name"];// Feedback for end userecho"<pre>ID: {$id}<br />First name: {$first}<br />Surname: {$last}</pre>";}}else{echo"Error in fetch ".$sqlite_db->lastErrorMsg();}break;}}?>
內容非常多,但是只需要關注SQL語句select
$query="SELECT first_name, last_name FROM users WHERE user_id = '$id';";
關注: SELECT first_name, last_name FROM users WHERE user_id = ‘$id’;
$id就是用戶輸入的 內容。
判斷有沒有SQL注入漏洞:
用戶輸入的數據為1’ and 1=1 # 這時候SQL語句發生了變化,在原有查詢完成的 基礎上會判斷1 = 1(這顯然是正確的),如果判斷正確則才會有輸出 #作用是注釋(移除)后續SQL語句,去掉后面可能會造成影響的 SQL語句
用戶輸入的數據為1’ and 1=2 # 這時候SQL語句在原有查詢完成后會有判斷 1=2(這明顯是錯誤的),如果判斷正確才會有輸出