Sqlmap的开源项目,托管在github,最简单的安装方式便是使用git,执行如下命令:
git clone https://github.com/sqlmapproject/sqlmap.git
一、SQL注入类型
注入点类型:数字型 字符型
注入点位置:GET(url) POST(POST数据包) HEAD(cookie user-agent accept referer xff)
执行效果:显错、盲注(时间、布尔)、报错
其他注入类型:联合查询 堆叠(一条sql语句后面加上分号,再加一条语句)宽字节 DNS解析注入
二、参数
1.参数:--level 5: 探测等级
-- level 指需要执行的测试等级,一共有5个等级(1-5),可以不加level。默认是1。
http cookies在level为2时就会测试
user-Agent/Referer在level为3时就会测试。
host在当–level设置为5或更高时,Sqlmap会检测Host是否存在注入漏洞
2.参数:-u 或 –url
使用参数“-u”或“–url”指定一个URL作为目标
3.参数:-p和–skip
默认情况下Sqlmap会测试所有GET参数和POST参数,实际上还可以手动指定一个以逗号分隔的、要测试的参数列表,该列表中的参数不受level限制。这就是“-p”的作用。
举个例子,若想只测试GET参数“id”和User-Agent,则可以这么写:
-p "id,user-agent"
如果不想测试某一参数则可以使用“–skip”。如设置了level为5但不想测试User-Agent和Referer,则可以这么写:
--level=5 --skip="user-agent,referer"
4.参数:-v 输出级别
Sqlmap的输出信息按从简到繁共分为7个级别(和葫芦娃一样多),依次为0、1、2、3、4、5和6;使用参数“-v <级别>”来指定某个等级,如使用参数“-v 6”来指定输出级别为6。默认输出级别为1,各个输出级别的描述如下:
0:只显示Python的tracebacks信息、错误信息[ERROR]和关键信息[CRITICAL];
1:同时显示普通信息[INFO]和警告信息[WARNING];
2:同时显示调试信息[DEBUG];
3:同时显示注入使用的攻击荷载;
4:同时显示HTTP请求;
5:同时显示HTTP响应头;
6:同时显示HTTP响应体。
5.参数:–force-ssl
![](https://img-blog.csdnimg.cn/c8526bf3e75d49148e196be211aa87c7.png)
三、sqlmap注入显示
B:Boolean-based blind(布尔型注入)
E:Error-based(报错型注入)
U:Union query-based(可联合查询注入)
S:Stacked queries(可多语句查询注入)
T:Time-based blind(基于时间延迟注入)
Q:Inline queries(嵌套查询注入)
四、SQLMap自带绕过脚本tamper
sqlmap在默认情况下除了使用CHAR()函数防止出现单引号,没有对注入的数据进行修改。我们可以通过--tamper参数对数据作修改来绕过WAF等设备
命令方式:
sqlmap.py XXXXXX --tamper “模块名”
在日常使用中我们可以用参数--identify-waf进行检测
一些常用的tamper脚本:
apostrophemask.py 过滤单引号,把单引号换为UTF-8
base64encode.py 替换为base64编码
multiplespaces.py 围绕sql关键字添加多个空格
space2plus.py 用+来替换空格
nonrecursivereplacement.py 用双重语句替代预定义的sql关键字
不同数据库特性
注释符号
MySQL: 单行: # 多行: /**/ 、--+
SQLServer:单行: -- 多行: /**/
Oracle:单行: -- 多行: /**/
PostgreSQL:单行:-- 多行: /**/
Access:无注释符
特有数据库
MySQL: information_schema
SQLServer:sysobjects
Oracle: dual
PostgreSQL:
Access: msysobjects
ASCII转换函数
MySQL:select char(97)SQLServer:select char(97)
Oracle:select chr(97) from dual
PostgreSQL:select chr(97)
Access:select chr(97)
查询用户和权限方法
MySQL
查询当前用户
select user();
select substring_index(user(), '@', 1) ;
查询当前用户的权限
select * from mysql.user where user = substring_index(user(), '@', 1) ;
SQLServer:
判断是否是SA权限
select is_srvrolemember('sysadmin')
判断是否是db_owner权限
select is_member('db_owner')
判断是否是public权限
select is_srvrolemember('public')
Oracle:
查看当前用户
select * from user_users;
查看当前用户拥有的角色
select * from session_roles;
查看当前用户拥有的权限
select * from session_privs;
PostgreSQL:
select user #查看用户
select current_user #查看当前用户
Access:
Access数据库是文件类型数据库,没有用户和权限的概念
五、防范方式
1、 输入验证,过滤字符/字符串
原理:过滤 ' " % @ 以及数据库相关字符串如 select、database()等
2、 参数化查询
原理:在设计与数据库链接并访问数据时,在需要填入数值或数据的地方,使用参数来给值,这个方法已被视为最有效可预防的攻击手法的防御方式。
在使用参数化查询的情况下,数据库不会将参数的内容视为SQL指令的一部分来处理,而是在数据库完成SQL指令的编译后,才套用参数运行,因此就算参数中含有具破坏性的指令,也不会被数据库所运行。
3、 权限分离
六、绕过
1.逗号被过滤:使用from 1 for 3; 从1开始 读取3个字符
2.过滤空格:使用两个空格代替一个空格,用Tab代替空格,php:%a0=空格,mysql:/**/=空格
3.ascii被过滤:使用 hex() bin() 进行转换即可
4.group_concat()被过滤:可用concat_ws()
5.substr(),substring(),mid()可以相互取代, 取子串的函数还有left(),right()