SQL Injection4(sqlmap)
前言
前面把手工注入算是简单的练习了一遍,这里来学习下sqlmap,感受下工具的强大。主要也是针对dvwa的sql注入和盲注用sqlmap再来一遍,然后试下文件的上传下载等功能。算是对sqlmap的一个入门吧。
参数
sqlmap的参数真的很多,下面这篇博客把所有sqlmap -hh的参数都进行了中文翻译,挺方便后面查阅的
超详细SQLMap使用攻略及技巧分享(里面用的sqlmap版本是1.1.8-8不过参数那些基本和现在1.3.2一样)
实战
我也不知道前面实验时做了什么,数据全被删了(没得恢复,idb文件都没了,reset也没用…这就是传说中的删库跑路???),这时候真的是docker大法好,停掉这个容器重新创建就好了…
下面就开始吧,实践出真知
Low
查找注入点
最简单加上-u 目标,就回车,看看效果
OK这里我们看到了302重定向,跳转到login.php,很好理解需要你重新登录了,因为没有cookie,所以这里把cookie带上,抓个包或者直接浏览器开发者工具来看一下cookie
其次我们在dvwa的日志中可以看到大量的"sqlmap/1.3.2#stable (http://sqlmap.org)",出于对他人的尊重和正确的养成我们把这里也改了吧…查看上面的文档可以看到是改user-agent
–user-agent=AGENT 默认情况下sqlmap的HTTP请求头中User-Agent值是:sqlmap/1.0-dev-xxxxxxx(http://sqlmap.org)可以使用–user-agent参数来修改,同时也可以使用–random-agent参数来随机的从./txt/user-agents.txt中获取。当–level参数设定为3或者3以上的时候,会尝试对User-Angent进行注入
ok,这次再回车,就很正常了,中途会不断询问,先不管了(看英文脑阔疼 里面会让你选择比如现在判断出数据库很可能是mysql,还要不要检测其它类型数据库;现在union注入很大可能不会起作用,还要不要进行union注入等等…)y跳过,然后就出现了下面的结果
我们可以看到成功的返回了服务器操作系统信息,web服务器信息,以及数据库信息(这时候我们登录dvwa后台看也不再看到"sqlmap/1.3.2#stable (http://sqlmap.org)"),然后日志信息(说到这个日志信息,下次对同一个网站用sqlmap它会先去查询这里面的日志)也如上面所说放到了对应的文件夹下
上面还有这些信息,基于布尔的盲注,基于报错,基于时间的盲注。这就是在告诉我们说它尝试了很多次确认前面这些注入都是可行,甚至还提供了payload给你看(但我这里为什么没有union(联合注入呢),我参考别人博客都是有的啊…)
到这里我们就能知道这个网站是存在注入漏洞的,(所有SQL注入第一步都应该是判断是否存在注入点)
对于判断是否存在注入,最简单就是 sqlmap -u ''url"
但正如上面所见我们加了–cockie这个参数(当页面需要cookie时就必须带上,比如上面需要验证登录,没有cookie就会跳转到登陆页面)
下面再介绍几个可能要用到的参数
–user-agent 前面已经介绍
–batch 前面注入是自己瞎输了一堆y ,这里这个参数带给我们拯救,它会使用默认配置,就不会询问用户输入了
–data 这个是post请求会用到,后面携带body的内容,后面medium会用到
–level 这个默认是1,有5个级别,数字越大级别越高,检查注入点的地方就越多,当没有发现注入点的时候可以增加level级别来再进行尝试
–risk 共有四个风险等级,默认是1会测试大部分的测试语句,2会增加基于事件的测试语句,3会增加OR语句的SQL注入测试。在有些时候,例如在UPDATE的语句中,注入一个OR的测试语句,可能导致更新的整个表,可能造成很大的风险。测试的语句可以在xml/payloads.xml中找到,你也可以自行添加payload。
–headers 添加http头部
–referer 伪造HTTP中的referer,当–level参数设定为3或者3以上的时候会尝试对referer注入
-v 默认1 就是sqlmap运行时会显示的那些东西,值越大看到的东西越多
0:只显示Python的tracebacks信息、错误信息[ERROR]和关键信息[CRITICAL];
1:同时显示普通信息[INFO]和警告信息[WARNING];
2:同时显示调试信息[DEBUG];
3:同时显示注入使用的攻击荷载;
4:同时显示HTTP请求;
5:同时显示HTTP响应头;
6:同时显示HTTP响应体。
–proxy “http://127.0.0.0:8080” 走代理,可结合brup
–thread 多线程(–thread 3)
-r 后面接一个文本地址,sqlmap可以从里面获取http请求,这样前面的–user-agent–data–headers —referer等等就不用再写了,写到这个文本中就行了
–file-read 相当于load_file
–file-write --file-dest 向数据库中上传文件,前面是本地文件地址后面是上传到的地址要带文件名,相当于前面说过的select into outfile
–sql-query 要执行的SQL语句,这个可以带上你想要执行的SQL语句
–technique 指定注入类型U/B/T/S 指定注入点类型 (union/boolean/time/stack)如果只想用联合注入就带上U
–tamper 使用给定的脚本篡改注入数据,这个可以用py脚本来改写数据
–os-shell 执行操作系统命令
–os-cmd 交互式的操作系统的shell
注入
下面继续知道了存在注入点,下面当然是开始注入啊
–dbs 枚举数据库管理系统的数据库
–table 枚举表名 -D 指定数据库(不指定就会枚举所有数据库的表)
可以看到枚举dvwa数据库得到了两张表guestbook和users
–columns 枚举表的列 -D 指定数据库 -T 指定表
这样我们就成功得到了users的表结构
–dump -D 指定数据库 -T 指定表 -C 指定列"xx,xx,xx"
这里我只指定了user_id,user,password三列,可以看到信息就成功的列出来,这个过程中会问你要不要存储哈市值做进一步处理,要不要用字典来尝试破解,用什么字典来破解。这里用默认的字典可以看到成功的破解出来了。瞬间感觉比手工注入快了好多!
Medium
查找注入点
medium难度我们可以看到是以post的形式提交数据,我门先抓包,拿到post中的body和cookie
sqlmap -u "http://192.168.2.205:8331/vulnerabilities/sqli/#" --data "id=1&Submit=SubmitA" --cookie "PHPSESSID=5vov1t1oupha6le35dk7chgbg7; security=medium" --user-agent " Mozilla/5.0 (X11; Linux x86_64; rv:60.0) Gecko/20100101 Firefox/60.0"
这次我们来看下它让我门选择的一些东西到底是什么
这在我们说对方用的数据库似乎是mysql要不要跳过其它类型数据的检查,emmm…这里我们知道是mysql就跳过吧
这是在文下面的测试都用level1等级和risk1等级行不,先这样吧,不行我们再调整吧
这是说发现了post中的id是可注入的,问还需不需要跳过测试别的,当然不跳过喽(在这里我觉得跳过也没什么)但我觉得实战中信息是越多越好吧
OK,成功发现是可以注入的
注入
知道了可以注入当然就来注入喽
先获取数据库信息
上面的命令加上–dbs
然后获取dvwa中数据表的信息
加上–tables -D “dvwa”
得到有两张表,如上图所示
我们再来获取users表中的字段信息
加上–columns -D “dvwa” -T “users”
得到上图中比较详细的表中字段信息
这时候我们来获取表的所有字段信息,就不用-C来指定列了
–dump -D “dvwa” -T “users”
这是问要不要将这些hash值存放在一个临时文件中用其它工具来进一步处理吗,yes
问你是否想用字典来进行一个工具,yes
这里让你选择用哪一个字典来攻击,1是默认的字典 2.是用户自己选择 3.带字典列表的文件(就是你有多个字典,你提供一个这些字典的索引)选1
这里问是否使用常用的密码后缀,不用的话会很慢,我们看下有多慢吗,选N
是比前面用yes秒出要慢
可以看到,我们成功获得user表的所有信息,hash值也全部查了出来,medium成功
High
High级别感觉是针对sqlmap做的设置,它对手工注入其实没什么影响,但对于sqlmap这种提交页面和结果页面会没法注入
按照medium的方法来会显示没有可注入的地方,这可难到了我胖虎…
不过这里感觉和hydra去爆破输入和输出不在同一页面有点像
sqlmap提供了一个 --second-order=S… URL搜索产生的结果页面
这可以指定返回结果的页面
sqlmap -u "http://192.168.2.205:8331/vulnerabilities/sqli/session-input.php#" --data "id=%EF%BC%91&Submit=SubmitA" --cookie "PHPSESSID=5vov1t1oupha6le35dk7chgbg7; security=high" --second-order="http://192.168.2.205:8331/vulnerabilities/sqli/" --user-agent " Mozilla/5.0 (X11; Linux x86_64; rv:60.0) Gecko/20100101 Firefox/60.0"
结果一执行就报错,好吧新版本把–second-order换成了–second-url用法还是一样
改一下,再来
很开心成功了
作为菜鸡的我这里当然是参考了别人的博客
DVWA之SQL Injection–SQLMap&Fiddler测试(High)(这个写的很详细)
SQLMAP注入DVWA high level(这个过程图很棒)
后面就和上面一样了
–dbs --tables --columns --dump
上面是结果图,只选择了两列
下面来试下盲注
Low
这和上面的low级别没什么差别,可以看到很容易的发现了注入点
下面操作操作就和上面一样了(亲身试验没问题,但感觉速度比上面要慢)
Medium
这里来用一下-r参数,用了之后发现…真香…
截个包把包数据放进一个文件里,然后命令就变得如此精简了
很轻松发现了注入点,后面就和上面一样了(亲测没问题)
High
有了前面的经验,–second-url这里简直就毫无难度嘛,重新抓个包,来做http包,然后带上–second-url
简直不要太轻松…成功发现注入点(每次注入前记着删日志),这里为什么level1可行了,这里虽然用到了cookie但注入点任然是body里的id。但这里依旧发现了基于时间的注入…我记得high级别是加入了sleep函数来影响基于时间的注入…emmm…
然后盲注明显比上面的SQL注入慢,我们在盲注时也可以看到它是一个字符一个字符往外出的,这与我们手工注入时一样,要一个字符一个字符的去猜解。
这里我们也可以看到和我们手工注入的步骤是一样的,就像上面猜解字段,先猜解有多少个字段,然后从第一个字段其猜解每个字段的长度,最后猜解每个字符具体是什么,不过我们手工注入时没有猜解字段类型这一步骤,可以看到sqlmap还是相当强大的
这里后面的步骤也和前面一样,亲测可行。
dvwa后台一看
我觉得实际用的时候还是找个代理池吧…我觉得这么密集的查询还是很容易被发现的…
用–file-read和–file-write --file-dest读取下载文件都失败了…,给的提示是没有权限…
好的,作为菜鸡的我为了感受下黑阔大佬的日常,我决定再次登录dvwa后台给dvwa的mysql用户提权…我觉得这应该算社工提权(不要当真)…
我们可以看到我们的权限得到的质的飞跃…
看我们可以看到上图中,我们成功的下载了php.ini文件(不想下vim了,就随便读了一个文件),提示我们下到了日志文件夹那边,下面进去打开文件,没有任何问题
下面我们给html问价夹再提个权来感受下上传文件
结果失败了还是权限不够…
什么鬼…我手工试了下可以啊…,一直报下面的错,有毒…
–sql-shell成功了,但返回的shell不怎么会用啊,感觉和平常的mysqlshell不太一样了…
在别人博客上看到的两条命令执行成功了,但正常的sql命令好像都不行呢…
–os-shell --os-cmd
这两个也没试成功…一直没搞定啊,数据库用户的权限提升了,文件夹的权限也到777了,docker也重启了,手工也成功了…但为什么这里一直不行啊…有没有大佬指导下…(暂时先放一下吧,后面成功了再来补坑…)
–tamper 这个主要是后面带的py文件要试情况来定怎么修改。暂时没什么环境来试用,后面用到了再和上面一起补充吧
如何使用SQLMap绕过WAF
SqlMap 1.2.7.20 Tamper详解及使用指南
参考
- 超详细SQLMap使用攻略及技巧分享
- Sqlmap中文手册
- DVWA之SQL Injection–SQLMap&Fiddler测试(High)
- SQLMAP注入DVWA high level