一,sql注入的本质
SQL注入能使攻击者绕过认证机制,完全控制远程服务器上的数据库。 SQL是结构化查询语言的简称,它是访问数据库的事实标准。目前,大多数Web应用都使用SQL数据库来存放应用程序的数据。几乎所有的Web应用在后台 都使用某种SQL数据库。跟大多数语言一样,SQL语法允许数据库命令和用户数据混杂在一起的。如果开发人员不细心的话,用户数据就有可能被解释成命令, 这样的话,远程用户就不仅能向Web应用输入数据,而且还可以在数据库上执行任意命令了。
注入攻击的本质是:把用户输入的数据当作代码执行。
注入的两个关键条件:
1,用户能控制输入。
2,原本程序要执行的代码,拼接了用户输入的数据。
sql注入就是在自带的系统数据库中查询库,表,字段,内容的过程
mysql内置自带库版本>=5
mysql库 保存账户信息,权限信息,存储过程,event,时区等信息
sys库包含了一系列存储过程,自定义函数以及视图来帮助我们快速了解系统的元数据信息
performance_schema库用于收集数据库服务器的性能参数
information_schema库存储了关于mysql服务器维护的所有其他数据库的信息,如数据库,表,表的数据类型与访问权限等。
查询数据库名称语句
select schema_name from information_schema.schemata
查表
select table_name from information_schema.tables where table_name=库名
查列
select column_name from information_schema.columns where table_name=表名
查数据
select 列名 from 库名.表名
二,sql注入类型概括
按照注入点类型来分类
(1)数字型注入点
在 Web 端大概是 http://xxx.com/news.php?id=1 这种形式,其注入点 id 类型为数字,所以叫数字型注入点。这一类的 SQL 语句原型大概为 select * from 表名 where id=1。组合出来的sql注入语句为:select * from news where id=1 and 1=1
(2)字符型注入点
在 Web 端大概是 http://xxx.com/news.php?name=admin 这种形式,其注入点 name 类型为字符类型,所以叫字符型注入点。这一类的 SQL 语句原型大概为 select * from 表名 where name=‘admin’。注意多了引号。组合出来的sql注入语句为:select * from news where chr=‘admin’ and 1=1 ’ ’
闭合单引号chr=‘admin’ union select 1,2,3,4 and ‘1’='1 ====> chr=‘admin’(闭合前面单引号) union select 1,2,3,4 and ‘1’=‘1’
(3)搜索型注入点
这是一类特殊的注入类型。这类注入主要是指在进行数据搜索时没过滤搜索参数,一般在链接地址中有“keyword=关键字”,有的不显示在的链接地址里面,而是直接通过搜索框表单提交。此类注入点提交的 SQL 语句,其原形大致为:select * from 表名 where 字段 like ‘%关键字%’。
组合出来的sql注入语句为:select * from news where search like ‘%测试 %’ and ‘%1%’=’%1%’
测试%’ union select 1,2,3,4 and ‘%’=’
三,sql注入基本流程
1,判断是否存在注入点
and 1=1 页面返回正常
and 1=2 页面返回不正常
URL后加单引号’ “ --+页面返回不正常
or sleep(5)页面5秒钟后正常显示
2,猜解字段数
利用order by 排序
order by 1 以第一个字段排序
select * from users order by 1;
第一个字段为id order by 1 就以第一个id字段来排序id从小到大排序
order by 2 以第二个字段排序
第二个字段为username字段内容为字符串
就以字符串开头的26字母排序
当我们输入order by 4时
发现没有第四个字段那么数据表内就只有三个字段
3,联合查询寻找输出点
union select 1,2,3,4#
tips:union select 联合查询前面语句要为假
找到网站的输出点
在我们语句2的位置输入要查询数据的语句
union select 1,database(),3,4#
数据库名就显示出来了
4,mysql的函数及用法
sql注入测试中常用函数
group_concat()返回属于一组的列值连接组合而成的结果
ascii() 返回字符串的ASCII值
database() 返回当前数据库名
user() 或者 system_user()返回当前数据库登陆用户名
version()返回msyql数据库版本
sleep(n) 让数据库运行n秒后返回结果
@@dataidir 返回数据库安装绝对路径
@@basedir返回数据库数据存储绝对路径
来源:CSDN
作者:Stephen Wolf
链接:https://blog.csdn.net/qq_45625605/article/details/103787020