sqlmap各种注入详细教程

一:sqlmap简介
 SQLMap是一个开放源码的测试工具,它可以自动探测和利用SQL注入漏洞来接管数据库服务器。它配备了一个强大的探测引擎,为最终测试人员提供很多猥琐的功能,可以,可以访问底层的文件系统,还可以通过带外连接执行操作系统上的命令。   Sqlmap功能  sqlmap是一个自动化的SQL注入工具,其主要功能是扫描,发现并利用给定的URL的SQL注入漏洞。sqlmap的功能强大到让你惊叹,常规注入工具不能绕过的话,终极使用sqlmap会有意想不到的效果。 1、判断可注入的参数 2、判断可以用那种SQL注入技术来注入 3、识别出哪种数据库 4、根据用户选择,读取哪些数据 5、可执行情况 6、当前数据库用户名称和拥有的权限 7、发现WEB虚拟目录 8、上传getshell
9、绕过防火墙
 
SQLMap命令选项
归类为目标(Target)选项、请求(Request)选项、优化、注入、检测、技巧(Techniques)、指纹、枚举等。
如果你想观察sqlmap对一个点是进行了怎样的尝试判断以及读取数据的,可以使用-v参数。
共有七个等级,默认为1:
0、只显示python错误以及严重的信息。
1、同时显示基本信息和警告信息。(默认)
2、同时显示debug信息。
3、同时显示注入的payload。
4、同时显示HTTP请求。
5、同时显示HTTP响应头。
6、同时显示HTTP响应页面。
如果你想看到sqlmap发送的测试payload最好的等级就是3。
 

 sqlmap支持的注入模式
1、基于布尔的盲注,即可以根据返回页面判断条件真假的注入。
2、基于时间的盲注,即不能根据页面返回内容判断任何信息,用条件语句查看时间延迟语句是否执行(即页面返回时间是否增加)来判断。
3、基于报错注入,即页面会返回错误信息,或者把注入的语句的结果直接返回在页面中。
4、联合查询注入,可以使用union的情况下的注入。(适合用于通过循环直接输出联合查询结果,否则只会显示第一项结果)
5、堆查询注入,可以同时执行多条语句的执行时的注入。
 
 
 sqlmap的特性
(1.)sqlmap支持的数据库有:
MySQL,Oracle,PostgreSQL,Microsoft SQL Server,MicrosoftAccess, IBM DB2,SQLite,Firebird,Sybase和SAP MaxDB
 
(2.)可以提供一个简单的URL,Burp或WebScarab请求日志文件,文本文档中的完整http请求或者Google的搜索,匹配出结果页面,也可以自己定义一个正则来判断那个地址去测试。
 
(3.)测试GET参数,POST参数,HTTP Cookie参数,HTTP User-Agent头和HTTP Referer头来确认是否有SQL注入,它也可以指定用逗号分隔的列表的具体参数来测试。

(4.)可以设定HTTP(S)请求的并发数,来提高盲注时的效率。
 
(5.)支持Basic,digest,NTLM ,CA身份验证
 
(6.)限速:最大并发、延迟发送
 
(7.)数据库版本、用户、权限、hash枚举和字典、暴力表列名称
 
(8.)文件上传下载、UDF、启动并执行存储过程、操作系统命令执行、访问windows注册表
 
(9.)与w3af、metasploit集成结合使用,基于数据库服务进程提权和上传执行后门。
 
 
 
二、sqlmap的安装和升级

直接在https://github.com/sqlmapproject/sqlmap下载
apt-get instal git
git clone https://github.com/sqlmapproject/sqlmap.git sqlmap-dev
 
