Welcome to the NetSPI SQL Injection Wiki:https://sqlwiki.netspi.com/
因为需要了解下 SQL 注入,就使用 PHP 自己写了一个只有一个网页的网站测试下,现在记录下过程。。。
直接使用的 KALI系统 (KALI官网:Kali Linux | Penetration Testing and Ethical Hacking Linux Distribution)。KALI 是一个渗透测试的神器。集成了好多黑客工具,当然也就集成了许多开发所需的环境。
这里只涉及 MySQL 和 apache
启动 MySQL :
root@kali:~# systemctl start mysql //启动 mysql 服务
root@kali:~# systemctl status mysql //查看 mysql 状态
SQL 建表脚本(添加一些测试数据)
MySQL 官方网站提供了以下几个示例数据库:Sakila、Employees、world、world_x 以及 menagerie。这些数据库既可以用于日常学习和测试,也可以作为我们设计时数据库的一个参考。
- MySQL 必备的几个示例数据库:https://blog.csdn.net/horses/article/details/106795844
- 官网样例数据:https://dev.mysql.com/doc/index-other.html
启动 apache
root@kali:~# systemctl start apache2
root@kali:~# systemctl status apache2
apache 的默认主页是 /var/www/html/index.html。直接访问 http://localhost/index.html
修改 index.html 为 index.php
index.php 内容如下: (数据库连接部分参考:https://www.runoob.com/php/php-pdo.html)
<?php
ini_set("display_errors", "On");
error_reporting(E_ALL | E_STRICT);
print('Hello '); // 输出 "Hello " 并且没有换行符
echo "World\n"; // 输出 "World" 并且换行
echo "<br />";
echo "<hr />";
echo '<p align="center">DataBase connect test</p>';
$dbms='mysql'; //数据库类型
$host='127.0.0.1'; //数据库主机名
$dbName='world'; //使用的数据库
$user='root'; //数据库连接用户名
$pass=''; //对应的密码
$dsn="$dbms:host=$host;dbname=$dbName";
try {
// 连接到数据库
$dbh = new PDO($dsn, $user, $pass);
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$dbh->exec('set names utf8');
echo "连接成功<br/>";
// sql 语句
$strsql="SELECT id,name,countrycode FROM `City` LIMIT 5";
//你还可以进行一次搜索操作
foreach ($dbh->query($strsql) as $row) {
//print_r($row); //你可以用 echo($GLOBAL); 来看到这些值
echo "id: {$row['id']} ";
echo "name: {$row['name']} ";
echo "countrycode: {$row['countrycode']} ";
echo "<br />";
}
$dbh = null;
} catch (PDOException $e) {
die ("Error!: " . $e->getMessage() . "<br/>");
}
?>
<br />
<hr />
<p align="center">input test</p>
<form>
<div>
Input Query ID:
<input type="text" name="search" style="width:60%;" >
<input type="submit" name="submit" value="Search" >
<br /><br />
SQL Query String :
<?php
if(isset($_GET['submit']))
{
$val = $_GET['search'];
$str_sql = "SELECT id,name,countrycode FROM City where id = $val";
echo "<b>$str_sql</b>";
echo "<br />";
$dbms='mysql'; //数据库类型
$host='127.0.0.1'; //数据库主机名
$dbName='world'; //使用的数据库
$user='root'; //数据库连接用户名
$pass=''; //对应的密码
$dsn="$dbms:host=$host;dbname=$dbName";
try {
// 连接到数据库
$dbh = new PDO($dsn, $user, $pass);
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$dbh->exec('set names utf8');
echo "<br /><br />";
// 遍历
foreach ($dbh->query($str_sql) as $row)
{
//print_r($row); //你可以用 echo($GLOBAL); 来看到这些值
echo '<table border="1">';
echo "<tr>";
echo "<td>";
echo "id: {$row['id']} ";
echo "</td>";
echo "<td>";
echo "name: {$row['name']} ";
echo "</td>";
echo "<td>";
echo "countrycode: {$row['countrycode']} ";
echo "</td>";
echo "</tr>";
echo "</table>";
}
$dbh = null;
}
catch (PDOException $e)
{
die ("Error!: " . $e->getMessage() . "<br/>");
}
}
else
{
echo "please input the number ID !!!";
}
?>
</div>
</form>
浏览器直接访问:http://localhost/index.php
mysql 数据库中结果
到此,我的第一个 php 程序结束。。。。。
一个 简单的 SQL 注入验证
输入要查询的 ID (数字),点击 search 按钮,注意 浏览器 url 变化,传递一个参数 search=1 。然后下面显示查询结果。
现在修改 URL 传递的参数。
修改后的 URL 为 :http://localhost/index.php?search=1 or '1'='1'&submit=Search
再来一个复杂点的 SQL 注入验证:
URL:http://localhost/index.php?search=1 union select code,name,region from Country LIMIT 5;&submit=Search
一个读取文件的 SQL 注入
至此,一个简单的 SQL 注入验证完成。SQL 注入不止这些东西,以后慢慢学习研究。。。
SQL注入攻击与防御 第二版:http://download.csdn.net/detail/hx0_0_8/9284595