深圳网站建设哪个,使用dw设计个人简历网页模板,semir,中国建筑100强企业名单之前有在技能树中学过文件上传#xff0c;正好借这次进行一个整合#xff1a;
技能树中所包含的题目类型有
无限制绕过 1.上传一句话木马 2.链接中国蚁剑 前端验证 1.会发现这个网站不让提交php#xff0c;改后缀为jpg格式#xff0c;再用burp抓包 2.在用中国蚁剑连接 .…之前有在技能树中学过文件上传正好借这次进行一个整合
技能树中所包含的题目类型有
无限制绕过 1.上传一句话木马 2.链接中国蚁剑 前端验证 1.会发现这个网站不让提交php改后缀为jpg格式再用burp抓包 2.在用中国蚁剑连接 .htaccess上传
1.这里先了解一下什么是.htacces文件
.htaccess文件(或者分布式配置文件提供了针对目录改变配置的方法 即在一个特定的文档目录中放置一个包含一个或多个指令的文件 以作用于此目录及其所有子目录。作为用户所能使用的命令受到限制。
概述来说htaccess文件是Apache服务器中的一个配置文件它负责相关目录下的网页配置。通过htaccess文件可以帮我们实现网页301重定向、自定义404错误页面、改变文件扩展名、允许/阻止特定的用户或者目录的访问、禁止目录列表、配置默认文档等功能。
简单来说就是我上传了一个.htaccess文件到服务器那么服务器之后就会将特定格式的文件以php格式解析。
这里先写一个.htaaccess文件
方法一
SetHandler application/x-httpd-php //所有的文件当做php文件来解析
方法二
AddType application/x-httpd-php .png //.png文件当作php文件解析
这里使用方法二 这里修改名字为.htaccess。直接这个就好不要加前缀。 就是直接上传.htaccess,然后上传jpg文件再用蚁剑连接得到flag.
MIME绕过
1.先了解一下什么是MIME
MIME类型校验就是我们在上传文件到服务端的时候服务端会对客户端也就是我们上传的文件的Content-Type类型进行检测如果是白名单所允许的则可以正常上传否则上传失败。
2.开始解题先上传一个小马然后用bp抓包
3.这里直接修改Content-Type为image/jpeg
4.点击forward发现上传成功
5.使用蚁剑来找flag
00截断
1.这里先写两个小马一个小马是jpg图片格式的一个小马是php格式的。先上传jpg小马进行抓包。 这里我的图片小马是222.jpgPHP小马是111.php将111.php写到post请求中并进行%00截断然后进行forward
2.然后使用中国蚁剑来获得flag
双写后缀
1.这里直接上传一个php小马进行抓包。
2.然后在文件名上写上pph点击forward
3.然后用蚁剑来找flag 文件头检查
1.这里先用自己电脑自带的画图软件画一张画直接上传抓包。上传后在抓的包里写入一句话木马。
这里修改后缀为php然后在Content-type改为 image/png
2.用蚁剑连接
延伸补充
绕过后端黑名单检测
假如后端代码采用黑名单检测那么开发人员往往会预先设置一些后缀名作为黑名单不允许某些后缀名的文件上传那么此时就需要去尝试各种不同的绕过方法了。 一换一个后缀名绕过黑名单检测
假设我们要上传的文件为php文件那么就要去尝试看看什么样的后缀名会被当成php文件解析。实际上除了后缀为.php的文件会被当成php文件解析 还有phtml php3 php4 php5之类的后缀也会可以都去尝试一下看看能否上传成功。 对于不同的文件可以采用不同的后缀去测试虽然概率很小但万一成功了呢 二用.htaccess文件巧妙绕过黑名单
假如开发者把后端代码写的很严格甚至后缀名的大小写也写进了黑名单那么就可以尝试用.htaccess文件来绕过了。 .htaccess全称是Hypertext Access(超文本入口)。htaccess文件也被称为分布式配置文件是Apache特有的的针对目录改变配置的方法。通过在一个特定的文档目录中放置一个包含一个或多个指令的文件 以作用于此目录及其所有子目录。该文件可以针对不同的目录采用不同的策略。 一般后端的黑名单不会过滤把.htaccess后缀写进去那么我们可以先上传一个.htaccess文件上去提前设置好让它把.jpg文件当做php文件来解析这样后续只需要上传.jpg文件就可以了。 .htaccess文件的内容如下 AddType application/x-httpd-php .jpg 这个指令代表着.jpg文件会当做php文件来解析。 很多windows操作系统是禁止将文件名设置为空的但是我们可以用cmd命令来实现。首先新建一个名为1.txt的文件然后输入上述代码。接着在该文件夹下打开cmd窗口输入 ren 1.txt .htaccess 三用大小写绕过后缀名检测
对于那种老版本的WEB容器是区分大小写的所以这种方法只对WEB容器非常古老的版本有效。原理很简单在解析的时候windows的文件和文件夹都是不区分大小写的而WEB容器区分大小写因此上传的时候就有可能绕过该WEB容器从而实现绕过后缀名检测。 四文件后缀加空格或点绕过后缀名检测
在文件名后面留一个空格然后上传上去后空格会被自动的省略但是看源码可知道源码中黑名单中没有过滤空值那么php和php空格当然是不一样的。 注意windows会自动去除文件末尾的空格所以需要先上传正常的文件然后抓包在后缀名的地方加空格再放包就可以了。这里的空格改成点也是一样的。 五构造文件后缀绕过后缀名检测
这种情况下需要对目标检测方式的源代码有一定的了解要么了解目标网站的开发风格要么知道源代码是如何对后缀名进行处理的从而根据处理规则巧妙绕过后缀名的检测。来看下面一段代码
$deny_ext array(.php,.php5,.php4,.php3,.php2,.html,.htm,.phtml,.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);
$file_name trim($_FILES[upload_file][name]); //$_FILES[upload_file][name] //获取上传的文件名比如 1.jpg
$file_name deldot($file_name);//删除文件名末尾的点 1.jpg
$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)) {
if (move_uploaded_file($_FILES[upload_file][tmp_name], $UPLOAD_ADDR . / . $_FILES[upload_file][name])) {
$img_path $UPLOAD_ADDR . / . $file_name;
$is_upload true;
}
} else {$msg 此文件不允许上传;}根据以上代码假如输入的文件后缀名为1.php.空格.则处理过后会剩下1.php. 在windows中1.php.会自动变为1.php从而实现了绕过后缀名的检测。
六双写绕过后缀名检测
来看一段源代码
$file_name str_ireplace($deny_ext,, $file_name);这里的意思就是把检测到的危险字符替换为空php被替换为空那么假设上传的文件后缀名为pphphp被替换为空后就会变为php,从而实现了绕过。 七Windows文件流绕过后缀名检测
windows下硬盘格式主要有FAT16、FAT32、NTFS等。ADS(NTFS交换数据流)是NTFS磁盘格式的一个特性在NTFS文件系统下每个文件都可以存在多个数据流。通俗的理解就是其它文件可以“寄宿”在某个文件身上而在资源管理器中却只能看到宿主文件找不到寄宿文件。 我们先新建一个1.txt里面没有内容然后在当前文件夹打开cmd输入:
echo 1231.txt这表示将123写入1.txt 继续输入
echo 1231.txt:a.txt这样在1.txt中没有123并且该txt文件的大小没有变化。 那么如何访问刚才写入的文件呢 输入
notepad 1.txt:a.txt就可以看见刚才输入的123 如果要显示这个文件可以在cmd命令里输入
dir /r这种方式可以用来藏资料。但是还不是最好的方法 注意实际上在windows中 a.txt::$DATA就是默认不修改文件流的情况相当于a.txt。对于windows系统而言这两种写法没什么区别。但是对于后端的检测而言这两种写法完全不一样。所以生成一个正常的a.txt利用windows特性可在后缀名中加::$DATA绕过。注意上传成功以后要访问时就直接访问该文件不要再加::$DATA 注意只有windows可以这么操作。 绕过白名单检测 一%00截断和00截断
了解%00之前我们要先了解0x00。 00截断类似我们用对讲机或者电报通话时说完一句话会用over表示一句话说完了而电脑也需要一个截断的信号而这个信号就是00截断。 0x是一个十六进制表示方式声明这是十六进制数00实际上就是表示ascii码值为0有些函数在处理这个字符的时候会把这个字符当做结束符他们就读取到这里认为这一段结束了。 了解这个有什么用呢 在文件上传时如果遇到了白名单机制只允许上传jpg后缀的我们该怎么办JPG格式并不会被解析那么我们需要绕过上传过滤。 假如我写了1.php%00.jpg 传参之后有些过滤都是直接匹配字符串他强行匹配到了结尾是.jpg然后允许上传但是php的函数去执行的时候他读取到0x00认为结束了那么这个文件就变成了1.php从而实现绕过白名单。 %00实际上和00截断是一模一样的原理只不过%00是经过URL编码的%00解码后就是0x00截断的那个字符。 需要注意%00和00的区别只有GET传参会进行一次URL编码其他的传参方式不会所以只有GET传参能够识别这种%00的截断。
二绕过Content-Type检测
对于只允许指定Content-Type内容类型这种防护手段最简单的绕过方法是直接上传一个允许的文件类型再抓包修改后缀名。以上传jpg文件为例先上传该文件抓包修改后缀名为实际的后缀名.php由于上传的时候是jpg所以浏览器发送的数据包中Content-Type的类型默认为jpg那么此时发送的文件就可以绕过后端的检测。
三用图片木马绕过白名单检测
实际上不一定非得把上传php文件我们可以把木马藏在图片中直接上传到目标服务器。假如目标存在文件解析漏洞并且能够被我们访问到这样木马就可以生效了。 常用的图片木马是图马图的形式。因为很多网站会检测头部是否是JPG 尾部是否是JPG 检测渲染是否有问题。我们就可以把一句话木马藏在中间。这种马相对而言比较难被发现。 例如我们可以先保存一张小图片命名为1.jpg然后将一句话木马写到2.txt里接着打开命令行输入 copy 1.jpg/b 2.txt 3.jpg 这条命令可以把这两个文件合并合并后显示为3.jpg。有jpg的话需要加个/b
四用gif文件绕过二次渲染
假如目标对用户上传的图片进行二次渲染比如给图片重新截图、加水印之类的。最简单的绕过方法是直接上传gif文件去绕过前提是目标允许上传gif格式的图片。就是先把正常的gif图片上传上去再下载下来然后用文本编辑器打开在HEX编码的页面查看都有哪些乱码变化了一般在第四行开始可以加入一句话木马。
五利用条件竞争绕过白名单
条件竞争是一个需要拼运气的方法我建议除非实在是无计可施了不然不要采用这种方式因此频繁访问目标网站,ip容易被ban并且也容易引起网站管理员的注意毕竟渗透测试讲究润物细无声条件竞争动静有点大了属于比较冒险的做法。接下来我讲解一下条件竞争产生的原理及如何使用条件竞争。 竞争条件发生在多个线程同时访问同一个共享代码、变量、文件等没有进行锁操作或者同步操作的场景中。开发者在进行代码开发时常常倾向于认为代码会以线性的方式执行从而忽视服务器并发执行多个线程可能带来的冲突问题这就会导致一些意想不到的结果。 线程同步机制确保两个及以上的并发进程或线程不同时执行某些特定的程序段该程序段也被称为临界区critical section。如果没有处理好临界区则可能发生“竞争条件”问题。 简单理解两只哈士奇线程同时去抢一个丢出去的飞盘资源不知道到底哪只能抢到此处便形成了竞争。 一般而言我们上传文件上传了但是最后却因为过滤或者因为其他原因被删除了那么我们可以使用条件竞争来尝试上传。我们实际上是和unlink是和删除文件的函数进行竞争。假如我不断的上传发包然后我同时也不断的访问那个我们上传上去的文件的地址我们就开始和服务器的函数比手速了函数执行都是要时间的检测和删除也都需要时间由于我疯狂上传服务器来不及执行删除操作那个时间可能很短然后被我访问到了就可以执行PHP命令了那我不就比服务器手速更快了吗 上传文件的检测流程大体上分为两种 先检测检测合格然后上传类似检票进站 先上传上传后再检测把不合格的删除类似坐公交车先上车后买票 检测文件是需要时间的在检测的空档期如果能访问到该PHP代码就能够执行PHP指令。 所以条件竞争的核心思路是疯狂上传php文件然后疯狂访问这个文件由这个php去生成另外一个文件。由于检测代码只会删除你上传的文件并不会删除你生成的文件所以只要生成文件成功那么就算上传的文件被删了也没关系因为我们的目的已经达到了。 注意在使用条件竞争之前我们需要知道文件被上传到哪里去了否则这种方法是不能用的。 代码举例
?php $a ?php eval($_REQUEST[\a\])?;
file_put_contents(1.php,$a); ?
注意这里面的代码要写单引号否则会被当成代码解析而我们要的是把字符串写入文件中。