1、 SQL注入介绍
SQL注入介绍:SQL注入介绍
注入产生原因:web应用程序对用户输入数据的合法性没有判断或过滤不严,导致恶意payload直接带入SQL语句执行,从而执行payload中非法操作!
2、 联合查询注入PHP代码
新建PHP文件,将下面代码复制到PHP文件中,在浏览器中访问即可
<?php
$host = '127.0.0.1';
$dbuser = 'root';
$dbpass = 'root';
$dbname = 'test';
$con = new mysqli($host, $dbuser, $dbpass, $dbname);
if ($con->connect_error) {
die("Connect Failed: " . $con->connect_error);
}
if (isset($_GET['id']) && !empty($_GET['id'])) {
$id = $_GET['id'];
} else {
die("Missing id parameter!");
}
$sql = "select id,title,content from t_feedback where id=$id";
$result = $con->query($sql) or die();
if ($result->num_rows > 0) {
while ($row = $result->fetch_assoc()) {
echo "id: " . $row["id"] . "<br>";
echo "title: " . $row["title"] . "<br>";
echo "content: " . $row["content"] . "<br>";
}
} else {
echo "No feedback found!" . "<br>";
}
echo "Your SQL syntax: " . $sql;
$con->close();
3、 联合查询注入测试
尝试输入特殊字符,SQL返回错误,证明可能存在SQL注入漏洞,联合查询注入前提:页面回显查询内容
通过order by确定表字段数,order by 3页面返回正确,order by 3页面返回错误,确定数据表有3列字段
通过联合查询语句,拼接查询用户、数据库名及数据库版本信息,关键payload:
group_concat(user(),0x7e,database(),0x7e,version())
查询数据库中所有数据表,0x74657374为数据库名二进制编码,关键payload:
group_concat(table_name) from information_schema.tables where table_schema=
查询数据表所有列名,关键payload:
group_concat(column_name) from information_schema.columns where table_name=
查询用户数据表所有用户信息,关键payload:
group_concat(name,0x7e,pass,0x7e,email) from t_user
4、 代码漏洞修复
由于此处传入 id 值为 int 型,此处可直接使用 intval() 函数将接收的参数值强制转换为 int 型,防止注入。此脚本中,$id = $_GET['id'];
改为$id = intval($_GET['id']);
即可。
修改后PHP代码如下:
<?php
$host = '127.0.0.1';
$dbuser = 'root';
$dbpass = 'root';
$dbname = 'test';
$con = new mysqli($host, $dbuser, $dbpass, $dbname);
if ($con->connect_error) {
die("Connect Failed: " . $con->connect_error);
}
if (isset($_GET['id']) && !empty($_GET['id'])) {
$id = intval($_GET['id']);
} else {
die("Missing id parameter!");
}
$sql = "select id,title,content from t_feedback where id=$id";
$result = $con->query($sql) or die();
if ($result->num_rows > 0) {
while ($row = $result->fetch_assoc()) {
echo "id: " . $row["id"] . "<br>";
echo "title: " . $row["title"] . "<br>";
echo "content: " . $row["content"] . "<br>";
}
} else {
echo "No feedback found!" . "<br>";
}
echo "Your SQL syntax: " . $sql;
$con->close();