升级
sqlmap –update  在线
git pull  离线
 
 
三、sqlmap请求
get方法
对于get的请求,比较简单,直接指定目标
-d: 直接连接数据库 (-d “mysql://user:passward@地址:端口/数据库名称”)
-u:指定url  (?id=1)
-m:将多个url保存成文件,传给sqlmap (sqlmap -m list.txt)
-r:将http头信息保存到文件,交给sqlmap
-g:google搜索出来的结果 (-g “inurl:\”.php?id=1\””)\”只是将双引号内的”特殊字符进行转义
-p :只想检查的变量
-f :指纹
–users:数据库帐号
–banner:数据库信息
–dbs:有哪些数据库
-a:all
get请求应该是大家所熟悉的,sqlmap – u直接加URL,参数就可以了。
 
 
post方法
post和get的区别,在之前的http详解中也详细的列了表单解释,直接明显的区别,可以查看有没有将我们输入的值放入URL中。
下面介绍几种对于post请求的sqlmap注入。

1.使用http请求文件
可以用burpsuite抓包并复制到txt文件(注意请用gedit编辑器,vim会因为格式问题报错)

1 sqlmap -r 1.txt

2.使用burpsuite log文件 (勾选上options中的Misc中的proxy)

1 sqlmap -l log.txt

3.HTTPS
sqlmap同时也支持https的sql注入,只需加入参数-force-ssl告诉sqlmap这是https服务即可。如
sqlmap -u https://192.168.1.1/a.php?id=1″ -force-ssl  (默认不是443,在后加其端口)
 

三、 HTTP数据
1、数据段: -data
  get/post都适用
对于post还可以使用链接并将post抓取的源代码用–data,并输入抓取的源代码
sqlmap -u http://”链接” –data=”post请求抓取的源代码” –dbs,常用于post请求。

这里用于抓取源代码的工具是火狐的插件,firebug。这个插件的功能非常强大。

2、cookie头  
–cookie
web应用基于cookie的身份验证,对于post请求,可以指定cookie
sqlmap -u “url” –cookie=”…” –level 2 –dbs
需要注意的是,当level默认为1的时候,默认不扫cookie的内容,必须是level大于等于2才能扫cookie里的内容
sqlmap -u “http://www.test.com”  –cookie=”CNZZDATA3568186=cnzz_eid%3D1227930120-1395711655-%26ntime%3D1395799625%26cnzz_a%3D1%26sin%3Dnone%26ltime%3D1395799604656%26rtime%3D1; CNZZDATA3834609=cnzz_eid%3D144071239-1395711655-%26ntime%3D1395799624%26cnzz_a” -p ”CNZZDATA3834609“ –data “”  –level 2

当需要对cookie注入的时候,必须使用–cookie选项,–data “” 因为post的数据长度为0,但是又想使用post方法进行注入,则使用–data “”,使用–data选项后,sqlmap自动使用post方法,sqlmap不支持使用–method指定http请求方法

获取cookie同样可以使用firebug插件。

3、其他的http头
–user-agent http头会携带一个值,就是user-agent,表示访问的浏览器的信息,我们可以手动指定伪造一个。
–random-agent 随机产生user-agent头,也不是随机,是从/usr/share/sqlmap/txt/user-agents.txt,收集了大量的浏览器信息
sqlmap -u “…” –cookie=”…” –level 2  –random-agent –dbs
–user-agent=”aaaaa”
sqlmap 检查uesr-agent中的注入点,  lever>=3才会去检查user-agent头是否存在注入漏洞

4、host头
Host请求报头域主要用于指定被请求资源的Internet主机和端口号,它通常从HTTP URL中提取出来的

–host  level=5,host存在注入的漏洞情况比较少,同时也不建议把级别设置成5
–host=”aaaaaa”,每次HOST请求时都会变成一串a
 

5、referer头 
原来所处的页面的url,可通过–referer来指定
–referer  level>=3,才会对referer头进行检测
如:–referer=“aaaa”
 
 
6、额外的自定义的header
–headers
每个头单独一行,可以使用\n来换行(名称区分大小写)

四、身份验证
1、基于HTTP协议的身份验证

Basic    基本身份验证
Digest   摘要式身份认证
NTLM     NTLM身份验证(windows)
 
sqlmap -u “…”  –auth-type Basic –auth-cred “user:pass” ,指明验证类型为Basic,并说明用户名和密码
 


 
2、基于客户端证书(比较少见,在以前的网银中比较常见) 
当Web服务器需要客户端证书进行身份验证时,需要提供两个文件:key_file,cert_file。
key_file是格式为PEM文件,包含着你的私钥,cert_file是格式为PEM的连接文件。
–auth-cert(官方文档)  /auth-file(sqlmap中-hh所显示的参数)
   
如:–auth-file=”ca.PEM”,含有私钥的PEM格式证书文件或PEM格式的证书链文件
 
 
 
3、http(s)代理
主动请求时会被记录,被发现屏蔽,这时我们需要个代理,就用到了–proxy参数了。
–proxy=”http://127.0.0.1:8087″
–proxy-cred=”name:pass”  需做身份验证时
–ignore-proxy 忽略系统级代理,通常用于扫描本地网络目标(若在操作系统设置了代理,后续的一切工作都经过代理)
 
 
五、sqlmap使用技巧
1、HTTP请求延迟
发送量过大的话,会引起waf等发现,
–delay  每次http(s)请求之间延迟时间,浮点数,单位为妙,默认无延迟,输入此参数,你会发现每个请求都会延迟3秒,当然数据库还是可以爆出来的。

2、 设置请求超时时间
若客户端一直未收到服务器返回的值,就一直等着,所以需要个请求超时时间
–timeout  请求超时时间,浮点数,默认30秒

 
3、设定重试时间
–retries  http(s)连接超时重传次数,默认3次
 

4、设定随记改变的参数值
–randomize
长度、类型与原始值保持一致的前提下,值当每次请求随记取值的参数名
sqlmap -u http://1.1.1.1/a.php?id=1 –randomize=”id”
 
 
 
5、利用正则表达式过滤目标网址
–scope  使用brup抓取的日志文件,但 日志文件比较大,你只想检测日志中的一个站点或者某一个特征是否存在sql注入
过滤 日志内容,通过正则表达式筛选扫描对象
sqlmap -l burp.lpg –scope=”(www)?.baidu.(com|net|org)”
sqlmap -l burp.lpg –scope=”(19)?.168.20.(1|10|100)”
 
 
 
6、避免过多的错误请求被屏蔽
有的web应用程序会在你多次访问错误的请求时屏蔽掉你以后的所有请求,这样在sqlmap进行探测或者注入的时候可能造成错误请求而触发这个策略,导致以后无法进行。常见情况是在检测盲注阶段会产生大量失败请求,当产生大量错误请求后,服务器端可能因此销毁session
 绕过这个策略有两种方式:
1、–safe-url:提供一个安全不错误的连接,每隔一段时间都会去访问一下。
2、–safe-freq:提供一个安全不错误的连接,每次测试请求之后都会再访问一边安全连接。
 
 
 
7、关掉URL参数值编码
–skip-urlencode 默认get方法会对传输内容进行编码,某些web服务器不遵循RFC标准编码,使用原始字符提交数据
 
 
8、每次请求时候执行自定义的python代码
–eval每次请求前执行指定的python代码
在有些时候,需要根据某个参数的变化,而修改另个一参数,才能形成正常的请求,这时可以用–eval参数在每次请求时根据所写python代码做完修改后请求。
每次请求更改或增加新的参数值(时间依赖,其他参数值依赖)
sqlmap -u http://1.1.1.1/a.php?id=1&hash=…” –eval=”
python sqlmap.py -u “http://www.target.com/vuln.php?id=1&hash=c4ca4238a0b923820dcc509a6f
 
 
六、OPTIMIZATION优化性能
-o  开启三个性能参数(除–threads)

 
–predict-output  
根据检测方法,比对返回值和统计表内容,不断缩小检测范围,提高检测效率
版本名、用户名、密码、Prervileges、role、数据库名称、表名、列名
与–threads参数不兼容
统计表路径:/usr/share/sqlmap/txt/common-outputs.txt
 
–keep-alive  使用http(s)长连接,性能好,与–proxy参数不兼容
 
–null-conection
只获取响应页面的大小值,而非页面具体内容能够
通常用于盲注判断真/假,降低网络带宽消耗
与–text-only参数不兼容(基于页面内容的比较判断真/假)
 
–threads=THREADS
最大并发线程
盲注时每个线程获取一个字符(7此请求),获取完成后线程结束
默认为1,建议不要超过10,否则可能影响站点可用性
与–predict-output参数不兼容

七、注入
1、指定测试的参数
-P  
sqlmap默认测试所有的GET和POST参数,当–level的值大于等于2的时候也会测试HTTP Cookie头的值,当大于等于3的时候也会测试User-Agent和HTTP Referer头的值。但是你可以手动用-p参数设置想要测试的参数。例如: -p “id,user-anget”
指定扫描的参数,也可指定变量名称,使–level失效
 

 
2、
排除测试的参数
–skip  
当你使用–level的值很大但是有个别参数不想测试的时候可以使用–skip参数。排错指定的扫描参数,不指定的默认会对全部扫描,然后根据level级别对http头扫描
如:–level=5 –skip=”id,uesr-agent”
 

 
3、指定数据库
默认情况系sqlmap会自动的探测web应用后端的数据库是什么,但是你如果已经知道的目标是什么数据库了,可以使用–dbms指定数据库节省时间了,提高工作效率了
 
–dbms  不仅可以指定数据库类型,还可以指定数据库版本
–dbms=”mysql”

如:Mysql<5.0>
Oracle<11i>
Microsoft SQL Server <2005>
PostgreSQL
Microsoft Access
SQLite
Firebird
Sybase
SAP MaxDB
DB2

4、指定数据库服务器系统
–os
默认情况下sqlmap会自动的探测数据库服务器系统,支持的系统有:Linux、Windows。
Linux
Windows
 
 
 
5、指定无效的大数字
–invalid-bignum  /–invalid-logical
默认情况下sqlmap使用负值使参数失效 id=13->id=-13
bignum使用大数使参数值失效 id=999999
 
 
6、指定无效的逻辑
logical使用布尔判断使值失效 id=3 and 1=2
 
 
 
7、–no-cast
sqlmap在提取数据库数据时,sqlmap默认将所有结果转换为字符串,并且空格替换NULL结果
老版本mysql数据库需要开启此开关
 
8、–no-escape  
不逃逸,关闭使用char替换字符串功能
出于混淆和避免出错的目的,payload中用单引号界定字符串时,sqlmap使用char()编码逃避的方法替换字符串
select ‘foo’ ->select char(102)+char(111)+char(111)
 
 
 
9、注入payload
–prefix /–sufix  在有些测试时,在构造pylaold需要构造闭合语句,才能实现最后注入的成功
–prefix是加前缀
–sufix加后缀
eg:
sqlmap -u “http://192.168.1.1/a.php?id=1″ –prefix”‘)” –suffix “and (‘1’=’1”
 
 
10、脚本
–tamper
混淆脚本,用于绕过应用层过滤、IPS、WAF
dpkg -L sqlmap | grep  tamper 查看脚本
 
sqlmap除了使用CHAR()函数来防止出现单引号之外没有对注入的数据修改,你可以使用–tamper参数对数据做修改来绕过WAF等设备。
 
–tamper=”脚本名称” 多个脚本用逗号隔开
 

11、探测等级
共有五个等级,默认为1,sqlmap使用的payload可以在/usr/share/sqlmap/xml/payloads中看到,你也可以根据相应的格式添加自己的payload。

这个参数不仅影响使用哪些payload同时也会影响测试的注入点,GET和POST的数据都会测试,HTTP Cookie在level为2的时候就会测试,HTTP User-Agent/Referer头在level为3的时候就会测试。
–level
 
 
12、风险等级
共有四个风险等级,默认是1会测试大部分的测试语句,2会增加基于事件的测试语句,3会增加OR语句的SQL注入测试。
在有些时候,例如在UPDATE的语句中,注入一个OR的测试语句,可能导致更新的整个表,可能造成很大的风险。
测试的语句同样可以在xml/payloads.xml中找到,你也可以自行添加payload。
–risk
1-4 (默认1无害)
risk升高可造成数据被篡改等风险 (update)
–string
–not-string
–regexp
–code
–text-only
–titles
 
 
八、注入技术
1、检测类型
检测存在sql注入的技术类型,默认会测试所有的方式。
B:Boolean-based-blind  (布尔型型注入)
E:Error-based   (报错型注入)
U:Union query-based  (联合注入)
S:Starked queries   (通过sqlmap读取文件系统、操作系统、注册表必须 使用该参数,可多语句查询注入)
T:Time-based blind  (基于时间延迟注入)
 
 
 
2、设定延迟注入的时间
–time-sec
基于时间的注入检测响应延迟时间(默认5秒)
 
 
3、设定UNION查询字段数
–union-cols
默认联合查询1-10列,随-level增加最多支持50列
如–time-sec 6-9,测试6-9个字段数
 

4、设定union查询使用的字符
-union-char
联合查询默认使用NULL,极端情况下NUL可能失败,此时可以手动指定数值 
如–

此内容查看价格为8龙纹银币,请先

原文链接:https://duduziy.com/415.html,转载请注明出处。 郑重声明: 本站所有内容仅供大家参考、学习,不存在任何商业目的与商业用途。 若您需要商业运营或用于其他商业活动,请您购买正版授权并合法使用。 我们不承担任何技术及版权问题,且不对任何资源负法律责任。 如遇到资源无法下载,请点击这里失效报错。失效报错提交后记得查看你的留言信息,24小时之内反馈信息。 如有侵犯您的版权,请给我们私信,我们会尽快处理,并诚恳的向你道歉!

0

评论0

显示验证码
没有账号?注册  忘记密码?