联合查询SQL注入

联合查询SQL注入

      • 1、 SQL注入介绍
      • 2、 联合查询注入PHP代码
      • 3、 联合查询注入测试
      • 4、 代码漏洞修复

1、 SQL注入介绍

  SQL注入介绍:SQL注入介绍
  注入产生原因:web应用程序对用户输入数据的合法性没有判断或过滤不严,导致恶意payload直接带入SQL语句执行,从而执行payload中非法操作!

2、 联合查询注入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"] . "
"
; echo "title: " . $row["title"] . "
"
; echo "content: " . $row["content"] . "
"
; } } else { echo "No feedback found!" . "
"
; } echo "Your SQL syntax: " . $sql; $con->close();

3、 联合查询注入测试

  尝试输入特殊字符,SQL返回错误,证明可能存在SQL注入漏洞,联合查询注入前提:页面回显查询内容
联合查询SQL注入_第1张图片
  通过order by确定表字段数,order by 3页面返回正确,order by 3页面返回错误,确定数据表有3列字段
联合查询SQL注入_第2张图片
联合查询SQL注入_第3张图片
  通过联合查询语句,拼接查询用户、数据库名及数据库版本信息,关键payload:
group_concat(user(),0x7e,database(),0x7e,version())
联合查询SQL注入_第4张图片
  查询数据库中所有数据表,0x74657374为数据库名二进制编码,关键payload:
group_concat(table_name) from information_schema.tables where table_schema=
联合查询SQL注入_第5张图片
  查询数据表所有列名,关键payload:
group_concat(column_name) from information_schema.columns where table_name=
联合查询SQL注入_第6张图片
  查询用户数据表所有用户信息,关键payload:
group_concat(name,0x7e,pass,0x7e,email) from t_user
联合查询SQL注入_第7张图片

4、 代码漏洞修复

  由于此处传入 id 值为 int 型,此处可直接使用 intval() 函数将接收的参数值强制转换为 int 型,防止注入。此脚本中,$id = $_GET['id'];改为$id = intval($_GET['id']);即可。

  修改后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"] . "
"
; echo "title: " . $row["title"] . "
"
; echo "content: " . $row["content"] . "
"
; } } else { echo "No feedback found!" . "
"
; } echo "Your SQL syntax: " . $sql; $con->close();
——舍心K

你可能感兴趣的:(SQL注入)