SQL 注入
用户输入的数据被当作 sql 代码执行(用户输入的叫数据,可以输入非预期的)
用户可以输入任何字符;程序本身要执行的代码,拼接了用户的输入,然后执行了
闭合:传入引号,让传入引号和原本引号配对,注释掉后面的引号(引号内的是数据,不是代码)
‘ " ") ')
select * from table where id='1' and 1=1 -- ww'
这句,紧跟 1 后面的引号和原本引号配对,后面的 and 1=1 是代码,-- 是注释,后面那个原本的引号被注释掉了,所以就会执行 select 语句和 and 1=1 代码
检测是否有 sql 注入:
and 1=1 页面返回正确
and 1=2 页面返回错误
上述两条满足,可能存在 sql 注入
用 and ,本来的一个条件变成两个条件
id =2-1 若返回了 id=1 的值,一定存在 sql 注入
因为 2-1 被运算了,即被当作代码执行了
get 传参会把+理解为空格(url 编码)
通过 sql 注入获得数据库信息
union 联合查询 一起执行多条 sql 语句
语句 A union 语句 B
要求:两条语句得出结果的字段数相等
select database() //查询库名
字段相等------B 语句输出的字段可以控制
select 1,2,3;
这条语句实际上没有向任何表查找值,返回就是输入的一个数组,是个 1 行 n 列的表,表的属性名和值都是输入的数组
显示位:数据库中内容选择性输出,显示的(select 1,2,3,...的结果)是输出点
假设这时 3 是输出点,就可以 select 1,2,database() 输出库名
(这时如果有了库名)就要去找表名了
表名:系统自带库 or 爆破
MySQL 有系统自带库 information_schema
tables:数据库中库和表的对应
得到该数据库中的表名
库.表.字段->选中该字段
(这时拿到了表名,假设为 admain)接下来要找字段名
columns:系统自带库,里面的字段有 TABLE_SCHEMA、TABLE_NAME、COLUMN_NAME
找当前库(database()得出的当前库名)里的,admain 表里的信息
这里 1,2,column_name 是因为之前假设显示位是 3
不能用 select *,因为 union select 要字段数相同
limit 1,1
limit 2,1
...
直到没有显示,就拿到了所有字段名
这里库表字段都出了,就可以 select 出数据了
版权声明: 本文为 InfoQ 作者【w010w】的原创文章。
原文链接:【http://xie.infoq.cn/article/290e58ef481b90922933141d6】。
本文遵守【CC-BY 4.0】协议,转载请保留原文出处及本版权声明。
评论