摘要:使用sqlmap注入本地搭建的sqli-labs过程记录
学习SQL 注入,一直在手注,关于工具的使用的学习一直拖,根据《Web安全攻防:渗透测试实战指南》书中教学,记录一遍使用sqlmap跑本地环境下的sqli-labs的过程。
sqlmap基础
判断是否存在注入点
1.根据url是否存在注入点
payload:sqlmap.py -u <目标注入点>
当注入点参数大于等于两个时,需要加双引号
截图的时候不小心,把上面的的payload和sqlmap的logo截掉了,图片中的英语并不难理解,第一个询问我们经过测试目标注入点的后台的数据库引擎仿佛是MySQL,询问是否跳过对其他数据库管理引擎的测试;第二个问句询问在以后的测试中是否一律测试针对MySQL的等级为1的测试,选择
(yes)即可。
这张图就较为完整地展示了该后台的信息,并且我们知道,这里存在注入。
2.根据文本文件中的请求判断是否存在注入点
payload:sqlmap.py -r <TXT文件>
一般当传递参数的方式为POST时,我们抓包将请求保存为文本文件,使用上述的方法进行post类型的注入;在get方法中,也是有效的。
查询当前用户下的所有数据库
sqlmap.py -u <目标注入点> --dbs
获取数据库中的表名
sqlmap.py -u <目标注入点> -D <指定数据库名> --tables
获取表中的字段名
sqlmap.py -u <目标注入点> -D <指定数据库名> -T <指定表名> --columns
获取字段内容
sqlmap.py -u <目标注入点> -D <指定数据库名> -T <指定数据表名> -C <指定字段名> --dump
获取数据库的所有用户
sqlmap.py -u <目标注入点> --users
获取数据库用户的密码
sqlmap.py -u <目标注入点> --passwords
获取当前网站数据库的名称
sqlmap.py -u <目标注入点> --current-db
获取当前网站数据库的用户名称
sqlmap.py -u <目标注入点> --current-user
sqlmap进阶
--level 指定探测等级
sqlmap的探测共分为5(1~5)级,使用--level
参数指定探测等级,不指定则默认使用等级为1的探测等级,其中5级最高,包含的payload最多,也最耗费时间。sqlmap的payload保存在sqlmap\xml\payloads
文件夹下,可以看到分门别类的payload以xml文档形式保存。因此我们也可以添加自己的payload。
--is-dba 当前用户是否为管理权限
sqlmap.py -u <目标注入点> --is-dba
--roles 列出数据库管理员角色
用于查看数据库用户的角色,如果当前用户有权限读取包含所有用户的表,该命令会列举出每个用户的角色,也可以使用-U参数指定想看哪个用户的角色。该命令仅适用于当前数据库是Oracle时。
--referer HTTP Referer头
sqlmap可以再请求中伪造HTTP中的referer,当level参数设定为3以上时,会尝试对referer进行注入。可以使用referer命令来欺骗,如--referer http://www.baidu.com
--sql-shell 运行自定义SQL语句
该命令用于执行指定的SQL语句,如下,假设执行select * from users where id=1
sqlmap.py -u <目标注入点> --sql-shell
--os-cmd,--os-shell 运行任意操作系统命令
当数据库为MySQL、PostgreSQL或SQLserver且当前用户具有权限使用特定函数时该指令生效,但实现的原理有所不同。
数据库为MySQL和PostgreSQL时,sqlmap商户餐一个二进制库,包含用户自定义的函数sys_exec()
和sys_eval()
这两个函数可以执行系统命令。在Microsoft SQL Server中,sqlmap使用xp_cmdshell存储过程,如果被禁用(2005及以上版本默认禁用),sqlmap会重新启用它,如果不存在则会被创建。
--os-shell 参数可以模拟一个真实的Shell,当不能执行多语句时,仍可以使用INTO OUTFILE写进可写目录,创建一个Web后门。--os-shell支持ASP、ASP.NET、JSP和PHP四种语言。(要执行改参数,需要有数据库管理员权限,--is-dba为True)
--file-read 从数据库服务器中读取文件
适用于MySQL、PostgreSQL或Microsoft SQL Server且当前用户有权限执行特定的函数时。读取的文件可以是文本可以是二进制文件。
sqlmap.py -u <目标注入点> --file-read "路径" -v 1
--file-write --file-dest 上传文件到数据库服务器中
数据库:MySQL、PostgreSQL、Microsoft SQL Server
且:当前用户有权限使用特定的函数时。可以上传文本文件或二进制文件
sqlmap的自带绕过waf脚本
默认情况下,出了使用CHAR()函数防止出现单引号,没有对注入的数据进行修改,所以我们在遇到就像宽字节注入或者是需要变换大小写来绕过的waf时,sqlmap不太管用,为了解决这个问题,sqlmap自带了解决此困境的绕过脚本,使用--tamper
参数来使用这些载荷来绕过waf的检测。
sqlmap.py XXXXX --tamper "模块名"
常用的tamper脚本:
- apostrophemask.py
作用:将引号替换为UTF-8,用于过滤单引号
- base64encode.py
作用:替换为base64编码
- multiplespaces.py
作用:围绕SQL关键字添加多个空格
- space2plus.py
作用:用+替换空格,空格被过滤时使用
- nonrecursivereplacement.py
作用:作为双重查询语句,用双重语句替换预定义的SQL关键字(适用于非常弱的自定义过滤器,例如将SELECT替换为空,也就是当我们在手注需要使用双写绕过的情况下可以改用sqlmap使用此模块)
- space2randomblank.py
作用:将空格替换为其他有效字符
- unionalltounion.py
作用:将UNION ALL SELECT替换为UNION SELECT
- securesphere.py
作用:追加特制的字符串
- spae2hash.py
作用:将空格替换为#,并添加一个随机字符串和换行符
- space2mssqlblank.py (mssql)
作用:将空格替换为其他空符号
- space2mssqlhash.py
作用:将空格替换为#,并添加一个换行符
- between.py
作用:用NOT BETWEEN 0 AND替换大于号(>),用BETWEEN AND 替换等号(=)
- percentage.py
作用:ASP允许在每个字符前面添加一个%号
- sp_password.py
作用:从DBMS日志的自动模糊处理的有效载荷中追加sp_password
- charecode.py
作用:对给定的Payload全部字符使用URL编码(不处理已经编码的字符)
- randomcase.py
作用:随机大小写
- charuniocodeencode.py
作用:字符串unicode编码
- space2comment.py
作用:将空格替换为/**/
- equaltolike.py
作用:将等号替换为like
- geatest.py
作用:绕过对“>”的过滤,用GREATEST替换大于号