2-1 SQL注入原理
1)语言分类:解释型语言和编译型语言。解释型语言是一种在运行时由一个运行时组件解释语言代码并执行其中包含的指令的语言。而编译型语言是代码在生成时转换为机器指令,然后再运行时直接由使用该语言的计算机执行这些指令。
在解释型语言中,如果程序与用户进行交互。用户就可以构造特殊的输入来拼接到程序中执行,从而使得程序依据用户输入执行有可能存在恶意行为的代码。
例如:在与用户交互的程序中,用户的输入拼接到SQL语句中,执行了与原定计划不同的行为,从而产生了SQL注入漏洞。
2)登录案例讲解
登录SQL语句:select * from admin where username=‘用户输入的用户名‘ and password=‘用户输入的密码‘
用户输入的内容可由用户自行控制,例如输入1‘ or 1=1 --空格
SQL语句:select * from admin where ‘1‘ or 1=1 -- ‘ and password=‘用户输入的密码‘
其中or 1=1 永远为真,--注释后边内容不再执行,因此SQL语句执行会返回admin表中的所有内容。
Burpsuite万能密码测试案例演示
3)CMS SQL注入讲解
CMS逻辑:index.php首页展示内容,具有文章列表(链接具有文章id)、articles.php文章详细页,URL中的article.php?id=文章id读取id文章。
SQL注入验证:
1、单引号‘
2、and 1=1
3、and 1=2
如果页面中mysql报错,证明该页面存在SQL注入漏洞。
4)Sqlmap基本使用
sqlmap是检测和利用sql注入漏洞的一款强大工具。
2-2.MySQL注入有关知识点
1)Mysql 5.x数据结构
在MySQL 5.0以上的版本中,为了方便管理,默认定义了information_schema数据库,用来存储数据库元信息。其中具有表schemata(数据库名)、tables(表名)、columns(列名或字段名)
在schemata表中,schema_name字段用来存储数据库名。
在tables表中,table_schema和table_name分别用来存储数据库名和表名。
在columns表中,table_schema(数据库名)、table_name(表名)、column_name(字段名)
利用Navicat for MySQL查看结构
2)SQL增删改查
select 列名称 from 表名称 where 字段1=‘条件1‘ and 字段2=‘条件2‘
select * from 表名称 where 字段1=‘条件1‘ and 字段2=‘条件2‘
insert into 表名称(列1,列2...) values(值1,值2)
update 表名称 set 列名称=新值 where 列名称=某值
delete from 表名称 where 列名称=值
3)MySQL常用函数
Mysql中常用的聚合函数有以下:
user():查看当前mysql登录用户名
database():查看当前使用mysql数据库名
version():查看当前mysql版本
拓展limit关键字,limit m,n 从m行开始,m+n行结束
4)注释
注释符:在mysql中常见的注释符表达式:#或--空格或/**/
内联注释:/*! SQL语句 */ 只有mysql可以识别,常用来绕过WAF
例如: select * from articles where id=id
使用内联注释注入:select * from articles where id=-1 /*! union */ /*!select*/ 1,2,3,4
2-3SQLLab靶场搭建
1)PhpStudy环境安装
phpStudy是一个PHP调试环境的程序集成包。
该程序包集成最新的Apache+PHP+MySQL+phpMyAdmin+ZendOptimizer,一次性安装,无须配置即可使用,是非常方便、好用的PHP调试环境,该程序不仅包括PHP调试环境,还包括了开发工具、开发手册等。总之学习PHP只需一个包。
2)火狐浏览器插件安装
3)Sqlmap安装
4)Sqli-Lab安装