不能sql注入我的代码

时间:2017-04-23 20:12:15

标签: php mysql sql-injection

我正在编写一个演示网页来展示类项目的SQL注入技术。我几乎可以肯定它是以正确的方式编码的,但是我无法让实际的注射工作。该代码应该从HTML文本框中获取输入并检查名为" stock"的表。并输出结果,如果有的话。以下是代码的相关部分:

<?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>';
}
 ?>

我可以成功搜索&#39; stock&#39;表格,我可以通过搜索%或在浏览器中输入http://localhost/index.php?search=hammer%20OR%201=1来输出表格中的所有内容。但到目前为止我能做的就是这些。

我可以在此代码中更改任何内容以使SQLi更容易吗?或者我的SQLi技术出了什么问题?只要我能展示多种技术,从文本框或地址栏开始注入的位置并不重要。我可以从地址栏转储表,但我想显示sleep()函数被使用以及导航到其他表,甚至是我服务器中的其他数据库的转储信息。但我无法弄清楚如何做到这一点。

最后,有没有人知道SQLI的任何儿童脚本或程序我可以针对我的localhost网站运行?我仍然需要演示手动技术,但我认为向班级展示适当工具攻击易受攻击网站的速度可能会很快。显然我只会在我的项目中使用它,因为我不想去监狱。

编辑:帖子How can I prevent SQL injection in PHP?已被关联,它似乎非常详细但不完全是我正在寻找的东西,因为我需要知道如何打破网站,而不是解决它。这个问题确实与我的SQLi技术有关。

2 个答案:

答案 0 :(得分: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
    

    如果ID为1的列的值以“a”开头,则会休眠两秒钟,否则会立即返回。您可以使用一系列这些查询来慢慢猜测行的内容。 (例如:它是以“a”开头吗?NO。是否以“b”开头?是。是否以“ba”开头?... 等。

    此技术称为盲SQL注入

答案 1 :(得分:0)

在搜索栏中试试这个:';这里有一些疑问; #