网站地图    收藏   

主页 > 后端 > 网站安全 >

从分析代码学习挖掘漏洞 - 网站安全 - 自学php

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

[导读] 作者注:近日看到论坛上有人发了个全能大牛的文章,颇有感慨。其实所谓的全能,是来自对基础知识的扎实根基。本文虽谈不上全能,也并非什么大做,仅为证明只要根基扎实,你也...

作者注:
近日看到论坛上有人发了个“全能大牛”的文章,颇有感慨。其实所谓的“全能”,是来自对基础知识的扎实根基。本文虽谈不上“全能”,也并非什么大做,仅为证明只要根基扎实,你也可以“全能”渗透。
本文特意选用某网站中的某一服务器上Web站点作为讲解实例,详细讲述如何根据一个小漏洞逐步分析,扩大范围完成进一步渗透的。
本文仅供研究和学习,不得用于非法用途,否则后果自负。
出于隐私保护的目的,文章所有截图和url经过处理。

相信很多人已经厌倦了这个网络里弥漫的注入,弱口令,万能密码。那么有没有遇到过注入找不到后台,数据库为root或者sa账户却无法写入webshell,得到了后台却拿不到webshell,拿到了webshell却无法提权?????
本文所阐述的例子是:
一台Linux服务器是用了Apache 2.2.10架设了php的网站,数据库为MySQL,网站使用了root账户,但是网站没有后台,也没有phpMyAdmin,服务器中存在一个注入点。因为gpc为on,所以无法写入webshell,但是可以读取服务器上一些已知路径的文件。
那么我们就通过本文来讲一下,如何通过这个注入点,进行下一步渗透的。
我们先来简单描述一下注入点(如果不懂php+MySQL的注入,请参见《各色SQL注入文章汇总》)
注入点:
 
*.2cto.com/vote.php?id=3
 
这个注入点根据存在的文件名就知道,应该是一个投票页面,因为union只有一个字段,所以直接
 
*.2cto.com/vote.php?id=3+union+select+load_file(0x2f6574632f706173737764)+from+mysql.user
 
就能读到文件了。根据错误回显,得到网站路径为/usr/www。因为gpc设置on,所以
 
union select 一句话的hex into outfile '/usr/www/可写目录/webshell.php'
 
这样是得不到webshell的,查到MySQL.user中设置的host为%,但是这台服务器对外网实际并未开放3306端口,也无法外联。
那么思路是什么呢?
我们来试着读取网站文件的源码来查找一些其他的漏洞。
 
=========================正文开始================================
 
我们首先来读取一下/usr/www/vote.php这个存在注入的文件的代码(节选,有删改):
 
require ('xajax/xajax.inc.php');
$link=mysql_connect("localhost","root","*******") or die ('数据库连接失败:'.mysql_error());
$select=mysql_select_db("vote", $link);
$SID=$_GET['sid'];
$typeId=$_GET['typeid'];
/*这是第1个函数,显示投票结果*/
function shownum($SID,$typeId){//点击按钮的返回值
$sql = "select numUp from zhendang where SID = ".$SID." and typeId=".$typeId." ";
$info=mysql_query($sql);
$it=mysql_fetch_array($info);
return $it['0'];
}
/*这是第2个函数,编者已做注释,是投票计数函数*/
function updatemysql($SID,$typeId){//点击按钮
$sqladd="update zhendang set numUp=numUp+1 where SID = ".$SID." and typeId=".$typeId." ";
mysql_query($sqladd);
}
 
唯一能看到的就是select一个字段数的注入。这里似乎能够利用的可能性只有注入中的load_file()。
当然了,思路不能只局限在vote.php一个页面,因为要挖漏洞嘛,就一定要深。我读了很多php文件,都没有找到eval()函数,或者是assert()又或者是exec()这样的凡是能造成安全问题的函数。
不过有一个文件引起了我的注意,有一个information.php的文件,看一下文件的代码是哪里引起了我的注意(节选代码,有删减)
 
if($upload_pic!=""){
/*下面的#注释都是由编写者添加,有调试代码有功能注释*/
$allowed_types=array('jpg','gif','png');
#正则表达式匹配出上传文件的扩展名
preg_match('|\.(\w+)$|', $com_pic,$ext);
#print_r($ext);
#转化成小写
$ext = strtolower($ext[1]);
#判断是否在被允许的扩展名里
if(!in_array($ext, $allowed_types)){
$objResponse->addAlert('不被允许的文件类型') ;
return $objResponse; www.2cto.com
}
}
 
这里有一个函数用于检查上传文件的后缀名。既然有检查功能,想必是会有上传功能的,虽然有后缀名检查,但是我们还是看看为好。
information.php文件中的上传功能用浏览器打开后并没有发现,估计是要注册以后登陆才能用的。
那么再看看它的源码:
 
 
 
 
看来这个上传以后的文件是传给form.php的,而information.php只处理上传文件的后缀名检查。那么我们再看看form.php的代码(节选,有删改):
include("inc.php");
$user=$_POST['user'];
$area=$_POST['area'];
$type=$_POST['type'];
$title=$_POST['title'];
$context=$_POST['context'];
$pic=$HTTP_POST_FILES['pic'];
//echo $pic[size];
if($title==""){echo "alert('警告!')";exit;}
if($context==""){echo "alert('警告!')";exit;}
if(!$pic['name']==""){
//....略
else {
$sql="insert into plaint(user,area,type,title,content,time) values ('".$user."','".$area."','".$type."','".$title."','".$context."','".date("Y-m-d H:i:s")."')";
$link=mysql_connect("localhost","root","*******")or die("数据库异常");
$select=mysql_select_db("datab", $link);
@mysql_query($sql);
@mysql_close();
//...略
 
粗略的看了一下,inc.php当中居然没有session检查的相关,也就是说,任何人都可以POST数据到form.php
那么我们就根据页面代码构造一个本地POST的html
关于构造本地html文件POST数据,可以参考一下这篇文章:《POST表单与上传突破JS后缀名检查分析》

作者 YoCo Smart 摘自:Silic Group Hacker Army [BlackBap.Org]

自学PHP网专注网站建设学习,PHP程序学习,平面设计学习,以及操作系统学习

京ICP备14009008号-1@版权所有www.zixuephp.com

网站声明:本站所有视频,教程都由网友上传,站长收集和分享给大家学习使用,如由牵扯版权问题请联系站长邮箱904561283@qq.com

添加评论